1 /* VMS object file format
2    Copyright (C) 1989, 90, 91, 92, 93, 94, 95, 96, 97, 1999
3    Free Software Foundation, Inc.
4 
5 This file is part of GAS, the GNU Assembler.
6 
7 GAS is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as
9 published by the Free Software Foundation; either version 2,
10 or (at your option) any later version.
11 
12 GAS is distributed in the hope that it will be useful, but
13 WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See
15 the GNU General Public License for more details.
16 
17 You should have received a copy of the GNU General Public License
18 along with GAS; see the file COPYING.  If not, write to the Free
19 Software Foundation, 59 Temple Place - Suite 330, Boston, MA
20 02111-1307, USA. */
21 
22 /* Tag to validate a.out object file format processing */
23 #define OBJ_VMS 1
24 
25 #include "targ-cpu.h"
26 
27 #define LONGWORD_ALIGNMENT	2
28 
29 /* This macro controls subsection alignment within a section.
30  *
31  * Under VAX/VMS, the linker (and PSECT specifications)
32  * take care of correctly aligning the segments.
33  * Doing the alignment here (on initialized data) can
34  * mess up the calculation of global data PSECT sizes.
35  */
36 #define SUB_SEGMENT_ALIGN(SEG)	\
37 		(((SEG) == data_section) ? 0 : LONGWORD_ALIGNMENT)
38 
39 /* This flag is used to remember whether we are in the const or the
40    data section.  By and large they are identical, but we set a no-write
41    bit for psects in the const section.  */
42 
43 extern unsigned char const_flag;
44 
45 /* This is overloaded onto const_flag, for convenience.  It's used to flag
46    dummy labels like "gcc2_compiled."  which occur before the first .text
47    or .data section directive.  */
48 
49 #define IN_DEFAULT_SECTION 0x80
50 
51 /* These are defined in obj-vms.c. */
52 extern const short seg_N_TYPE[];
53 extern const segT N_TYPE_seg[];
54 
55 #undef NO_RELOC
56 enum reloc_type
57   {
58     NO_RELOC, RELOC_32
59   };
60 
61 #define N_BADMAG(x)	(0)
62 #define N_TXTOFF(x)	( sizeof(struct exec) )
63 #define N_DATOFF(x)	( N_TXTOFF(x) + (x).a_text )
64 #define N_TROFF(x)	( N_DATOFF(x) + (x).a_data )
65 #define N_DROFF(x)	( N_TROFF(x) + (x).a_trsize )
66 #define N_SYMOFF(x)	( N_DROFF(x) + (x).a_drsize )
67 #define N_STROFF(x)	( N_SYMOFF(x) + (x).a_syms )
68 
69 /* We use this copy of the exec header for VMS.  We do not actually use it, but
70    what we actually do is let gas fill in the relevant slots, and when we get
71    around to writing an obj file, we just pick out what we need.  */
72 
73 struct exec
74 {
75   unsigned long a_text;		/* length of text, in bytes */
76   unsigned long a_data;		/* length of data, in bytes */
77   unsigned long a_bss;		/* length of uninitialized data area for file, in bytes */
78   unsigned long a_trsize;	/* length of relocation info for text, in bytes */
79   unsigned long a_drsize;	/* length of relocation info for data, in bytes */
80   unsigned long a_entry;	/* start address */
81   unsigned long a_syms;		/* length of symbol table data in file, in bytes */
82 };
83 
84 typedef struct
85   {
86     struct exec header;		/* a.out header */
87     long string_table_size;	/* names + '\0' + sizeof(int) */
88   }
89 object_headers;
90 
91 /* A single entry in the symbol table
92  * (this started as a clone of bout.h's nlist, but much was unneeded).
93  */
94 struct nlist
95   {
96     char *n_name;
97     unsigned char n_type;	/* See below				*/
98     unsigned char n_other;	/* used for const_flag and "default section" */
99     unsigned	: 16;		/* padding for alignment */
100     int n_desc;			/* source line number for N_SLINE stabs */
101   };
102 
103 /* Legal values of n_type (see aout/stab.def for the majority of the codes).
104  */
105 #define N_UNDF	0		/* Undefined symbol	*/
106 #define N_ABS	2		/* Absolute symbol	*/
107 #define N_TEXT	4		/* Text symbol		*/
108 #define N_DATA	6		/* Data symbol		*/
109 #define N_BSS	8		/* BSS symbol		*/
110 #define N_FN	31		/* Filename symbol	*/
111 
112 #define N_EXT	1		/* External symbol (OR'd in with one of above)	*/
113 #define N_TYPE	036		/* Mask for all the type bits			*/
114 
115 #define N_STAB	0340		/* Mask for all bits used for SDB entries 	*/
116 
117 #include "aout/stab_gnu.h"
118 
119 /* SYMBOL TABLE */
120 /* Symbol table entry data type */
121 
122 typedef struct nlist obj_symbol_type;	/* Symbol table entry */
123 
124 /* Symbol table macros and constants */
125 
126 #define OBJ_SYMFIELD_TYPE struct VMS_Symbol *
127 
128 /*
129  *  Macros to extract information from a symbol table entry.
130  *  This syntaxic indirection allows independence regarding a.out or coff.
131  *  The argument (s) of all these macros is a pointer to a symbol table entry.
132  */
133 
134 /* True if the symbol is external */
135 #define S_IS_EXTERNAL(s)	((s)->sy_symbol.n_type & N_EXT)
136 
137 /* True if symbol has been defined, ie is in N_{TEXT,DATA,BSS,ABS} or N_EXT */
138 #define S_IS_DEFINED(s)		(S_GET_TYPE(s) != N_UNDF)
139 
140 #define S_IS_COMMON(s)	(S_GET_TYPE(s) == N_UNDF && S_GET_VALUE(s) != 0)
141 
142 #define S_IS_REGISTER(s)	((s)->sy_symbol.n_type == N_REGISTER)
143 
144 /* True if a debug special symbol entry */
145 #define S_IS_DEBUG(s)		((s)->sy_symbol.n_type & N_STAB)
146 /* True if a symbol is local symbol name */
147 /* A symbol name whose name begin with ^A is a gas internal pseudo symbol
148    nameless symbols come from .stab directives. */
149 #define S_IS_LOCAL(s)		(S_GET_NAME(s) && \
150 				 !S_IS_DEBUG(s) && \
151 				 (strchr(S_GET_NAME(s), '\001') != 0 || \
152 				  strchr(S_GET_NAME(s), '\002') != 0 || \
153 				  (S_LOCAL_NAME(s) && !flag_keep_locals)))
154 /* True if a symbol is not defined in this file */
155 #define S_IS_EXTERN(s)		((s)->sy_symbol.n_type & N_EXT)
156 /* True if the symbol has been generated because of a .stabd directive */
157 #define S_IS_STABD(s)		(S_GET_NAME(s) == (char *)0)
158 
159 /* Accessors */
160 /* The name of the symbol */
161 #define S_GET_NAME(s)		((s)->sy_symbol.n_name)
162 /* The pointer to the string table */
163 #define S_GET_OFFSET(s)		((s)->sy_name_offset)
164 /* The raw type of the symbol */
165 #define S_GET_RAW_TYPE(s)		((s)->sy_symbol.n_type)
166 /* The type of the symbol */
167 #define S_GET_TYPE(s)		((s)->sy_symbol.n_type & N_TYPE)
168 /* The numeric value of the segment */
169 #define S_GET_SEGMENT(s)	(N_TYPE_seg[S_GET_TYPE(s)])
170 /* The n_other expression value */
171 #define S_GET_OTHER(s)		((s)->sy_symbol.n_other)
172 /* The n_desc expression value */
173 #define S_GET_DESC(s)		((s)->sy_symbol.n_desc)
174 
175 /* Modifiers */
176 /* Assume that a symbol cannot be simultaneously in more than on segment */
177 /* set segment */
178 #define S_SET_SEGMENT(s,seg)	((s)->sy_symbol.n_type &= ~N_TYPE,(s)->sy_symbol.n_type|=SEGMENT_TO_SYMBOL_TYPE(seg))
179 /* The symbol is external */
180 #define S_SET_EXTERNAL(s)	((s)->sy_symbol.n_type |= N_EXT)
181 /* The symbol is not external */
182 #define S_CLEAR_EXTERNAL(s)	((s)->sy_symbol.n_type &= ~N_EXT)
183 /* Set the name of the symbol */
184 #define S_SET_NAME(s,v)		((s)->sy_symbol.n_name = (v))
185 /* Set the offset in the string table */
186 #define S_SET_OFFSET(s,v)	((s)->sy_name_offset = (v))
187 /* Set the n_other expression value */
188 #define S_SET_OTHER(s,v)	((s)->sy_symbol.n_other = (v))
189 /* Set the n_desc expression value */
190 #define S_SET_DESC(s,v)		((s)->sy_symbol.n_desc = (v))
191 /* Set the n_type expression value */
192 #define S_SET_TYPE(s,v)		((s)->sy_symbol.n_type = (v))
193 
194 
195 /* File header macro and type definition */
196 
197 #define H_GET_TEXT_SIZE(h)		((h)->header.a_text)
198 #define H_GET_DATA_SIZE(h)		((h)->header.a_data)
199 #define H_GET_BSS_SIZE(h)		((h)->header.a_bss)
200 
201 #define H_SET_TEXT_SIZE(h,v)		((h)->header.a_text = md_section_align(SEG_TEXT, (v)))
202 #define H_SET_DATA_SIZE(h,v)		((h)->header.a_data = md_section_align(SEG_DATA, (v)))
203 #define H_SET_BSS_SIZE(h,v)		((h)->header.a_bss = md_section_align(SEG_BSS, (v)))
204 
205 #define H_SET_STRING_SIZE(h,v)		((h)->string_table_size = (v))
206 #define H_SET_SYMBOL_TABLE_SIZE(h,v)	((h)->header.a_syms = (v) * \
207 					 sizeof(struct nlist))
208 
209 /* line numbering stuff. */
210 #define OBJ_EMIT_LINENO(a, b, c)	{;}
211 
212 #define obj_symbol_new_hook(s)	{;}
213 
214 /* Force structure tags into scope so that their use in prototypes
215    will never be their first occurance.  */
216 struct fix;
217 struct frag;
218 
219 /* obj-vms routines visible to the rest of gas.  */
220 
221 extern void tc_aout_fix_to_chars PARAMS ((char *,struct fix *,relax_addressT));
222 
223 extern int vms_resolve_symbol_redef PARAMS ((symbolS *));
224 #define RESOLVE_SYMBOL_REDEFINITION(X)	vms_resolve_symbol_redef(X)
225 
226 /* Compiler-generated label "__vax_g_doubles" is used to augment .stabs. */
227 extern void vms_check_for_special_label PARAMS ((symbolS *));
228 #define obj_frob_label(X) vms_check_for_special_label(X)
229 
230 extern void vms_check_for_main PARAMS ((void));
231 
232 extern void vms_write_object_file PARAMS ((unsigned,unsigned,unsigned,
233 					   struct frag *,struct frag *));
234 
235 /* VMS executables are nothing like a.out, but the VMS port of gcc uses
236    a.out format stabs which obj-vms.c then translates.  */
237 
238 #define AOUT_STABS
239 
240 
241 #ifdef WANT_VMS_OBJ_DEFS
242 
243 /* The rest of this file contains definitions for constants used within
244    the actual VMS object file.  We do not use a $ in the symbols (as per
245    usual VMS convention) since System V gags on it.  */
246 
247 #define	OBJ_S_C_HDR	0
248 #define	OBJ_S_C_HDR_MHD	0
249 #define	OBJ_S_C_HDR_LNM	1
250 #define	OBJ_S_C_HDR_SRC	2
251 #define	OBJ_S_C_HDR_TTL	3
252 #define	OBJ_S_C_HDR_CPR	4
253 #define	OBJ_S_C_HDR_MTC	5
254 #define	OBJ_S_C_HDR_GTX	6
255 #define	OBJ_S_C_GSD	1
256 #define	OBJ_S_C_GSD_PSC	0
257 #define	OBJ_S_C_GSD_SYM	1
258 #define	OBJ_S_C_GSD_EPM	2
259 #define	OBJ_S_C_GSD_PRO	3
260 #define	OBJ_S_C_GSD_SYMW	4
261 #define	OBJ_S_C_GSD_EPMW	5
262 #define	OBJ_S_C_GSD_PROW	6
263 #define	OBJ_S_C_GSD_IDC	7
264 #define	OBJ_S_C_GSD_ENV	8
265 #define	OBJ_S_C_GSD_LSY	9
266 #define	OBJ_S_C_GSD_LEPM	10
267 #define	OBJ_S_C_GSD_LPRO	11
268 #define	OBJ_S_C_GSD_SPSC	12
269 #define	OBJ_S_C_TIR	2
270 #define	OBJ_S_C_EOM	3
271 #define	OBJ_S_C_DBG	4
272 #define	OBJ_S_C_TBT	5
273 #define	OBJ_S_C_LNK	6
274 #define	OBJ_S_C_EOMW	7
275 #define	OBJ_S_C_MAXRECTYP	7
276 #define	OBJ_S_K_SUBTYP	1
277 #define	OBJ_S_C_SUBTYP	1
278 #define	OBJ_S_C_MAXRECSIZ	2048
279 #define	OBJ_S_C_STRLVL	0
280 #define	OBJ_S_C_SYMSIZ	31
281 #define	OBJ_S_C_STOREPLIM	-1
282 #define	OBJ_S_C_PSCALILIM	9
283 
284 #define	MHD_S_C_MHD	0
285 #define	MHD_S_C_LNM	1
286 #define	MHD_S_C_SRC	2
287 #define	MHD_S_C_TTL	3
288 #define	MHD_S_C_CPR	4
289 #define	MHD_S_C_MTC	5
290 #define	MHD_S_C_GTX	6
291 #define	MHD_S_C_MAXHDRTYP	6
292 
293 #define	GSD_S_K_ENTRIES	1
294 #define	GSD_S_C_ENTRIES	1
295 #define	GSD_S_C_PSC	0
296 #define	GSD_S_C_SYM	1
297 #define	GSD_S_C_EPM	2
298 #define	GSD_S_C_PRO	3
299 #define	GSD_S_C_SYMW	4
300 #define	GSD_S_C_EPMW	5
301 #define	GSD_S_C_PROW	6
302 #define	GSD_S_C_IDC	7
303 #define	GSD_S_C_ENV	8
304 #define	GSD_S_C_LSY	9
305 #define	GSD_S_C_LEPM	10
306 #define	GSD_S_C_LPRO	11
307 #define	GSD_S_C_SPSC	12
308 #define	GSD_S_C_SYMV	13
309 #define	GSD_S_C_EPMV	14
310 #define	GSD_S_C_PROV	15
311 #define	GSD_S_C_MAXRECTYP	15
312 
313 #define	GSY_S_M_WEAK	1
314 #define	GSY_S_M_DEF	2
315 #define	GSY_S_M_UNI	4
316 #define	GSY_S_M_REL	8
317 
318 #define	LSY_S_M_DEF	2
319 #define	LSY_S_M_REL	8
320 
321 #define	ENV_S_M_DEF	1
322 #define	ENV_S_M_NESTED	2
323 
324 #define	GPS_S_M_PIC	1
325 #define	GPS_S_M_LIB	2
326 #define	GPS_S_M_OVR	4
327 #define	GPS_S_M_REL	8
328 #define	GPS_S_M_GBL	16
329 #define	GPS_S_M_SHR	32
330 #define	GPS_S_M_EXE	64
331 #define	GPS_S_M_RD	128
332 #define	GPS_S_M_WRT	256
333 #define	GPS_S_M_VEC	512
334 #define	GPS_S_K_NAME	9
335 #define	GPS_S_C_NAME	9
336 
337 #define	TIR_S_C_STA_GBL	0
338 #define	TIR_S_C_STA_SB	1
339 #define	TIR_S_C_STA_SW	2
340 #define	TIR_S_C_STA_LW	3
341 #define	TIR_S_C_STA_PB	4
342 #define	TIR_S_C_STA_PW	5
343 #define	TIR_S_C_STA_PL	6
344 #define	TIR_S_C_STA_UB	7
345 #define	TIR_S_C_STA_UW	8
346 #define	TIR_S_C_STA_BFI	9
347 #define	TIR_S_C_STA_WFI	10
348 #define	TIR_S_C_STA_LFI	11
349 #define	TIR_S_C_STA_EPM	12
350 #define	TIR_S_C_STA_CKARG	13
351 #define	TIR_S_C_STA_WPB	14
352 #define	TIR_S_C_STA_WPW	15
353 #define	TIR_S_C_STA_WPL	16
354 #define	TIR_S_C_STA_LSY	17
355 #define	TIR_S_C_STA_LIT	18
356 #define	TIR_S_C_STA_LEPM	19
357 #define	TIR_S_C_MAXSTACOD	19
358 #define	TIR_S_C_MINSTOCOD	20
359 #define	TIR_S_C_STO_SB	20
360 #define	TIR_S_C_STO_SW	21
361 #define	TIR_S_C_STO_L	22
362 #define	TIR_S_C_STO_BD	23
363 #define	TIR_S_C_STO_WD	24
364 #define	TIR_S_C_STO_LD	25
365 #define	TIR_S_C_STO_LI	26
366 #define	TIR_S_C_STO_PIDR	27
367 #define	TIR_S_C_STO_PICR	28
368 #define	TIR_S_C_STO_RSB	29
369 #define	TIR_S_C_STO_RSW	30
370 #define	TIR_S_C_STO_RL	31
371 #define	TIR_S_C_STO_VPS	32
372 #define	TIR_S_C_STO_USB	33
373 #define	TIR_S_C_STO_USW	34
374 #define	TIR_S_C_STO_RUB	35
375 #define	TIR_S_C_STO_RUW	36
376 #define	TIR_S_C_STO_B	37
377 #define	TIR_S_C_STO_W	38
378 #define	TIR_S_C_STO_RB	39
379 #define	TIR_S_C_STO_RW	40
380 #define	TIR_S_C_STO_RIVB	41
381 #define	TIR_S_C_STO_PIRR	42
382 #define	TIR_S_C_MAXSTOCOD	42
383 #define	TIR_S_C_MINOPRCOD	50
384 #define	TIR_S_C_OPR_NOP	50
385 #define	TIR_S_C_OPR_ADD	51
386 #define	TIR_S_C_OPR_SUB	52
387 #define	TIR_S_C_OPR_MUL	53
388 #define	TIR_S_C_OPR_DIV	54
389 #define	TIR_S_C_OPR_AND	55
390 #define	TIR_S_C_OPR_IOR	56
391 #define	TIR_S_C_OPR_EOR	57
392 #define	TIR_S_C_OPR_NEG	58
393 #define	TIR_S_C_OPR_COM	59
394 #define	TIR_S_C_OPR_INSV	60
395 #define	TIR_S_C_OPR_ASH	61
396 #define	TIR_S_C_OPR_USH	62
397 #define	TIR_S_C_OPR_ROT	63
398 #define	TIR_S_C_OPR_SEL	64
399 #define	TIR_S_C_OPR_REDEF	65
400 #define	TIR_S_C_OPR_DFLIT	66
401 #define	TIR_S_C_MAXOPRCOD	66
402 #define	TIR_S_C_MINCTLCOD	80
403 #define	TIR_S_C_CTL_SETRB	80
404 #define	TIR_S_C_CTL_AUGRB	81
405 #define	TIR_S_C_CTL_DFLOC	82
406 #define	TIR_S_C_CTL_STLOC	83
407 #define	TIR_S_C_CTL_STKDL	84
408 #define	TIR_S_C_MAXCTLCOD	84
409 
410 /*
411  *	Debugger symbol definitions:  These are done by hand, as no
412  *					machine-readable version seems
413  *					to be available.
414  */
415 #define DST_S_C_C	  7	/* Language == "C"	*/
416 #define DST_S_C_CXX	 15	/* Language == "C++"	*/
417 #define DST_S_C_VERSION	153
418 #define	DST_S_C_SOURCE	155	/* Source file		*/
419 #define DST_S_C_PROLOG	162
420 #define	DST_S_C_BLKBEG	176	/* Beginning of block	*/
421 #define	DST_S_C_BLKEND	177	/* End of block	*/
422 #define DST_S_C_ENTRY	181
423 #define DST_S_C_PSECT	184
424 #define	DST_S_C_LINE_NUM	185	/* Line Number		*/
425 #define DST_S_C_LBLORLIT	186
426 #define DST_S_C_LABEL	187
427 #define	DST_S_C_MODBEG	188	/* Beginning of module	*/
428 #define	DST_S_C_MODEND	189	/* End of module	*/
429 #define	DST_S_C_RTNBEG	190	/* Beginning of routine	*/
430 #define	DST_S_C_RTNEND	191	/* End of routine	*/
431 #define	DST_S_C_DELTA_PC_W	1	/* Incr PC	*/
432 #define	DST_S_C_INCR_LINUM	2	/* Incr Line #	*/
433 #define	DST_S_C_INCR_LINUM_W	3	/* Incr Line #	*/
434 #define DST_S_C_SET_LINUM_INCR	4
435 #define DST_S_C_SET_LINUM_INCR_W	5
436 #define DST_S_C_RESET_LINUM_INCR	6
437 #define DST_S_C_BEG_STMT_MODE	7
438 #define DST_S_C_END_STMT_MODE	8
439 #define	DST_S_C_SET_LINE_NUM	9	/* Set Line #	*/
440 #define DST_S_C_SET_PC		10
441 #define DST_S_C_SET_PC_W		11
442 #define DST_S_C_SET_PC_L		12
443 #define DST_S_C_SET_STMTNUM	13
444 #define DST_S_C_TERM		14	/* End of lines	*/
445 #define DST_S_C_TERM_W		15	/* End of lines	*/
446 #define	DST_S_C_SET_ABS_PC	16	/* Set PC	*/
447 #define	DST_S_C_DELTA_PC_L	17	/* Incr PC	*/
448 #define DST_S_C_INCR_LINUM_L	18	/* Incr Line #	*/
449 #define DST_S_C_SET_LINUM_B	19	/* Set Line #	*/
450 #define DST_S_C_SET_LINUM_L	20	/* Set Line #	*/
451 #define	DST_S_C_TERM_L		21	/* End of lines	*/
452 /* these are used with DST_S_C_SOURCE */
453 #define DST_S_C_SRC_DECLFILE	 1	/* Declare source file */
454 #define DST_S_C_SRC_SETFILE	 2	/* Set source file */
455 #define DST_S_C_SRC_SETREC_L	 3	/* Set record, longword value */
456 #define DST_S_C_SRC_SETREC_W	 4	/* Set record, word value */
457 #define DST_S_C_SRC_DEFLINES_W	10	/* # of line, word counter */
458 #define DST_S_C_SRC_DEFLINES_B	11	/* # of line, byte counter */
459 #define DST_S_C_SRC_FORMFEED	16	/* ^L counts as a record */
460 /* the following are the codes for the various data types.  Anything not on
461  * the list is included under 'advanced_type'
462  */
463 #define DBG_S_C_UCHAR		0x02
464 #define DBG_S_C_USINT		0x03
465 #define DBG_S_C_ULINT		0x04
466 #define DBG_S_C_UQUAD		0x05
467 #define DBG_S_C_SCHAR		0x06
468 #define DBG_S_C_SSINT		0x07
469 #define DBG_S_C_SLINT		0x08
470 #define DBG_S_C_SQUAD		0x09
471 #define DBG_S_C_REAL4		0x0a
472 #define DBG_S_C_REAL8		0x0b		/* D_float double */
473 #define DBG_S_C_COMPLX4		0x0c		/* 2xF_float complex float */
474 #define DBG_S_C_COMPLX8		0x0d		/* 2xD_float complex double */
475 #define DBG_S_C_REAL8_G		0x1b		/* G_float double */
476 #define DBG_S_C_COMPLX8_G	0x1d		/* 2xG_float complex double */
477 #define DBG_S_C_FUNCTION_ADDR	0x17
478 #define DBG_S_C_ADVANCED_TYPE	0xa3
479 /*  Some of these are just for future reference.  [pr]
480  */
481 #define DBG_S_C_UBITA		0x01	/* unsigned, aligned bit field */
482 #define DBG_S_C_UBITU		0x22	/* unsigned, unaligned bit field */
483 #define DBG_S_C_SBITA		0x29	/* signed, aligned bit field */
484 #define DBG_S_C_SBITU		0x2a	/* signed, unaligned bit field */
485 #define DBG_S_C_CSTRING		0x2e	/* asciz ('\0' terminated) string */
486 #define DBG_S_C_WCHAR		0x38	/* wchar_t */
487 /*  These are descriptor class codes.
488  */
489 #define DSC_K_CLASS_S		0x01	/* static (fixed length) */
490 #define DSC_K_CLASS_D		0x02	/* dynamic string (not via malloc!) */
491 #define DSC_K_CLASS_A		0x04	/* array */
492 #define DSC_K_CLASS_UBS		0x0d	/* unaligned bit string */
493 /*  These are the codes that are used to generate the definitions of struct
494  *  union and enum records
495  */
496 #define DBG_S_C_ENUM_ITEM		0xa4
497 #define DBG_S_C_ENUM_START		0xa5
498 #define DBG_S_C_ENUM_END		0xa6
499 #define DBG_S_C_STRUCT_ITEM		DST_K_VFLAGS_BITOFFS	/* 0xff */
500 #define DBG_S_C_STRUCT_START		0xab
501 #define DBG_S_C_STRUCT_END		0xac
502 #define DST_K_TYPSPEC			0xaf		/* type specification */
503 /* These codes are used in the generation of the symbol definition records
504  */
505 #define DST_K_VFLAGS_NOVAL		0x80	/* struct definition only */
506 #define DST_K_VFLAGS_DSC		0xfa	/* descriptor used */
507 #define DST_K_VFLAGS_TVS		0xfb	/* trailing value specified */
508 #define DST_K_VS_FOLLOWS		0xfd	/* value spec follows */
509 #define DST_K_VFLAGS_BITOFFS		0xff	/* value contains bit offset */
510 #define DST_K_VALKIND_LITERAL	0
511 #define DST_K_VALKIND_ADDR	1
512 #define DST_K_VALKIND_DESC	2
513 #define DST_K_VALKIND_REG	3
514 #define DST_K_REG_VAX_AP	0x0c	/* R12 */
515 #define DST_K_REG_VAX_FP	0x0d	/* R13 */
516 #define DST_K_REG_VAX_SP	0x0e	/* R14 */
517 #define DST_V_VALKIND		0	/* offset of valkind field */
518 #define DST_V_INDIRECT		2	/* offset to indirect bit */
519 #define DST_V_DISP		3	/* offset to displacement bit */
520 #define DST_V_REGNUM		4	/* offset to register number */
521 #define DST_M_INDIRECT		(1<<DST_V_INDIRECT)
522 #define DST_M_DISP		(1<<DST_V_DISP)
523 #define DBG_C_FUNCTION_PARAM	/* 0xc9 */	\
524 	(DST_K_VALKIND_ADDR|DST_M_DISP|(DST_K_REG_VAX_AP<<DST_V_REGNUM))
525 #define DBG_C_LOCAL_SYM		/* 0xd9 */	\
526 	(DST_K_VALKIND_ADDR|DST_M_DISP|(DST_K_REG_VAX_FP<<DST_V_REGNUM))
527 /* Kinds of value specifications
528  */
529 #define DST_K_VS_ALLOC_SPLIT	3	/* split lifetime */
530 /* Kinds of type specifications
531  */
532 #define DST_K_TS_ATOM		0x01	/* atomic type specification */
533 #define DST_K_TS_DSC		0x02	/* descriptor type spec */
534 #define DST_K_TS_IND		0x03	/* indirect type specification */
535 #define DST_K_TS_TPTR		0x04	/* typed pointer type spec */
536 #define DST_K_TS_PTR		0x05	/* pointer type spec */
537 #define DST_K_TS_ARRAY		0x07	/* array type spec */
538 #define DST_K_TS_NOV_LENG	0x0e	/* novel length type spec */
539 /*  These are the codes that are used in the suffix records to determine the
540  *  actual data type
541  */
542 #define DBG_S_C_BASIC			DST_K_TS_ATOM
543 #define DBG_S_C_BASIC_ARRAY		DST_K_TS_DSC
544 #define DBG_S_C_STRUCT			DST_K_TS_IND
545 #define DBG_S_C_POINTER			DST_K_TS_TPTR
546 #define DBG_S_C_VOID			DST_K_TS_PTR
547 #define DBG_S_C_COMPLEX_ARRAY		DST_K_TS_ARRAY
548 
549 #endif	/* WANT_VMS_OBJ_DEFS */
550 
551 /* end of obj-vms.h */
552