1 /* SOM internal definitions for BFD.
2    Copyright (C) 2010-2016 Free Software Foundation, Inc.
3    Contributed by Tristan Gingold <gingold@adacore.com>, AdaCore.
4 
5    This file is part of BFD, the Binary File Descriptor library.
6 
7    This program is free software; you can redistribute it and/or modify
8    it under the terms of the GNU General Public License as published by
9    the Free Software Foundation; either version 3 of the License, or
10    (at your option) any later version.
11 
12    This program is distributed in the hope that it will be useful,
13    but WITHOUT ANY WARRANTY; without even the implied warranty of
14    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15    GNU General Public License for more details.
16 
17    You should have received a copy of the GNU General Public License
18    along with this program; if not, write to the Free Software Foundation,
19    Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.  */
20 
21 #ifndef _SOM_INTERNAL_H
22 #define _SOM_INTERNAL_H
23 
24 struct som_clock
25 {
26   unsigned int secs;
27   unsigned int nanosecs;
28 };
29 
30 struct som_header
31 {
32   unsigned short system_id;
33   unsigned short a_magic;
34   unsigned int version_id;
35   struct som_clock file_time;
36   unsigned int entry_space;
37   unsigned int entry_subspace;
38   unsigned int entry_offset;
39   unsigned int aux_header_location;
40   unsigned int aux_header_size;
41   unsigned int som_length;
42   unsigned int presumed_dp;
43   unsigned int space_location;
44   unsigned int space_total;
45   unsigned int subspace_location;
46   unsigned int subspace_total;
47   unsigned int loader_fixup_location;
48   unsigned int loader_fixup_total;
49   unsigned int space_strings_location;
50   unsigned int space_strings_size;
51   unsigned int init_array_location;
52   unsigned int init_array_total;
53   unsigned int compiler_location;
54   unsigned int compiler_total;
55   unsigned int symbol_location;
56   unsigned int symbol_total;
57   unsigned int fixup_request_location;
58   unsigned int fixup_request_total;
59   unsigned int symbol_strings_location;
60   unsigned int symbol_strings_size;
61   unsigned int unloadable_sp_location;
62   unsigned int unloadable_sp_size;
63   unsigned int checksum;
64 };
65 
66 struct som_aux_id
67 {
68   unsigned int mandatory : 1;
69   unsigned int copy : 1;
70   unsigned int append : 1;
71   unsigned int ignore : 1;
72   unsigned int reserved : 12;
73 
74   /* Header type.  */
75   unsigned int type : 16;
76 
77   /* Length of the header in bytes, without the two word identifier.  */
78   unsigned int length;
79 };
80 
81 /* Generic auxiliary string header.  */
82 struct som_string_auxhdr
83 {
84   struct som_aux_id header_id;
85 
86   /* Length of the string, without the NUL.  */
87   unsigned int string_length;
88 
89   /* The string.  */
90   char string[1];
91 };
92 
93 struct som_name_pt
94 {
95   char *name;
96   unsigned int strx;
97 };
98 
99 struct som_compilation_unit
100 {
101   /* Source file that produced the SOM.  */
102   struct som_name_pt name;
103 
104   /* Name of the language used when creating this SOM.  */
105   struct som_name_pt language_name;
106 
107   /* Identificaton of the compiler.  */
108   struct som_name_pt product_id;
109 
110   /* Version id of the compiler.  */
111   struct som_name_pt version_id;
112 
113   unsigned int flags;
114   struct som_clock compile_time;
115   struct som_clock source_time;
116 };
117 
118 struct som_exec_auxhdr
119 {
120   struct som_aux_id som_auxhdr;
121 
122   long exec_tsize;
123   long exec_tmem;
124   long exec_tfile;
125   long exec_dsize;
126   long exec_dmem;
127   long exec_dfile;
128   long exec_bsize;
129   long exec_entry;
130   long exec_flags;
131   long exec_bfill;
132 };
133 
134 struct som_space_dictionary_record
135 {
136   unsigned int name;
137   unsigned int is_loadable : 1;
138   unsigned int is_defined : 1;
139   unsigned int is_private : 1;
140   unsigned int has_intermediate_code : 1;
141   unsigned int is_tspecific : 1;
142   unsigned int reserved : 11;
143   unsigned int sort_key : 8;
144   unsigned int reserved2 : 8;
145   int space_number;
146   int subspace_index;
147   unsigned int subspace_quantity;
148   int loader_fix_index;
149   unsigned int loader_fix_quantity;
150   int init_pointer_index;
151   unsigned int init_pointer_quantity;
152 };
153 
154 struct som_subspace_dictionary_record
155 {
156   int space_index;
157   unsigned int access_control_bits : 7;
158   unsigned int memory_resident : 1;
159   unsigned int dup_common : 1;
160   unsigned int is_common : 1;
161   unsigned int is_loadable : 1;
162   unsigned int quadrant : 2;
163   unsigned int initially_frozen : 1;
164   unsigned int is_first : 1;
165   unsigned int code_only : 1;
166   unsigned int sort_key : 8;
167   unsigned int replicate_init : 1;
168   unsigned int continuation : 1;
169   unsigned int is_tspecific : 1;
170   unsigned int is_comdat : 1;
171   unsigned int reserved : 4;
172   int file_loc_init_value;
173   unsigned int initialization_length;
174   unsigned int subspace_start;
175   unsigned int subspace_length;
176   unsigned int reserved2 : 5;
177   unsigned int alignment : 27;
178   unsigned int name;
179   int fixup_request_index;
180   unsigned int fixup_request_quantity;
181 };
182 
183 struct som_lst_header
184 {
185   unsigned short system_id;
186   unsigned short a_magic;
187   unsigned int version_id;
188   struct som_clock file_time;
189   unsigned int hash_loc;
190   unsigned int hash_size;
191   unsigned int module_count;
192   unsigned int module_limit;
193   unsigned int dir_loc;
194   unsigned int export_loc;
195   unsigned int export_count;
196   unsigned int import_loc;
197   unsigned int aux_loc;
198   unsigned int aux_size;
199   unsigned int string_loc;
200   unsigned int string_size;
201   unsigned int free_list;
202   unsigned int file_end;
203   unsigned int checksum;
204 };
205 
206 #endif /* _SOM_INTERNAL_H */
207