aboutsummaryrefslogtreecommitdiff
path: root/include/som/internal.h
blob: f4b37ce1854fceb1979484d27b8f65f45609ee51 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
/* SOM internal definitions for BFD.
   Copyright (C) 2010-2022 Free Software Foundation, Inc.
   Contributed by Tristan Gingold <gingold@adacore.com>, AdaCore.

   This file is part of BFD, the Binary File Descriptor library.

   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 3 of the License, or
   (at your option) any later version.

   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.

   You should have received a copy of the GNU General Public License
   along with this program; if not, write to the Free Software Foundation,
   Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.  */

#ifndef _SOM_INTERNAL_H
#define _SOM_INTERNAL_H

struct som_clock
{
  unsigned int secs;
  unsigned int nanosecs;
};

struct som_header
{
  unsigned short system_id;
  unsigned short a_magic;
  unsigned int version_id;
  struct som_clock file_time;
  unsigned int entry_space;
  unsigned int entry_subspace;
  unsigned int entry_offset;
  unsigned int aux_header_location;
  unsigned int aux_header_size;
  unsigned int som_length;
  unsigned int presumed_dp;
  unsigned int space_location;
  unsigned int space_total;
  unsigned int subspace_location;
  unsigned int subspace_total;
  unsigned int loader_fixup_location;
  unsigned int loader_fixup_total;
  unsigned int space_strings_location;
  unsigned int space_strings_size;
  unsigned int init_array_location;
  unsigned int init_array_total;
  unsigned int compiler_location;
  unsigned int compiler_total;
  unsigned int symbol_location;
  unsigned int symbol_total;
  unsigned int fixup_request_location;
  unsigned int fixup_request_total;
  unsigned int symbol_strings_location;
  unsigned int symbol_strings_size;
  unsigned int unloadable_sp_location;
  unsigned int unloadable_sp_size;
  unsigned int checksum;
};

struct som_aux_id
{
  unsigned int mandatory : 1;
  unsigned int copy : 1;
  unsigned int append : 1;
  unsigned int ignore : 1;
  unsigned int reserved : 12;

  /* Header type.  */
  unsigned int type : 16;

  /* Length of the header in bytes, without the two word identifier.  */
  unsigned int length;
};

/* Generic auxiliary string header.  */
struct som_string_auxhdr
{
  struct som_aux_id header_id;

  /* Length of the string, without the NUL.  */
  unsigned int string_length;

  /* The string.  */
  char string[1];
};

struct som_name_pt
{
  char *name;
  unsigned int strx;
};

struct som_compilation_unit
{
  /* Source file that produced the SOM.  */
  struct som_name_pt name;

  /* Name of the language used when creating this SOM.  */
  struct som_name_pt language_name;

  /* Identificaton of the compiler.  */
  struct som_name_pt product_id;

  /* Version id of the compiler.  */
  struct som_name_pt version_id;

  unsigned int flags;
  struct som_clock compile_time;
  struct som_clock source_time;
};

struct som_exec_auxhdr
{
  struct som_aux_id som_auxhdr;

  long exec_tsize;
  long exec_tmem;
  long exec_tfile;
  long exec_dsize;
  long exec_dmem;
  long exec_dfile;
  long exec_bsize;
  long exec_entry;
  long exec_flags;
  long exec_bfill;
};

struct som_space_dictionary_record
{
  unsigned int name;
  unsigned int is_loadable : 1;
  unsigned int is_defined : 1;
  unsigned int is_private : 1;
  unsigned int has_intermediate_code : 1;
  unsigned int is_tspecific : 1;
  unsigned int reserved : 11;
  unsigned int sort_key : 8;
  unsigned int reserved2 : 8;
  int space_number;
  int subspace_index;
  unsigned int subspace_quantity;
  int loader_fix_index;
  unsigned int loader_fix_quantity;
  int init_pointer_index;
  unsigned int init_pointer_quantity;
};

struct som_subspace_dictionary_record
{
  int space_index;
  unsigned int access_control_bits : 7;
  unsigned int memory_resident : 1;
  unsigned int dup_common : 1;
  unsigned int is_common : 1;
  unsigned int is_loadable : 1;
  unsigned int quadrant : 2;
  unsigned int initially_frozen : 1;
  unsigned int is_first : 1;
  unsigned int code_only : 1;
  unsigned int sort_key : 8;
  unsigned int replicate_init : 1;
  unsigned int continuation : 1;
  unsigned int is_tspecific : 1;
  unsigned int is_comdat : 1;
  unsigned int reserved : 4;
  int file_loc_init_value;
  unsigned int initialization_length;
  unsigned int subspace_start;
  unsigned int subspace_length;
  unsigned int reserved2 : 5;
  unsigned int alignment : 27;
  unsigned int name;
  int fixup_request_index;
  unsigned int fixup_request_quantity;
};

struct som_lst_header
{
  unsigned short system_id;
  unsigned short a_magic;
  unsigned int version_id;
  struct som_clock file_time;
  unsigned int hash_loc;
  unsigned int hash_size;
  unsigned int module_count;
  unsigned int module_limit;
  unsigned int dir_loc;
  unsigned int export_loc;
  unsigned int export_count;
  unsigned int import_loc;
  unsigned int aux_loc;
  unsigned int aux_size;
  unsigned int string_loc;
  unsigned int string_size;
  unsigned int free_list;
  unsigned int file_end;
  unsigned int checksum;
};

#endif /* _SOM_INTERNAL_H */