RIP gzip, we found a nicer playmate.
[dragonfly.git] / gnu / usr.bin / as / config / obj-vms.h
1 /* VMS object file format
2    Copyright (C) 1989, 1990, 1991 Free Software Foundation, Inc.
3
4 This file is part of GAS, the GNU Assembler.
5
6 GAS is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as
8 published by the Free Software Foundation; either version 2,
9 or (at your option) any later version.
10
11 GAS is distributed in the hope that it will be useful, but
12 WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See
14 the GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public
17 License along with GAS; see the file COPYING.  If not, write
18 to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
19
20 /* Tag to validate a.out object file format processing */
21 #define OBJ_VMS 1
22
23 #include "targ-cpu.h"
24
25 /* This flag is used to remember whether we are in the const or the
26    data section.  By and large they are identical, but we set a no-write
27    bit for psects in the const section.  */
28
29 extern char const_flag;
30
31
32 /* These are defined in obj-vms.c. */
33 extern const short seg_N_TYPE[];
34 extern const segT  N_TYPE_seg[];
35
36 enum reloc_type {
37         NO_RELOC, RELOC_32
38 };
39
40 #define N_BADMAG(x)     (0)
41 #define N_TXTOFF(x)     ( sizeof(struct exec) )
42 #define N_DATOFF(x)     ( N_TXTOFF(x) + (x).a_text )
43 #define N_TROFF(x)      ( N_DATOFF(x) + (x).a_data )
44 #define N_DROFF(x)      ( N_TROFF(x) + (x).a_trsize )
45 #define N_SYMOFF(x)     ( N_DROFF(x) + (x).a_drsize )
46 #define N_STROFF(x)     ( N_SYMOFF(x) + (x).a_syms )
47
48 /* We use this copy of the exec header for VMS.  We do not actually use it, but
49    what we actually do is let gas fill in the relevant slots, and when we get
50    around to writing an obj file, we just pick out what we need.  */
51
52 struct exec
53 {
54   unsigned long a_text;         /* length of text, in bytes */
55   unsigned long a_data;         /* length of data, in bytes */
56   unsigned long a_bss;          /* length of uninitialized data area for file, in bytes */
57   unsigned long a_trsize;       /* length of relocation info for text, in bytes */
58   unsigned long a_drsize;       /* length of relocation info for data, in bytes */
59   unsigned long a_entry;        /* start address */
60   unsigned long a_syms;         /* length of symbol table data in file, in bytes */
61 };
62
63 typedef struct {
64     struct exec header;                 /* a.out header */
65     long        string_table_size;      /* names + '\0' + sizeof(int) */
66 } object_headers;
67
68 /* A single entry in the symbol table
69  */
70 struct nlist {
71         union {
72                 char    *n_name;
73                 struct nlist *n_next;
74                 long    n_strx;         /* Index into string table      */
75         } n_un;
76         unsigned char n_type;   /* See below                            */
77         char    n_other;        /* Used in i80960 support -- see below  */
78         short   n_desc;
79         unsigned long n_value;
80 };
81
82 /* Legal values of n_type
83  */
84 #define N_UNDF  0       /* Undefined symbol     */
85 #define N_ABS   2       /* Absolute symbol      */
86 #define N_TEXT  4       /* Text symbol          */
87 #define N_DATA  6       /* Data symbol          */
88 #define N_BSS   8       /* BSS symbol           */
89 #define N_FN    31      /* Filename symbol      */
90
91 #define N_EXT   1       /* External symbol (OR'd in with one of above)  */
92 #define N_TYPE  036     /* Mask for all the type bits                   */
93
94 #define N_STAB  0340    /* Mask for all bits used for SDB entries       */
95
96 #define N_GSYM  0x20            /* global symbol: name,,0,type,0 */
97 #define N_FNAME 0x22            /* procedure name (f77 kludge): name,,0 */
98 #define N_FUN   0x24            /* procedure: name,,0,linenumber,address */
99 #define N_STSYM 0x26            /* static symbol: name,,0,type,address */
100 #define N_LCSYM 0x28            /* .lcomm symbol: name,,0,type,address */
101 #define N_RSYM  0x40            /* register sym: name,,0,type,register */
102 #define N_SLINE 0x44            /* src line: 0,,0,linenumber,address */
103 #define N_CATCH 0x54            /* */
104 #define N_SSYM  0x60            /* structure elt: name,,0,type,struct_offset */
105 #define N_SO    0x64            /* source file name: name,,0,0,address */
106 #define N_LSYM  0x80            /* local sym: name,,0,type,offset */
107 #define N_SOL   0x84            /* #included file name: name,,0,0,address */
108 #define N_PSYM  0xa0            /* parameter: name,,0,type,offset */
109 #define N_ENTRY 0xa4            /* alternate entry: name,linenumber,address */
110 #define N_LBRAC 0xc0            /* left bracket: 0,,0,nesting level,address */
111 #define N_RBRAC 0xe0            /* right bracket: 0,,0,nesting level,address */
112 #define N_BCOMM 0xe2            /* begin common: name,, */
113 #define N_ECOMM 0xe4            /* end common: name,, */
114 #define N_ECOML 0xe8            /* end common (local name): ,,address */
115 #define N_LENG  0xfe            /* second stab entry with length information */
116
117 /* SYMBOL TABLE */
118 /* Symbol table entry data type */
119
120 typedef struct nlist obj_symbol_type; /* Symbol table entry */
121
122 /* Symbol table macros and constants */
123
124 /*
125  *  Macros to extract information from a symbol table entry.
126  *  This syntaxic indirection allows independence regarding a.out or coff.
127  *  The argument (s) of all these macros is a pointer to a symbol table entry.
128  */
129
130 /* True if the symbol is external */
131 #define S_IS_EXTERNAL(s)        ((s)->sy_symbol.n_type & N_EXT)
132
133 /* True if symbol has been defined, ie is in N_{TEXT,DATA,BSS,ABS} or N_EXT */
134 #define S_IS_DEFINED(s)         (S_GET_TYPE(s) != N_UNDF)
135
136 #define S_IS_REGISTER(s)        ((s)->sy_symbol.n_type == N_REGISTER)
137
138 /* True if a debug special symbol entry */
139 #define S_IS_DEBUG(s)           ((s)->sy_symbol.n_type & N_STAB)
140 /* True if a symbol is local symbol name */
141 /* A symbol name whose name begin with ^A is a gas internal pseudo symbol
142    nameless symbols come from .stab directives. */
143 #define S_IS_LOCAL(s)           (S_GET_NAME(s) && \
144                                  !S_IS_DEBUG(s) && \
145                                  (S_GET_NAME(s)[0] == '\001' || \
146                                   (S_LOCAL_NAME(s) && !flagseen['L'])))
147 /* True if a symbol is not defined in this file */
148 #define S_IS_EXTERN(s)          ((s)->sy_symbol.n_type & N_EXT)
149 /* True if the symbol has been generated because of a .stabd directive */
150 #define S_IS_STABD(s)           (S_GET_NAME(s) == (char *)0)
151
152 /* Accessors */
153 /* The value of the symbol */
154 #define S_GET_VALUE(s)          (((s)->sy_symbol.n_value))
155 /* The name of the symbol */
156 #define S_GET_NAME(s)           ((s)->sy_symbol.n_un.n_name)
157 /* The pointer to the string table */
158 #define S_GET_OFFSET(s)         ((s)->sy_symbol.n_un.n_strx)
159 /* The raw type of the symbol */
160 #define S_GET_RAW_TYPE(s)               ((s)->sy_symbol.n_type)
161 /* The type of the symbol */
162 #define S_GET_TYPE(s)           ((s)->sy_symbol.n_type & N_TYPE)
163 /* The numeric value of the segment */
164 #define S_GET_SEGMENT(s)        (N_TYPE_seg[S_GET_TYPE(s)])
165 /* The n_other expression value */
166 #define S_GET_OTHER(s)          ((s)->sy_symbol.n_other)
167 /* The n_desc expression value */
168 #define S_GET_DESC(s)           ((s)->sy_symbol.n_desc)
169
170 /* Modifiers */
171 /* Set the value of the symbol */
172 #define S_SET_VALUE(s,v)        ((s)->sy_symbol.n_value = (unsigned long) (v))
173 /* Assume that a symbol cannot be simultaneously in more than on segment */
174  /* set segment */
175 #define S_SET_SEGMENT(s,seg)    ((s)->sy_symbol.n_type &= ~N_TYPE,(s)->sy_symbol.n_type|=SEGMENT_TO_SYMBOL_TYPE(seg))
176 /* The symbol is external */
177 #define S_SET_EXTERNAL(s)       ((s)->sy_symbol.n_type |= N_EXT)
178 /* The symbol is not external */
179 #define S_CLEAR_EXTERNAL(s)     ((s)->sy_symbol.n_type &= ~N_EXT)
180 /* Set the name of the symbol */
181 #define S_SET_NAME(s,v)         ((s)->sy_symbol.n_un.n_name = (v))
182 /* Set the offset in the string table */
183 #define S_SET_OFFSET(s,v)       ((s)->sy_symbol.n_un.n_strx = (v))
184 /* Set the n_other expression value */
185 #define S_SET_OTHER(s,v)        ((s)->sy_symbol.n_other = (v))
186 /* Set the n_desc expression value */
187 #define S_SET_DESC(s,v)         ((s)->sy_symbol.n_desc = (v))
188
189
190 /* File header macro and type definition */
191
192 #define H_GET_TEXT_SIZE(h)              ((h)->header.a_text)
193 #define H_GET_DATA_SIZE(h)              ((h)->header.a_data)
194 #define H_GET_BSS_SIZE(h)               ((h)->header.a_bss)
195
196 #define H_SET_TEXT_SIZE(h,v)            ((h)->header.a_text = md_section_align(SEG_TEXT, (v)))
197 #define H_SET_DATA_SIZE(h,v)            ((h)->header.a_data = md_section_align(SEG_DATA, (v)))
198 #define H_SET_BSS_SIZE(h,v)             ((h)->header.a_bss = md_section_align(SEG_BSS, (v)))
199
200 #define H_SET_STRING_SIZE(h,v)          ((h)->string_table_size = (v))
201 #define H_SET_SYMBOL_TABLE_SIZE(h,v)    ((h)->header.a_syms = (v) * \
202                                          sizeof(struct nlist))
203
204 /*
205  * Current means for getting the name of a segment.
206  * This will change for infinite-segments support (e.g. COFF).
207  */
208 #define segment_name(seg)  ( seg_name[(int)(seg)] )
209 extern char *const seg_name[];
210
211
212 /* line numbering stuff. */
213 #define OBJ_EMIT_LINENO(a, b, c)        {;}
214
215 #define obj_symbol_new_hook(s)  {;}
216
217 #ifdef __STDC__
218 struct fix;
219 void tc_aout_fix_to_chars(char *where, struct fix *fixP, relax_addressT segment_address);
220 #else
221 void tc_aout_fix_to_chars();
222 #endif /* __STDC__ */
223
224 /* The rest of this file contains definitions for constants used within the actual
225    VMS object file.  We do not use a $ in the symbols (as per usual VMS
226    convention) since System V gags on it.  */
227
228 #define OBJ_S_C_HDR     0
229 #define OBJ_S_C_HDR_MHD 0
230 #define OBJ_S_C_HDR_LNM 1
231 #define OBJ_S_C_HDR_SRC 2
232 #define OBJ_S_C_HDR_TTL 3
233 #define OBJ_S_C_HDR_CPR 4
234 #define OBJ_S_C_HDR_MTC 5
235 #define OBJ_S_C_HDR_GTX 6
236 #define OBJ_S_C_GSD     1
237 #define OBJ_S_C_GSD_PSC 0
238 #define OBJ_S_C_GSD_SYM 1
239 #define OBJ_S_C_GSD_EPM 2
240 #define OBJ_S_C_GSD_PRO 3
241 #define OBJ_S_C_GSD_SYMW        4
242 #define OBJ_S_C_GSD_EPMW        5
243 #define OBJ_S_C_GSD_PROW        6
244 #define OBJ_S_C_GSD_IDC 7
245 #define OBJ_S_C_GSD_ENV 8
246 #define OBJ_S_C_GSD_LSY 9
247 #define OBJ_S_C_GSD_LEPM        10
248 #define OBJ_S_C_GSD_LPRO        11
249 #define OBJ_S_C_GSD_SPSC        12
250 #define OBJ_S_C_TIR     2
251 #define OBJ_S_C_EOM     3
252 #define OBJ_S_C_DBG     4
253 #define OBJ_S_C_TBT     5
254 #define OBJ_S_C_LNK     6
255 #define OBJ_S_C_EOMW    7
256 #define OBJ_S_C_MAXRECTYP       7
257 #define OBJ_S_K_SUBTYP  1
258 #define OBJ_S_C_SUBTYP  1
259 #define OBJ_S_C_MAXRECSIZ       2048
260 #define OBJ_S_C_STRLVL  0
261 #define OBJ_S_C_SYMSIZ  31
262 #define OBJ_S_C_STOREPLIM       -1
263 #define OBJ_S_C_PSCALILIM       9
264 \f
265 #define MHD_S_C_MHD     0
266 #define MHD_S_C_LNM     1
267 #define MHD_S_C_SRC     2
268 #define MHD_S_C_TTL     3
269 #define MHD_S_C_CPR     4
270 #define MHD_S_C_MTC     5
271 #define MHD_S_C_GTX     6
272 #define MHD_S_C_MAXHDRTYP       6
273 \f
274 #define GSD_S_K_ENTRIES 1
275 #define GSD_S_C_ENTRIES 1
276 #define GSD_S_C_PSC     0
277 #define GSD_S_C_SYM     1
278 #define GSD_S_C_EPM     2
279 #define GSD_S_C_PRO     3
280 #define GSD_S_C_SYMW    4
281 #define GSD_S_C_EPMW    5
282 #define GSD_S_C_PROW    6
283 #define GSD_S_C_IDC     7
284 #define GSD_S_C_ENV     8
285 #define GSD_S_C_LSY     9
286 #define GSD_S_C_LEPM    10
287 #define GSD_S_C_LPRO    11
288 #define GSD_S_C_SPSC    12
289 #define GSD_S_C_SYMV    13
290 #define GSD_S_C_EPMV    14
291 #define GSD_S_C_PROV    15
292 #define GSD_S_C_MAXRECTYP       15
293 \f
294 #define GSY_S_M_WEAK    1
295 #define GSY_S_M_DEF     2
296 #define GSY_S_M_UNI     4
297 #define GSY_S_M_REL     8
298 \f
299 #define GPS_S_M_PIC     1
300 #define GPS_S_M_LIB     2
301 #define GPS_S_M_OVR     4
302 #define GPS_S_M_REL     8
303 #define GPS_S_M_GBL     16
304 #define GPS_S_M_SHR     32
305 #define GPS_S_M_EXE     64
306 #define GPS_S_M_RD      128
307 #define GPS_S_M_WRT     256
308 #define GPS_S_M_VEC     512
309 #define GPS_S_K_NAME    9
310 #define GPS_S_C_NAME    9
311 \f
312 #define TIR_S_C_STA_GBL 0
313 #define TIR_S_C_STA_SB  1
314 #define TIR_S_C_STA_SW  2
315 #define TIR_S_C_STA_LW  3
316 #define TIR_S_C_STA_PB  4
317 #define TIR_S_C_STA_PW  5
318 #define TIR_S_C_STA_PL  6
319 #define TIR_S_C_STA_UB  7
320 #define TIR_S_C_STA_UW  8
321 #define TIR_S_C_STA_BFI 9
322 #define TIR_S_C_STA_WFI 10
323 #define TIR_S_C_STA_LFI 11
324 #define TIR_S_C_STA_EPM 12
325 #define TIR_S_C_STA_CKARG       13
326 #define TIR_S_C_STA_WPB 14
327 #define TIR_S_C_STA_WPW 15
328 #define TIR_S_C_STA_WPL 16
329 #define TIR_S_C_STA_LSY 17
330 #define TIR_S_C_STA_LIT 18
331 #define TIR_S_C_STA_LEPM        19
332 #define TIR_S_C_MAXSTACOD       19
333 #define TIR_S_C_MINSTOCOD       20
334 #define TIR_S_C_STO_SB  20
335 #define TIR_S_C_STO_SW  21
336 #define TIR_S_C_STO_L   22
337 #define TIR_S_C_STO_BD  23
338 #define TIR_S_C_STO_WD  24
339 #define TIR_S_C_STO_LD  25
340 #define TIR_S_C_STO_LI  26
341 #define TIR_S_C_STO_PIDR        27
342 #define TIR_S_C_STO_PICR        28
343 #define TIR_S_C_STO_RSB 29
344 #define TIR_S_C_STO_RSW 30
345 #define TIR_S_C_STO_RL  31
346 #define TIR_S_C_STO_VPS 32
347 #define TIR_S_C_STO_USB 33
348 #define TIR_S_C_STO_USW 34
349 #define TIR_S_C_STO_RUB 35
350 #define TIR_S_C_STO_RUW 36
351 #define TIR_S_C_STO_B   37
352 #define TIR_S_C_STO_W   38
353 #define TIR_S_C_STO_RB  39
354 #define TIR_S_C_STO_RW  40
355 #define TIR_S_C_STO_RIVB        41
356 #define TIR_S_C_STO_PIRR        42
357 #define TIR_S_C_MAXSTOCOD       42
358 #define TIR_S_C_MINOPRCOD       50
359 #define TIR_S_C_OPR_NOP 50
360 #define TIR_S_C_OPR_ADD 51
361 #define TIR_S_C_OPR_SUB 52
362 #define TIR_S_C_OPR_MUL 53
363 #define TIR_S_C_OPR_DIV 54
364 #define TIR_S_C_OPR_AND 55
365 #define TIR_S_C_OPR_IOR 56
366 #define TIR_S_C_OPR_EOR 57
367 #define TIR_S_C_OPR_NEG 58
368 #define TIR_S_C_OPR_COM 59
369 #define TIR_S_C_OPR_INSV        60
370 #define TIR_S_C_OPR_ASH 61
371 #define TIR_S_C_OPR_USH 62
372 #define TIR_S_C_OPR_ROT 63
373 #define TIR_S_C_OPR_SEL 64
374 #define TIR_S_C_OPR_REDEF       65
375 #define TIR_S_C_OPR_DFLIT       66
376 #define TIR_S_C_MAXOPRCOD       66
377 #define TIR_S_C_MINCTLCOD       80
378 #define TIR_S_C_CTL_SETRB       80
379 #define TIR_S_C_CTL_AUGRB       81
380 #define TIR_S_C_CTL_DFLOC       82
381 #define TIR_S_C_CTL_STLOC       83
382 #define TIR_S_C_CTL_STKDL       84
383 #define TIR_S_C_MAXCTLCOD       84
384 \f
385 /*
386  *      Debugger symbol definitions:  These are done by hand, as no
387  *                                      machine-readable version seems
388  *                                      to be available.
389  */
390 #define DST_S_C_C               7               /* Language == "C"      */
391 #define DST_S_C_VERSION 153
392 #define DST_S_C_SOURCE  155             /* Source file          */
393 #define DST_S_C_PROLOG  162
394 #define DST_S_C_BLKBEG  176             /* Beginning of block   */
395 #define DST_S_C_BLKEND  177             /* End of block */
396 #define DST_S_C_ENTRY   181
397 #define DST_S_C_PSECT   184
398 #define DST_S_C_LINE_NUM        185             /* Line Number          */
399 #define DST_S_C_LBLORLIT        186
400 #define DST_S_C_LABEL   187
401 #define DST_S_C_MODBEG  188             /* Beginning of module  */
402 #define DST_S_C_MODEND  189             /* End of module        */
403 #define DST_S_C_RTNBEG  190             /* Beginning of routine */
404 #define DST_S_C_RTNEND  191             /* End of routine       */
405 #define DST_S_C_DELTA_PC_W      1               /* Incr PC      */
406 #define DST_S_C_INCR_LINUM      2               /* Incr Line #  */
407 #define DST_S_C_INCR_LINUM_W    3               /* Incr Line #  */
408 #define DST_S_C_SET_LINUM_INCR  4
409 #define DST_S_C_SET_LINUM_INCR_W        5
410 #define DST_S_C_RESET_LINUM_INCR        6
411 #define DST_S_C_BEG_STMT_MODE   7
412 #define DST_S_C_END_STMT_MODE   8
413 #define DST_S_C_SET_LINE_NUM    9               /* Set Line #   */
414 #define DST_S_C_SET_PC          10
415 #define DST_S_C_SET_PC_W                11
416 #define DST_S_C_SET_PC_L                12
417 #define DST_S_C_SET_STMTNUM     13
418 #define DST_S_C_TERM            14              /* End of lines */
419 #define DST_S_C_TERM_W          15              /* End of lines */
420 #define DST_S_C_SET_ABS_PC      16              /* Set PC       */
421 #define DST_S_C_DELTA_PC_L      17              /* Incr PC      */
422 #define DST_S_C_INCR_LINUM_L    18              /* Incr Line #  */
423 #define DST_S_C_SET_LINUM_B     19              /* Set Line #   */
424 #define DST_S_C_SET_LINUM_L     20              /* Set Line #   */
425 #define DST_S_C_TERM_L          21              /* End of lines */
426 /* these are used with DST_S_C_SOURCE */
427 #define DST_S_C_SRC_FORMFEED    16              /* ^L counts    */
428 #define DST_S_C_SRC_DECLFILE    1               /* Declare file */
429 #define DST_S_C_SRC_SETFILE     2               /* Set file     */
430 #define DST_S_C_SRC_SETREC_L    3               /* Set record   */
431 #define DST_S_C_SRC_DEFLINES_W  10              /* # of line    */
432 /* the following are the codes for the various data types.  Anything not on
433  * the list is included under 'advanced_type'
434  */
435 #define DBG_S_C_UCHAR           0x02
436 #define DBG_S_C_USINT           0x03
437 #define DBG_S_C_ULINT           0x04
438 #define DBG_S_C_SCHAR           0x06
439 #define DBG_S_C_SSINT           0x07
440 #define DBG_S_C_SLINT           0x08
441 #define DBG_S_C_REAL4           0x0a
442 #define DBG_S_C_REAL8           0x0b
443 #define DBG_S_C_FUNCTION_ADDR   0x17
444 #define DBG_S_C_ADVANCED_TYPE   0xa3
445 /*  These are the codes that are used to generate the definitions of struct
446  *  union and enum records
447  */
448 #define DBG_S_C_ENUM_ITEM                       0xa4
449 #define DBG_S_C_ENUM_START              0xa5
450 #define DBG_S_C_ENUM_END                        0xa6
451 #define DBG_S_C_STRUCT_START            0xab
452 #define DBG_S_C_STRUCT_ITEM             0xff
453 #define DBG_S_C_STRUCT_END              0xac
454 /*  These are the codes that are used in the suffix records to determine the
455  *  actual data type
456  */
457 #define DBG_S_C_BASIC                   0x01
458 #define DBG_S_C_BASIC_ARRAY             0x02
459 #define DBG_S_C_STRUCT                  0x03
460 #define DBG_S_C_POINTER                 0x04
461 #define DBG_S_C_VOID                    0x05
462 #define DBG_S_C_COMPLEX_ARRAY           0x07
463 /* These codes are used in the generation of the symbol definition records
464  */
465 #define DBG_S_C_FUNCTION_PARAMETER      0xc9
466 #define DBG_S_C_LOCAL_SYM                       0xd9
467 /*
468  * Local Variables:
469  * comment-column: 0
470  * fill-column: 131
471  * End:
472  */
473
474 /* end of obj-vms.h */