OpenCores
URL https://opencores.org/ocsvn/or1k/or1k/trunk

Subversion Repositories or1k

[/] [or1k/] [trunk/] [gdb-5.0/] [gdb/] [dst.h] - Blame information for rev 105

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 104 markom
/* <apollo/dst.h> */
2
/* Apollo object module DST (debug symbol table) description */
3
 
4
#ifndef apollo_dst_h
5
#define apollo_dst_h
6
 
7
#if defined(apollo) && !defined(__GNUC__)
8
#define ALIGNED1  __attribute( (aligned(1)) )
9
#else
10
/* Remove attribute directives from non-Apollo code: */
11
#define ALIGNED1                /* nil */
12
#endif
13
 
14
 
15
 
16
/* Identification of this version of the debug symbol table.  Producers of the
17
   debug symbol table must write these values into the version number field of
18
   the compilation unit record in .blocks .
19
 */
20
#define dst_version_major    1
21
#define dst_version_minor    3
22
 
23
 
24
/*
25
   ** Enumeration of debug record types appearing in .blocks and .symbols ...
26
 */
27
typedef enum
28
  {
29
    dst_typ_pad,                /*  0 */
30
    dst_typ_comp_unit,          /*  1 */
31
    dst_typ_section_tab,        /*  2 */
32
    dst_typ_file_tab,           /*  3 */
33
    dst_typ_block,              /*  4 */
34
    dst_typ_5,
35
    dst_typ_var,
36
    dst_typ_pointer,            /*  7 */
37
    dst_typ_array,              /*  8 */
38
    dst_typ_subrange,           /*  9 */
39
    dst_typ_set,                /* 10 */
40
    dst_typ_implicit_enum,      /* 11 */
41
    dst_typ_explicit_enum,      /* 12 */
42
    dst_typ_short_rec,          /* 13 */
43
    dst_typ_old_record,
44
    dst_typ_short_union,        /* 15 */
45
    dst_typ_old_union,
46
    dst_typ_file,               /* 17 */
47
    dst_typ_offset,             /* 18 */
48
    dst_typ_alias,              /* 19 */
49
    dst_typ_signature,          /* 20 */
50
    dst_typ_21,
51
    dst_typ_old_label,          /* 22 */
52
    dst_typ_scope,              /* 23 */
53
    dst_typ_end_scope,          /* 24 */
54
    dst_typ_25,
55
    dst_typ_26,
56
    dst_typ_string_tab,         /* 27 */
57
    dst_typ_global_name_tab,    /* 28 */
58
    dst_typ_forward,            /* 29 */
59
    dst_typ_aux_size,           /* 30 */
60
    dst_typ_aux_align,          /* 31 */
61
    dst_typ_aux_field_size,     /* 32 */
62
    dst_typ_aux_field_off,      /* 33 */
63
    dst_typ_aux_field_align,    /* 34 */
64
    dst_typ_aux_qual,           /* 35 */
65
    dst_typ_aux_var_bound,      /* 36 */
66
    dst_typ_extension,          /* 37 */
67
    dst_typ_string,             /* 38 */
68
    dst_typ_old_entry,
69
    dst_typ_const,              /* 40 */
70
    dst_typ_reference,          /* 41 */
71
    dst_typ_record,             /* 42 */
72
    dst_typ_union,              /* 43 */
73
    dst_typ_aux_type_deriv,     /* 44 */
74
    dst_typ_locpool,            /* 45 */
75
    dst_typ_variable,           /* 46 */
76
    dst_typ_label,              /* 47 */
77
    dst_typ_entry,              /* 48 */
78
    dst_typ_aux_lifetime,       /* 49 */
79
    dst_typ_aux_ptr_base,       /* 50 */
80
    dst_typ_aux_src_range,      /* 51 */
81
    dst_typ_aux_reg_val,        /* 52 */
82
    dst_typ_aux_unit_names,     /* 53 */
83
    dst_typ_aux_sect_info,      /* 54 */
84
    dst_typ_END_OF_ENUM
85
  }
86
dst_rec_type_t;
87
 
88
 
89
/*
90
   ** Dummy bounds for variably dimensioned arrays:
91
 */
92
#define dst_dummy_array_size  100
93
 
94
 
95
/*
96
   ** Reference to another item in the symbol table.
97
   **
98
   ** The value of a dst_rel_offset_t is the relative offset from the start of the
99
   ** referencing record to the start of the referenced record, string, etc.
100
   **
101
   ** The value of a NIL dst_rel_offset_t is zero.
102
 */
103
 
104
typedef long dst_rel_offset_t ALIGNED1;
105
 
106
 
107
/* FIXME: Here and many places we make assumptions about sizes of host
108
   data types, structure layout, etc.  Only needs to be fixed if we care
109
   about cross-debugging, though.  */
110
 
111
/*
112
   ** Section-relative reference.
113
   **
114
   ** The section index field is an index into the local compilation unit's
115
   ** section table (see dst_rec_section_tab_t)--NOT into the object module
116
   ** section table!
117
   **
118
   ** The sect_offset field is the offset in bytes into the section.
119
   **
120
   ** A NIL dst_sect_ref_t has a sect_index field of zero.  Indexes originate
121
   ** at one.
122
 */
123
 
124
typedef struct
125
  {
126
    unsigned short sect_index;
127
    unsigned long sect_offset ALIGNED1;
128
  }
129
dst_sect_ref_t;
130
 
131
#define dst_sect_index_nil    0
132
#define dst_sect_index_origin 1
133
 
134
 
135
/*
136
   ** Source location descriptor.
137
   **
138
   ** The file_index field is an index into the local compilation unit's
139
   ** file table (see dst_rec_file_tab_t).
140
   **
141
   ** A NIL dst_src_loc_t has a file_index field of zero.  Indexes originate
142
   ** at one.
143
 */
144
 
145
typedef struct
146
  {
147
    boolean reserved:1;         /* reserved for future use */
148
    int file_index:11;          /* index into .blocks source file list */
149
    int line_number:20;         /* source line number */
150
  }
151
dst_src_loc_t;
152
 
153
#define dst_file_index_nil    0
154
#define dst_file_index_origin 1
155
 
156
 
157
/*
158
   ** Standard (primitive) type codes.
159
 */
160
 
161
typedef enum
162
  {
163
    dst_non_std_type,
164
    dst_int8_type,              /* 8 bit integer */
165
    dst_int16_type,             /* 16 bit integer */
166
    dst_int32_type,             /* 32 bit integer */
167
    dst_uint8_type,             /* 8 bit unsigned integer */
168
    dst_uint16_type,            /* 16 bit unsigned integer */
169
    dst_uint32_type,            /* 32 bit unsigned integer */
170
    dst_real32_type,            /* single precision ieee floatining point */
171
    dst_real64_type,            /* double precision ieee floatining point */
172
    dst_complex_type,           /* single precision complex */
173
    dst_dcomplex_type,          /* double precision complex */
174
    dst_bool8_type,             /* boolean =logical*1 */
175
    dst_bool16_type,            /* boolean =logical*2 */
176
    dst_bool32_type,            /* boolean =logical*4 */
177
    dst_char_type,              /* 8 bit ascii character */
178
    dst_string_type,            /* string of 8 bit ascii characters */
179
    dst_ptr_type,               /* univ_pointer */
180
    dst_set_type,               /* generic 256 bit set */
181
    dst_proc_type,              /* generic procedure (signature not specified) */
182
    dst_func_type,              /* generic function (signature not specified) */
183
    dst_void_type,              /* c void type */
184
    dst_uchar_type,             /* c unsigned char */
185
    dst_std_type_END_OF_ENUM
186
  }
187
dst_std_type_t;
188
 
189
 
190
/*
191
   ** General data type descriptor
192
   **
193
   ** If the user_defined_type bit is clear, then the type is a standard type, and
194
   ** the remaining bits contain the dst_std_type_t of the type.  If the bit is
195
   ** set, then the type is defined in a separate dst record, which is referenced
196
   ** by the remaining bits as a dst_rel_offset_t.
197
 */
198
 
199
typedef union
200
  {
201
    struct
202
      {
203
        boolean user_defined_type:1;    /* tag field */
204
        int must_be_zero:23;    /* 23 bits of pad */
205
        dst_std_type_t dtc:8;   /* 8 bit primitive data */
206
      }
207
    std_type;
208
 
209
    struct
210
      {
211
        boolean user_defined_type:1;    /* tag field */
212
        int doffset:31;         /* offset to type record */
213
      }
214
    user_type;
215
  }
216
dst_type_t ALIGNED1;
217
 
218
/* The user_type.doffset field is a 31-bit signed value.  Some versions of C
219
   do not support signed bit fields.  The following macro will extract that
220
   field as a signed value:
221
 */
222
#define dst_user_type_offset(type_rec) \
223
    ( ((int) ((type_rec).user_type.doffset << 1)) >> 1 )
224
 
225
 
226
/*================================================*/
227
/*========== RECORDS IN .blocks SECTION ==========*/
228
/*================================================*/
229
 
230
/*-----------------------
231
  COMPILATION UNIT record
232
  -----------------------
233
  This must be the first record in each .blocks section.
234
  Provides a set of information describing the output of a single compilation
235
  and pointers to additional information for the compilation unit.
236
*/
237
 
238
typedef enum
239
  {
240
    dst_pc_code_locs,           /* ranges in loc strings are pc ranges */
241
    dst_comp_unit_END_OF_ENUM
242
  }
243
dst_comp_unit_flag_t;
244
 
245
typedef enum
246
  {
247
    dst_lang_unk,               /* unknown language */
248
    dst_lang_pas,               /* Pascal */
249
    dst_lang_ftn,               /* FORTRAN */
250
    dst_lang_c,                 /* C */
251
    dst_lang_mod2,              /* Modula-2 */
252
    dst_lang_asm_m68k,          /* 68K assembly language */
253
    dst_lang_asm_a88k,          /* AT assembly language */
254
    dst_lang_ada,               /* Ada */
255
    dst_lang_cxx,               /* C++ */
256
    dst_lang_END_OF_ENUM
257
  }
258
dst_lang_type_t;
259
 
260
typedef struct
261
  {
262
    struct
263
      {
264
        unsigned char major_part;       /* = dst_version_major */
265
        unsigned char minor_part;       /* = dst_version_minor */
266
      }
267
    version;                    /* version of dst */
268
    unsigned short flags;       /* mask of dst_comp_unit_flag_t */
269
    unsigned short lang_type;   /* source language */
270
    unsigned short number_of_blocks;    /* number of blocks records */
271
    dst_rel_offset_t root_block_offset;         /* offset to root block (module?) */
272
    dst_rel_offset_t section_table /* offset to section table record */ ;
273
    dst_rel_offset_t file_table;        /* offset to file table record */
274
    unsigned long data_size;    /* total size of .blocks data */
275
  }
276
dst_rec_comp_unit_t ALIGNED1;
277
 
278
 
279
/*--------------------
280
  SECTION TABLE record
281
  --------------------
282
  There must be one section table associated with each compilation unit.
283
  Other debug records refer to sections via their index in this table.  The
284
  section base addresses in the table are virtual addresses of the sections,
285
  relocated by the linker.
286
*/
287
 
288
typedef struct
289
  {
290
    unsigned short number_of_sections;  /* size of array: */
291
    unsigned long section_base[dst_dummy_array_size] ALIGNED1;
292
  }
293
dst_rec_section_tab_t ALIGNED1;
294
 
295
 
296
/*-----------------
297
  FILE TABLE record
298
  -----------------
299
  There must be one file table associated with each compilation unit describing
300
  the source (and include) files used by each compilation unit.  Other debug
301
  records refer to files via their index in this table.  The first entry is the
302
  primary source file.
303
*/
304
 
305
typedef struct
306
  {
307
    long dtm;                   /* time last modified (time_$clock_t) */
308
    dst_rel_offset_t noffset;   /* offset to name string for source file */
309
  }
310
dst_file_desc_t;
311
 
312
typedef struct
313
  {
314
    unsigned short number_of_files;     /* size of array: */
315
    dst_file_desc_t files[dst_dummy_array_size] ALIGNED1;
316
  }
317
dst_rec_file_tab_t ALIGNED1;
318
 
319
 
320
/*-----------------
321
  NAME TABLE record
322
  -----------------
323
  A name table record may appear as an auxiliary record to the file table,
324
  providing additional qualification of the file indexes for languages that
325
  need it (i.e. Ada).  Name table entries parallel file table entries of the
326
  same file index.
327
*/
328
 
329
typedef struct
330
  {
331
    unsigned short number_of_names;     /* size of array: */
332
    dst_rel_offset_t names[dst_dummy_array_size] ALIGNED1;
333
  }
334
dst_rec_name_tab_t ALIGNED1;
335
 
336
 
337
/*--------------
338
  BLOCK record
339
  --------------
340
  Describes a lexical program block--a procedure, function, module, etc.
341
*/
342
 
343
/* Block types.  These may be used in any way desired by the compiler writers.
344
   The debugger uses them only to give a description to the user of the type of
345
   a block.  The debugger makes no other assumptions about the meaning of any
346
   of these.  For example, the fact that a block is executable (e.g., program)
347
   or not (e.g., module) is expressed in block attributes (see below), not
348
   guessed at from the block type.
349
 */
350
typedef enum
351
  {
352
    dst_block_module,           /* some pascal = modula = ada types */
353
    dst_block_program,
354
    dst_block_procedure,
355
    dst_block_function,         /* C function */
356
    dst_block_subroutine,       /* some fortran block types */
357
    dst_block_block_data,
358
    dst_block_stmt_function,
359
    dst_block_package,          /* a few particular to Ada */
360
    dst_block_package_body,
361
    dst_block_subunit,
362
    dst_block_task,
363
    dst_block_file,             /* a C outer scope? */
364
    dst_block_class,            /* C++ or Simula */
365
    dst_block_END_OF_ENUM
366
  }
367
dst_block_type_t;
368
 
369
/* Block attributes.  This is the information used by the debugger to represent
370
   the semantics of blocks.
371
 */
372
typedef enum
373
  {
374
    dst_block_main_entry,       /* the block's entry point is a main entry into
375
                                   the compilation unit */
376
    dst_block_executable,       /* the block has an entry point */
377
    dst_block_attr_END_OF_ENUM
378
  }
379
dst_block_attr_t;
380
 
381
/* Code range.  Each block has associated with it one or more code ranges. An
382
   individual code range is identified by a range of source (possibly nil) and
383
   a range of executable code.  For example, a block which has its executable
384
   code spread over multiple sections will have one code range per section.
385
 */
386
typedef struct
387
  {
388
    unsigned long code_size;    /* size of executable code (in bytes ) */
389
    dst_sect_ref_t code_start;  /* starting address of executable code */
390
    dst_sect_ref_t lines_start; /* start of line number tables */
391
  }
392
dst_code_range_t;
393
 
394
typedef struct
395
  {
396
    dst_block_type_t block_type:8;
397
    unsigned short flags:8;     /* mask of dst_block_attr_t flags */
398
    dst_rel_offset_t sibling_block_off;         /* offset to next sibling block */
399
    dst_rel_offset_t child_block_off;   /* offset to first contained block */
400
    dst_rel_offset_t noffset;   /* offset to block name string */
401
    dst_sect_ref_t symbols_start;       /* start of debug symbols  */
402
    unsigned short n_of_code_ranges;    /* size of array... */
403
    dst_code_range_t code_ranges[dst_dummy_array_size] ALIGNED1;
404
  }
405
dst_rec_block_t ALIGNED1;
406
 
407
 
408
/*--------------------------
409
  AUX SECT INFO TABLE record
410
  --------------------------
411
  Appears as an auxiliary to a block record.  Expands code range information
412
  by providing references into additional, language-dependent sections for
413
  information related to specific code ranges of the block.  Sect info table
414
  entries parallel code range array entries of the same index.
415
*/
416
 
417
typedef struct
418
  {
419
    unsigned char tag;          /* currently can only be zero */
420
    unsigned char number_of_refs;       /* size of array: */
421
    dst_sect_ref_t refs[dst_dummy_array_size] ALIGNED1;
422
  }
423
dst_rec_sect_info_tab_t ALIGNED1;
424
 
425
/*=================================================*/
426
/*========== RECORDS IN .symbols SECTION ==========*/
427
/*=================================================*/
428
 
429
/*-----------------
430
  CONSTANT record
431
  -----------------
432
  Describes a symbolic constant.
433
*/
434
 
435
typedef struct
436
  {
437
    float r;                    /* real part */
438
    float i;                    /* imaginary part */
439
  }
440
dst_complex_t;
441
 
442
typedef struct
443
  {
444
    double dr;                  /* real part */
445
    double di;                  /* imaginary part */
446
  }
447
dst_double_complex_t;
448
 
449
/* The following record provides a way of describing constant values with
450
   non-standard type and no limit on size.
451
 */
452
typedef union
453
  {
454
    char char_data[dst_dummy_array_size];
455
    short int_data[dst_dummy_array_size];
456
    long long_data[dst_dummy_array_size];
457
  }
458
dst_big_kon_t;
459
 
460
/* Representation of the value of a general constant.
461
 */
462
typedef struct
463
  {
464
    unsigned short length;      /* size of constant value (bytes) */
465
 
466
    union
467
      {
468
        unsigned short kon_int8;
469
        short kon_int16;
470
        long kon_int32 ALIGNED1;
471
        float kon_real ALIGNED1;
472
        double kon_dbl ALIGNED1;
473
        dst_complex_t kon_cplx ALIGNED1;
474
        dst_double_complex_t kon_dcplx ALIGNED1;
475
        char kon_char;
476
        dst_big_kon_t kon ALIGNED1;
477
      }
478
    val;                        /* value data of constant */
479
  }
480
dst_const_t ALIGNED1;
481
 
482
typedef struct
483
  {
484
    dst_rel_offset_t noffset;   /* offset to name string */
485
    dst_src_loc_t src_loc;      /* file/line of const definition */
486
    dst_type_t type_desc;       /* type of this (manifest) constant */
487
    dst_const_t value;
488
  }
489
dst_rec_const_t ALIGNED1;
490
 
491
/*----------------
492
  VARIABLE record
493
  ----------------
494
  Describes a program variable.
495
*/
496
 
497
/* Variable attributes.  These define certain variable semantics to the
498
   debugger.
499
 */
500
typedef enum
501
  {
502
    dst_var_attr_read_only,     /* is read-only (a program literal) */
503
    dst_var_attr_volatile,      /* same as compiler's VOLATILE attribute */
504
    dst_var_attr_global,        /* is a global definition or reference */
505
    dst_var_attr_compiler_gen,  /* is compiler-generated */
506
    dst_var_attr_static,        /* has static location */
507
    dst_var_attr_END_OF_ENUM
508
  }
509
dst_var_attr_t;
510
 
511
typedef struct
512
  {
513
    dst_rel_offset_t noffset;   /* offset to name string */
514
    dst_rel_offset_t loffset;   /* offset to loc string */
515
    dst_src_loc_t src_loc;      /* file/line of variable definition */
516
    dst_type_t type_desc;       /* type descriptor */
517
    unsigned short attributes;  /* mask of dst_var_attr_t flags */
518
  }
519
dst_rec_variable_t ALIGNED1;
520
 
521
 
522
/*----------------
523
  old VAR record
524
 -----------------
525
 Used by older compilers to describe a variable
526
*/
527
 
528
typedef enum
529
  {
530
    dst_var_loc_unknown,        /* Actually defined as "unknown" */
531
    dst_var_loc_abs,            /* Absolute address */
532
    dst_var_loc_sect_off,       /* Absolute address as a section offset */
533
    dst_var_loc_ind_sect_off,   /* An indexed section offset ???? */
534
    dst_var_loc_reg,            /* register */
535
    dst_var_loc_reg_rel,        /* register relative - usually fp */
536
    dst_var_loc_ind_reg_rel,    /* Indexed register relative */
537
    dst_var_loc_ftn_ptr_based,  /* Fortran pointer based */
538
    dst_var_loc_pc_rel,         /* PC relative. Really. */
539
    dst_var_loc_external,       /* External */
540
    dst_var_loc_END_OF_ENUM
541
  }
542
dst_var_loc_t;
543
 
544
/* Locations come in two versions. The sort, and the long. The difference
545
 * between the short and the long is the addition of a statement number
546
 * field to the start andend of the range of the long, and and unkown
547
 * purpose field in the middle. Also, loc_type and loc_index aren't
548
 * bitfields in the long version.
549
 */
550
 
551
typedef struct
552
  {
553
    unsigned short loc_type:4;
554
    unsigned short loc_index:12;
555
    long location;
556
    short start_line;           /* start_line and end_line? */
557
    short end_line;             /* I'm guessing here.       */
558
  }
559
dst_var_loc_short_t;
560
 
561
typedef struct
562
  {
563
    unsigned short loc_type;
564
    unsigned short loc_index;
565
    long location;
566
    short unknown;              /* Always 0003 or 3b3c. Why? */
567
    short start_statement;
568
    short start_line;
569
    short end_statement;
570
    short end_line;
571
  }
572
dst_var_loc_long_t;
573
 
574
 
575
typedef struct
576
  {
577
    dst_rel_offset_t noffset;   /* offset to name string */
578
    dst_src_loc_t src_loc;      /* file/line of description */
579
    dst_type_t type_desc;       /* Type description */
580
    unsigned short attributes;  /* mask of dst_var_attr_t flags */
581
    unsigned short no_of_locs:15;       /* Number of locations */
582
    unsigned short short_locs:1;        /* True if short locations. */
583
    union
584
      {
585
        dst_var_loc_short_t shorts[dst_dummy_array_size];
586
        dst_var_loc_long_t longs[dst_dummy_array_size];
587
      }
588
    locs;
589
  }
590
dst_rec_var_t;
591
 
592
/*----------------
593
  old LABEL record
594
 -----------------
595
 Used by older compilers to describe a label
596
*/
597
 
598
typedef struct
599
  {
600
    dst_rel_offset_t noffset;   /* offset to name string */
601
    dst_src_loc_t src_loc;      /* file/line of description */
602
    char location[12];          /* location string */
603
  }
604
dst_rec_old_label_t ALIGNED1;
605
 
606
/*----------------
607
  POINTER record
608
  ----------------
609
  Describes a pointer type.
610
*/
611
 
612
typedef struct
613
  {
614
    dst_rel_offset_t noffset;   /* offset to the name string for this type */
615
    dst_src_loc_t src_loc;      /* file/line of definition */
616
    dst_type_t type_desc;       /* base type of this pointer */
617
  }
618
dst_rec_pointer_t ALIGNED1;
619
 
620
 
621
/*-------------
622
  ARRAY record
623
  -------------
624
  Describes an array type.
625
 
626
  Multidimensional arrays are described with a number of dst_rec_array_t
627
  records, one per array dimension, each linked to the next through the
628
  elem_type_desc.doffset field.  Each record must have its multi_dim flag
629
  set.
630
 
631
  If column_major is true (as with FORTRAN arrays) then the last array bound in
632
  the declaration is the first array index in memory, which is the opposite of
633
  the usual case (as with Pascal and C arrays).
634
 
635
  Variable array bounds are described by auxiliary records; if aux_var_bound
636
  records are present, the lo_bound and hi_bound fields of this record are
637
  ignored by the debugger.
638
 
639
  span_comp identifies one of the language-dependent ways in which the distance
640
  between successive array elements (span) is calculated.
641
     dst_use_span_field    -- the span is the value of span field.
642
     dst_compute_from_prev -- the span is the size of the previous dimension.
643
     dst_compute_from_next -- the span is the size of the next dimension.
644
  In the latter two cases, the span field contains an amount of padding to add
645
  to the size of the appropriate dimension to calculate the span.
646
*/
647
 
648
typedef enum
649
  {
650
    dst_use_span_field,
651
    dst_compute_from_prev,
652
    dst_compute_from_next,
653
    dst_span_comp_END_OF_ENUM
654
  }
655
dst_span_comp_t;
656
 
657
typedef struct
658
  {
659
    dst_rel_offset_t noffset;   /* offset to name string */
660
    dst_src_loc_t src_loc;      /* file/line of definition */
661
    dst_type_t elem_type_desc;  /* array element type */
662
    dst_type_t indx_type_desc;  /* array index type */
663
    long lo_bound;              /* lower bound of index */
664
    long hi_bound;              /* upper bound of index */
665
    unsigned long span;         /* see above */
666
    unsigned long size;         /* total array size (bytes) */
667
    boolean multi_dim:1;
668
    boolean is_packed:1;        /* true if packed array */
669
    boolean is_signed:1;        /* true if packed elements are signed */
670
    dst_span_comp_t span_comp:2;        /* how to compute span */
671
    boolean column_major:1;
672
    unsigned short reserved:2;  /* must be zero */
673
    unsigned short elem_size:8; /* element size if packed (bits) */
674
  }
675
dst_rec_array_t ALIGNED1;
676
 
677
 
678
/*-----------------
679
  SUBRANGE record
680
  -----------------
681
  Describes a subrange type.
682
*/
683
 
684
/* Variable subrange bounds are described by auxiliary records; if aux_var_bound
685
   records are present, the lo_bound and hi_bound fields of this record are
686
   ignored by the debugger.
687
 */
688
 
689
typedef struct
690
  {
691
    dst_rel_offset_t noffset;   /* offset to name string */
692
    dst_src_loc_t src_loc;      /* file/line of subrange definition */
693
    dst_type_t type_desc;       /* parent type */
694
    long lo_bound;              /* lower bound of subrange */
695
    long hi_bound;              /* upper bound of subrange */
696
    unsigned short size;        /* storage size (bytes) */
697
  }
698
dst_rec_subrange_t ALIGNED1;
699
 
700
 
701
/*---------------
702
  STRING record
703
  ---------------
704
  Describes a string type.
705
*/
706
 
707
/* Variable subrange bounds are described by auxiliary records; if aux_var_bound
708
   records are present, the lo_bound and hi_bound fields of this record are
709
   ignored by the debugger.
710
 */
711
 
712
typedef struct
713
  {
714
    dst_rel_offset_t noffset;   /* offset to name string */
715
    dst_src_loc_t src_loc;      /* file/line of string definition */
716
    dst_type_t elem_type_desc;  /* element type */
717
    dst_type_t indx_type_desc;  /* index type */
718
    long lo_bound;              /* lower bound */
719
    long hi_bound;              /* upper bound */
720
    unsigned long size;         /* total string size (bytes) if fixed */
721
  }
722
dst_rec_string_t ALIGNED1;
723
 
724
 
725
/*---------------
726
  SET record
727
  ---------------
728
  Describes a set type.
729
*/
730
 
731
typedef struct
732
  {
733
    dst_rel_offset_t noffset;   /* offset to name string */
734
    dst_src_loc_t src_loc;      /* file/line of definition */
735
    dst_type_t type_desc;       /* element type */
736
    unsigned short nbits;       /* number of bits in set */
737
    unsigned short size;        /* storage size (bytes) */
738
  }
739
dst_rec_set_t ALIGNED1;
740
 
741
 
742
/*-----------------------------
743
  IMPLICIT ENUMERATION record
744
  -----------------------------
745
  Describes an enumeration type with implicit element values = 0, 1, 2, ...
746
  (Pascal-style).
747
*/
748
 
749
typedef struct
750
  {
751
    dst_rel_offset_t noffset;   /* offset to name string */
752
    dst_src_loc_t src_loc;      /* file/line of definition */
753
    unsigned short nelems;      /* number of elements in enumeration */
754
    unsigned short size;        /* storage size (bytes) */
755
    /* offsets to name strings of elements 0, 1, 2, ... */
756
    dst_rel_offset_t elem_noffsets[dst_dummy_array_size];
757
  }
758
dst_rec_implicit_enum_t ALIGNED1;
759
 
760
 
761
/*-----------------------------
762
  EXPLICIT ENUMERATION record
763
  -----------------------------
764
  Describes an enumeration type with explicitly assigned element values
765
  (C-style).
766
*/
767
 
768
typedef struct
769
  {
770
    dst_rel_offset_t noffset;   /* offset to element name string */
771
    long value;                 /* element value */
772
  }
773
dst_enum_elem_t;
774
 
775
typedef struct
776
  {
777
    dst_rel_offset_t noffset;   /* offset to name string */
778
    dst_src_loc_t src_loc;      /* file/line of definition */
779
    unsigned short nelems;      /* number of elements in enumeration */
780
    unsigned short size;        /* storage size (bytes) */
781
    /* name/value pairs, one describing each enumeration value: */
782
    dst_enum_elem_t elems[dst_dummy_array_size];
783
  }
784
dst_rec_explicit_enum_t ALIGNED1;
785
 
786
 
787
/*-----------------------
788
  RECORD / UNION record
789
  -----------------------
790
  Describes a record (struct) or union.
791
 
792
  If the record is larger than 2**16 bytes then an attached aux record
793
  specifies its size.  Also, if the record is stored in short form then
794
  attached records specify field offsets larger than 2**16 bytes.
795
 
796
  Whether the fields[] array or sfields[] array is used is selected by
797
  the dst_rec_type_t of the overall dst record.
798
*/
799
 
800
/*
801
   Record field descriptor, short form.  This form handles only fields which
802
   are an even number of bytes long, located some number of bytes from the
803
   start of the record.
804
 */
805
typedef struct
806
  {
807
    dst_rel_offset_t noffset;   /* offset to field name string */
808
    dst_type_t type_desc;       /* field type */
809
    unsigned short foffset;     /* field offset from start of record (bytes) */
810
  }
811
dst_short_field_t ALIGNED1;
812
 
813
typedef struct
814
  {
815
    dst_rel_offset_t noffset;   /* offset to name string */
816
    dst_type_t type_desc;       /* field type */
817
    unsigned short foffset;     /* byte offset */
818
    unsigned short is_packed:1; /* True if field is packed */
819
    unsigned short bit_offset:6;        /* Bit offset */
820
    unsigned short size:6;      /* Size in bits */
821
    unsigned short sign:1;      /* True if signed */
822
    unsigned short pad:2;       /* Padding. Must be 0 */
823
  }
824
dst_old_field_t ALIGNED1;
825
 
826
/* Tag enumeration for long record field descriptor:
827
 */
828
typedef enum
829
  {
830
    dst_field_byte,
831
    dst_field_bit,
832
    dst_field_loc,
833
    dst_field_END_OF_ENUM
834
  }
835
dst_field_format_t;
836
 
837
/*
838
   Record field descriptor, long form.  The format of the field information
839
   is identified by the format_tag, which contains one of the above values.
840
   The field_byte variant is equivalent to the short form of field descriptor.
841
   The field_bit variant handles fields which are any number of bits long,
842
   located some number of bits from the start of the record.  The field_loc
843
   variant allows the location of the field to be described by a general loc
844
   string.
845
 */
846
typedef struct
847
  {
848
    dst_rel_offset_t noffset;   /* offset to name of field */
849
    dst_type_t type_desc;       /* type of field */
850
    union
851
      {
852
        struct
853
          {
854
            dst_field_format_t format_tag:2;    /* dst_field_byte */
855
            unsigned long offset:30;    /* offset of field in bytes */
856
          }
857
        field_byte ALIGNED1;
858
        struct
859
          {
860
            dst_field_format_t format_tag:2;    /* dst_field_bit */
861
            unsigned long nbits:6;      /* bit size of field */
862
            unsigned long is_signed:1;  /* signed/unsigned attribute */
863
            unsigned long bit_offset:3;         /* bit offset from byte boundary */
864
            int pad:4;          /* must be zero */
865
            unsigned short byte_offset;         /* offset of byte boundary */
866
          }
867
        field_bit ALIGNED1;
868
        struct
869
          {
870
            dst_field_format_t format_tag:2;    /* dst_field_loc */
871
            int loffset:30;     /* dst_rel_offset_t to loc string */
872
          }
873
        field_loc ALIGNED1;
874
      }
875
    f ALIGNED1;
876
  }
877
dst_field_t;
878
 
879
/* The field_loc.loffset field is a 30-bit signed value.  Some versions of C do
880
   not support signed bit fields.  The following macro will extract that field
881
   as a signed value:
882
 */
883
#define dst_field_loffset(field_rec) \
884
    ( ((int) ((field_rec).f.field_loc.loffset << 2)) >> 2 )
885
 
886
 
887
typedef struct
888
  {
889
    dst_rel_offset_t noffset;   /* offset to record name string */
890
    dst_src_loc_t src_loc;      /* file/line where this record is defined */
891
    unsigned short size;        /* storage size (bytes) */
892
    unsigned short nfields;     /* number of fields in this record */
893
    union
894
      {
895
        dst_field_t fields[dst_dummy_array_size];
896
        dst_short_field_t sfields[dst_dummy_array_size];
897
        dst_old_field_t ofields[dst_dummy_array_size];
898
      }
899
    f;                          /* array of fields */
900
  }
901
dst_rec_record_t ALIGNED1;
902
 
903
 
904
/*-------------
905
  FILE record
906
  -------------
907
  Describes a file type.
908
*/
909
 
910
typedef struct
911
  {
912
    dst_rel_offset_t noffset;   /* offset to name string */
913
    dst_src_loc_t src_loc;      /* file/line where type was defined */
914
    dst_type_t type_desc;       /* file element type */
915
  }
916
dst_rec_file_t ALIGNED1;
917
 
918
 
919
/*---------------
920
  OFFSET record
921
  ---------------
922
   Describes a Pascal offset type.
923
   (This type, an undocumented Domain Pascal extension, is currently not
924
   supported by the debugger)
925
*/
926
 
927
typedef struct
928
  {
929
    dst_rel_offset_t noffset;   /* offset to the name string */
930
    dst_src_loc_t src_loc;      /* file/line of definition */
931
    dst_type_t area_type_desc;  /* area type */
932
    dst_type_t base_type_desc;  /* base type */
933
    long lo_bound;              /* low bound of the offset range */
934
    long hi_bound;              /* high bound of the offset range */
935
    long bias;                  /* bias */
936
    unsigned short scale;       /* scale factor */
937
    unsigned short size;        /* storage size (bytes) */
938
  }
939
dst_rec_offset_t ALIGNED1;
940
 
941
 
942
/*--------------
943
  ALIAS record
944
  --------------
945
  Describes a type alias (e.g., typedef).
946
*/
947
 
948
typedef struct
949
  {
950
    dst_rel_offset_t noffset;   /* offset to name string */
951
    dst_src_loc_t src_loc;      /* file/line of definition */
952
    dst_type_t type_desc;       /* parent type */
953
  }
954
dst_rec_alias_t ALIGNED1;
955
 
956
 
957
/*------------------
958
  SIGNATURE record
959
  ------------------
960
  Describes a procedure/function type.
961
*/
962
 
963
/* Enumeration of argument semantics.  Note that most are mutually
964
   exclusive.
965
 */
966
typedef enum
967
  {
968
    dst_arg_attr_val,           /* passed by value */
969
    dst_arg_attr_ref,           /* passed by reference */
970
    dst_arg_attr_name,          /* passed by name */
971
    dst_arg_attr_in,            /* readable in the callee */
972
    dst_arg_attr_out,           /* writable in the callee */
973
    dst_arg_attr_hidden,        /* not visible in the caller */
974
    dst_arg_attr_END_OF_ENUM
975
  }
976
dst_arg_attr_t;
977
 
978
/* Argument descriptor.  Actually points to a variable record for most of the
979
   information.
980
 */
981
typedef struct
982
  {
983
    dst_rel_offset_t var_offset;        /* offset to variable record */
984
    unsigned short attributes;  /* a mask of dst_arg_attr_t flags */
985
  }
986
dst_arg_t ALIGNED1;
987
 
988
typedef struct
989
  {
990
    dst_rel_offset_t noffset;   /* offset to name string */
991
    dst_src_loc_t src_loc;      /* file/line of function definition */
992
    dst_rel_offset_t result;    /* offset to function result variable record */
993
    unsigned short nargs;       /* number of arguments */
994
    dst_arg_t args[dst_dummy_array_size];
995
  }
996
dst_rec_signature_t ALIGNED1;
997
 
998
/*--------------
999
  SCOPE record
1000
  --------------
1001
  Obsolete. Use the new ENTRY type instead.
1002
  Old compilers may put this in as the first entry in a function,
1003
  terminated by an end of scope entry.
1004
*/
1005
 
1006
typedef struct
1007
  {
1008
    dst_rel_offset_t noffset;   /* Name offset */
1009
    dst_src_loc_t start_line;   /* Starting line */
1010
    dst_src_loc_t end_line;     /* Ending line */
1011
  }
1012
dst_rec_scope_t ALIGNED1;
1013
 
1014
/*--------------
1015
  ENTRY record
1016
  --------------
1017
  Describes a procedure/function entry point.  An entry record is to a
1018
  signature record roughly as a variable record is to a type descriptor record.
1019
 
1020
  The entry_number field is keyed to the entry numbers in .lines -- the
1021
  debugger locates the code location of an entry by searching the line
1022
  number table for an entry numbered with the value of entry_number.  The
1023
  main entry is numbered zero.
1024
*/
1025
 
1026
typedef struct
1027
  {
1028
    dst_rel_offset_t noffset;   /* offset to entry name string */
1029
    dst_rel_offset_t loffset;   /* where to jump to call this entry */
1030
    dst_src_loc_t src_loc;      /* file/line of definition */
1031
    dst_rel_offset_t sig_desc;  /* offset to signature descriptor */
1032
    unsigned int entry_number:8;
1033
    int pad:8;                  /* must be zero */
1034
  }
1035
dst_rec_entry_t ALIGNED1;
1036
 
1037
/*-----------------------
1038
  Old format ENTRY record
1039
  -----------------------
1040
  Supposedly obsolete but still used by some compilers.
1041
 */
1042
 
1043
typedef struct
1044
  {
1045
    dst_rel_offset_t noffset;   /* Offset to entry name string */
1046
    dst_src_loc_t src_loc;      /* Location in source */
1047
    dst_rel_offset_t sig_desc;  /* Signature description */
1048
    char unknown[36];
1049
  }
1050
dst_rec_old_entry_t ALIGNED1;
1051
 
1052
/*--------------
1053
  LABEL record
1054
  --------------
1055
  Describes a program label.
1056
*/
1057
 
1058
typedef struct
1059
  {
1060
    dst_rel_offset_t noffset;   /* offset to label string */
1061
    dst_rel_offset_t loffset;   /* offset to loc string */
1062
    dst_src_loc_t src_loc;      /* file/line of definition */
1063
  }
1064
dst_rec_label_t ALIGNED1;
1065
 
1066
 
1067
/*-----------------------
1068
  AUXILIARY SIZE record
1069
  -----------------------
1070
  May appear in the auxiliary record list of any type or variable record to
1071
  modify the default size of the type or variable.
1072
*/
1073
 
1074
typedef struct
1075
  {
1076
    unsigned long size;         /* size (bytes) */
1077
  }
1078
dst_rec_aux_size_t ALIGNED1;
1079
 
1080
 
1081
/*-----------------------
1082
  AUXILIARY ALIGN record
1083
  -----------------------
1084
  May appear in the auxiliary record list of any type or variable record to
1085
  modify the default alignment of the type or variable.
1086
*/
1087
 
1088
typedef struct
1089
  {
1090
    unsigned short alignment;   /* # of low order zero bits */
1091
  }
1092
dst_rec_aux_align_t ALIGNED1;
1093
 
1094
 
1095
/*-----------------------------
1096
  AUXILIARY FIELD SIZE record
1097
  -----------------------------
1098
  May appear in the auxiliary record list of any RECORD/UNION record to
1099
  modify the default size of a field.
1100
*/
1101
 
1102
typedef struct
1103
  {
1104
    unsigned short field_no;    /* field number */
1105
    unsigned long size;         /* size (bits) */
1106
  }
1107
dst_rec_aux_field_size_t ALIGNED1;
1108
 
1109
 
1110
 
1111
/*-----------------------------
1112
  AUXILIARY FIELD OFFSET record
1113
  -----------------------------
1114
  May appear in the auxiliary record list of any RECORD/UNION record to
1115
  specify a field offset larger than 2**16.
1116
*/
1117
 
1118
typedef struct
1119
  {
1120
    unsigned short field_no;    /* field number */
1121
    unsigned long foffset;      /* offset */
1122
  }
1123
dst_rec_aux_field_off_t ALIGNED1;
1124
 
1125
 
1126
/*-----------------------------
1127
  AUXILIARY FIELD ALIGN record
1128
  -----------------------------
1129
  May appear in the auxiliary record list of any RECORD/UNION record to
1130
  modify the default alignment of a field.
1131
*/
1132
 
1133
typedef struct
1134
  {
1135
    unsigned short field_no;    /* field number */
1136
    unsigned short alignment;   /* number of low order zero bits */
1137
  }
1138
dst_rec_aux_field_align_t ALIGNED1;
1139
 
1140
 
1141
/*----------------------------
1142
  AUXILIARY VAR BOUND record
1143
  ----------------------------
1144
  May appear in the auxiliary record list of any ARRAY, SUBRANGE or STRING
1145
  record to describe a variable bound for the range of the type.
1146
*/
1147
 
1148
typedef enum
1149
  {
1150
    dst_low_bound,              /* the low bound is variable */
1151
    dst_high_bound,             /* the high bound is variable */
1152
    dst_var_bound_END_OF_ENUM
1153
  }
1154
dst_var_bound_t;
1155
 
1156
typedef struct
1157
  {
1158
    unsigned short which;       /* which bound */
1159
    dst_rel_offset_t voffset ALIGNED1;  /* variable that defines bound */
1160
  }
1161
dst_rec_aux_var_bound_t ALIGNED1;
1162
 
1163
 
1164
/*----------------------------------
1165
  AUXILIARY TYPE DERIVATION record
1166
  ----------------------------------
1167
  May appear in the auxiliary record list of any RECORD/UNION record to denote
1168
  class inheritance of that type from a parent type.
1169
 
1170
  Inheritance implies that it is possible to convert the inheritor type to the
1171
  inherited type, retaining those fields which were inherited.  To allow this,
1172
  orig_field_no, a field number into the record type, is provided.  If
1173
  orig_is_pointer is false, then the start of the inherited record is located
1174
  at the location of the field indexed by orig_field_no.  If orig_is_pointer
1175
  is true, then it is located at the address contained in the field indexed
1176
  by orig_field_no (assumed to be a pointer).
1177
*/
1178
 
1179
typedef struct
1180
  {
1181
    dst_type_t parent_type;     /* reference to inherited type */
1182
    unsigned short orig_field_no;
1183
    boolean orig_is_pointer:1;
1184
    int unused:15;              /* must be zero */
1185
  }
1186
dst_rec_aux_type_deriv_t ALIGNED1;
1187
 
1188
 
1189
/*------------------------------------
1190
  AUXILIARY VARIABLE LIFETIME record
1191
  ------------------------------------
1192
  May appear in the auxiliary record list of a VARIABLE record to add location
1193
  information for an additional variable lifetime.
1194
*/
1195
 
1196
typedef struct
1197
  {
1198
    dst_rel_offset_t loffset;
1199
  }
1200
dst_rec_aux_lifetime_t ALIGNED1;
1201
 
1202
 
1203
/*-------------------------------
1204
  AUXILIARY POINTER BASE record
1205
  -------------------------------
1206
  May appear in the auxiliary record list of a VARIABLE record to provide a
1207
  pointer base to substitute for references to any such bases in the location
1208
  string of the variable.  A pointer base is another VARIABLE record.  When
1209
  the variable is evaluated by the debugger, it uses the current value of the
1210
  pointer base variable in computing its location.
1211
 
1212
  This is useful for representing FORTRAN pointer-based variables.
1213
*/
1214
 
1215
typedef struct
1216
  {
1217
    dst_rel_offset_t voffset;
1218
  }
1219
dst_rec_aux_ptr_base_t ALIGNED1;
1220
 
1221
 
1222
/*---------------------------------
1223
  AUXILIARY REGISTER VALUE record
1224
  ---------------------------------
1225
  May appear in the auxiliary record list of an ENTRY record to specify
1226
  a register that must be set to a specific value before jumping to the entry
1227
  point in a debugger "call".  The debugger must set the debuggee register,
1228
  specified by the register code, to the value of the *address* to which the
1229
  location string resolves.  If the address is register-relative, then the
1230
  call cannot be made unless the current stack frame is the lexical parent
1231
  of the entry.  An example of this is when a (Pascal) nested procedure
1232
  contains references to its parent's variables, which it accesses through
1233
  a static link register.  The static link register must be set to some
1234
  address relative to the parent's stack base register.
1235
*/
1236
 
1237
typedef struct
1238
  {
1239
    unsigned short reg;         /* identifies register to set (isp enum) */
1240
    dst_rel_offset_t loffset;   /* references a location string */
1241
  }
1242
dst_rec_aux_reg_val_t ALIGNED1;
1243
 
1244
 
1245
/*==========================================================*/
1246
/*========== RECORDS USED IN .blocks AND .symbols ==========*/
1247
/*==========================================================*/
1248
 
1249
/*---------------------
1250
  STRING TABLE record
1251
  ---------------------
1252
  A string table record contains any number of null-terminated, variable length
1253
  strings.   The length field gives the size in bytes of the text field, which
1254
  can be any size.
1255
 
1256
  The global name table shares this format.  This record appears in the
1257
  .blocks section.  Each string in the table identifies a global defined in
1258
  the current compilation unit.
1259
 
1260
  The loc pool record shares this format as well.  Loc strings are described
1261
  elsewhere.
1262
*/
1263
 
1264
typedef struct
1265
  {
1266
    unsigned long length;
1267
    char text[dst_dummy_array_size];
1268
  }
1269
dst_rec_string_tab_t ALIGNED1;
1270
 
1271
 
1272
/*-----------------------
1273
  AUXILIARY QUAL record
1274
  -----------------------
1275
  May appear in the auxiliary record list of any BLOCK, VARIABLE, or type record
1276
  to provide it with a fully-qualified, language-dependent name.
1277
*/
1278
 
1279
typedef struct
1280
  {
1281
    dst_rel_offset_t lang_qual_name;
1282
  }
1283
dst_rec_aux_qual_t ALIGNED1;
1284
 
1285
 
1286
/*----------------
1287
  FORWARD record
1288
  ----------------
1289
  Reference to a record somewhere else.  This allows identical definitions in
1290
  different scopes to share data.
1291
*/
1292
 
1293
typedef struct
1294
  {
1295
    dst_rel_offset_t rec_off;
1296
  }
1297
dst_rec_forward_t ALIGNED1;
1298
 
1299
 
1300
/*-------------------------------
1301
  AUXILIARY SOURCE RANGE record
1302
  -------------------------------
1303
  May appear in the auxiliary record list of any BLOCK record to specify a
1304
  range of source lines over which the block is active.
1305
*/
1306
 
1307
typedef struct
1308
  {
1309
    dst_src_loc_t first_line;   /* first source line */
1310
    dst_src_loc_t last_line;    /* last source line */
1311
  }
1312
dst_rec_aux_src_range_t ALIGNED1;
1313
 
1314
 
1315
/*------------------
1316
  EXTENSION record
1317
  ------------------
1318
  Provision for "foreign" records, such as might be generated by a non-Apollo
1319
  compiler.  Apollo software will ignore these.
1320
*/
1321
 
1322
typedef struct
1323
  {
1324
    unsigned short rec_size;    /* record size (bytes) */
1325
    unsigned short ext_type;    /* defined by whoever generates it */
1326
    unsigned short ext_data;    /* place-holder for arbitrary amount of data */
1327
  }
1328
dst_rec_extension_t ALIGNED1;
1329
 
1330
 
1331
/*
1332
   ** DEBUG SYMBOL record -- The wrapper for all .blocks and .symbols records.
1333
   **
1334
   ** This record ties together all previous .blocks and .symbols records
1335
   ** together in a union with a common header.  The rec_type field of the
1336
   ** header identifies the record type.  The rec_flags field currently only
1337
   ** defines auxiliary record lists.
1338
   **
1339
   ** If a record carries with it a non-null auxiliary record list, its
1340
   ** dst_flag_has_aux_recs flag is set, and each of the records that follow
1341
   ** it are treated as its auxiliary records, until the end of the compilation
1342
   ** unit or scope is reached, or until an auxiliary record with its
1343
   ** dst_flag_last_aux_rec flag set is reached.
1344
 */
1345
 
1346
typedef enum
1347
  {
1348
    dst_flag_has_aux_recs,
1349
    dst_flag_last_aux_rec,
1350
    dst_rec_flag_END_OF_ENUM
1351
  }
1352
dst_rec_flags_t;
1353
 
1354
typedef struct
1355
  {
1356
    dst_rec_type_t rec_type:8;  /* record type */
1357
    int rec_flags:8;            /* mask of dst_rec_flags_t */
1358
    union                       /* switched on rec_type field above */
1359
      {
1360
        /* dst_typ_pad requires no additional fields */
1361
        dst_rec_comp_unit_t comp_unit_;
1362
        dst_rec_section_tab_t section_tab_;
1363
        dst_rec_file_tab_t file_tab_;
1364
        dst_rec_block_t block_;
1365
        dst_rec_var_t var_;
1366
        dst_rec_pointer_t pointer_;
1367
        dst_rec_array_t array_;
1368
        dst_rec_subrange_t subrange_;
1369
        dst_rec_set_t set_;
1370
        dst_rec_implicit_enum_t implicit_enum_;
1371
        dst_rec_explicit_enum_t explicit_enum_;
1372
        /* dst_typ_short_{rec,union} are represented by 'rec' (below) */
1373
        dst_rec_file_t file_;
1374
        dst_rec_offset_t offset_;
1375
        dst_rec_alias_t alias_;
1376
        dst_rec_signature_t signature_;
1377
        dst_rec_old_label_t old_label_;
1378
        dst_rec_scope_t scope_;
1379
        /* dst_typ_end_scope requires no additional fields */
1380
        dst_rec_string_tab_t string_tab_;
1381
        /* dst_typ_global_name_tab is represented by 'string_tab' (above) */
1382
        dst_rec_forward_t forward_;
1383
        dst_rec_aux_size_t aux_size_;
1384
        dst_rec_aux_align_t aux_align_;
1385
        dst_rec_aux_field_size_t aux_field_size_;
1386
        dst_rec_aux_field_off_t aux_field_off_;
1387
        dst_rec_aux_field_align_t aux_field_align_;
1388
        dst_rec_aux_qual_t aux_qual_;
1389
        dst_rec_aux_var_bound_t aux_var_bound_;
1390
        dst_rec_extension_t extension_;
1391
        dst_rec_string_t string_;
1392
        dst_rec_const_t const_;
1393
        /* dst_typ_reference is represented by 'pointer' (above) */
1394
        dst_rec_record_t record_;
1395
        /* dst_typ_union is represented by 'record' (above) */
1396
        dst_rec_aux_type_deriv_t aux_type_deriv_;
1397
        /* dst_typ_locpool is represented by 'string_tab' (above) */
1398
        dst_rec_variable_t variable_;
1399
        dst_rec_label_t label_;
1400
        dst_rec_entry_t entry_;
1401
        dst_rec_aux_lifetime_t aux_lifetime_;
1402
        dst_rec_aux_ptr_base_t aux_ptr_base_;
1403
        dst_rec_aux_src_range_t aux_src_range_;
1404
        dst_rec_aux_reg_val_t aux_reg_val_;
1405
        dst_rec_name_tab_t aux_unit_names_;
1406
        dst_rec_sect_info_tab_t aux_sect_info_;
1407
      }
1408
    rec_data ALIGNED1;
1409
  }
1410
dst_rec_t, *dst_rec_ptr_t;
1411
 
1412
 
1413
/*===============================================*/
1414
/*========== .lines SECTION DEFINITIONS =========*/
1415
/*===============================================*/
1416
/*
1417
   The .lines section contains a sequence of line number tables.  There is no
1418
   record structure within the section.  The start of the table for a routine
1419
   is pointed to by the block record, and the end of the table is signaled by
1420
   an escape code.
1421
 
1422
   A line number table is a sequence of bytes.  The default entry contains a line
1423
   number delta (-7..+7) in the high 4 bits and a pc delta (0..15) in the low 4
1424
   bits. Special cases, including when one or both of the values is too large
1425
   to fit in 4 bits and other special cases are handled through escape entries.
1426
   Escape entries are identified by the value 0x8 in the high 4 bits.  The low 4
1427
   bits are occupied by a function code.  Some escape entries are followed by
1428
   additional arguments, which may be bytes, words, or longwords.  This data is
1429
   not aligned.
1430
 
1431
   The initial PC offset, file number and line number are zero.  Normally, the
1432
   table begins with a dst_ln_file escape which establishes the initial file
1433
   and line number.  All PC deltas are unsigned (thus the table is ordered by
1434
   increasing PC); line number deltas are signed.  The table ends with a
1435
   dst_ln_end escape, which is followed by a final table entry whose PC delta
1436
   gives the code size of the last statement.
1437
 
1438
   Escape     Semantic
1439
   ---------  ------------------------------------------------------------
1440
   file       Changes file state.  The current source file remains constant
1441
   until another file escape.  Though the line number state is
1442
   also updated by a file escape, a file escape does NOT
1443
   constitute a line table entry.
1444
 
1445
   statement  Alters the statement number of the next table entry.  By
1446
   default, all table entries refer to the first statement on a
1447
   line.  Statement number one is the second statement, and so on.
1448
 
1449
   entry      Identifies the next table entry as the position of an entry
1450
   point for the current block.  The PC position should follow
1451
   any procedure prologue code.  An argument specifies the entry
1452
   number, which is keyed to the entry number of the corresponding
1453
   .symbols ENTRY record.
1454
 
1455
   exit       Identifies the next table entry as the last position within
1456
   the current block before a procedure epiloge and subsequent
1457
   procedure exit.
1458
 
1459
   gap        By default, the executable code corresponding to a table entry
1460
   is assumed to extend to the beginning of the next table entry.
1461
   If this is not the case--there is a "hole" in the table--then
1462
   a gap escape should follow the first table entry to specify
1463
   where the code for that entry ends.
1464
 */
1465
 
1466
#define dst_ln_escape_flag    -8
1467
 
1468
/*
1469
   Escape function codes:
1470
 */
1471
typedef enum
1472
  {
1473
    dst_ln_pad,                 /* pad byte */
1474
    dst_ln_file,                /* file escape.  Next 4 bytes are a dst_src_loc_t */
1475
    dst_ln_dln1_dpc1,           /* 1 byte line delta, 1 byte pc delta */
1476
    dst_ln_dln2_dpc2,           /* 2 bytes line delta, 2 bytes pc delta */
1477
    dst_ln_ln4_pc4,             /* 4 bytes ABSOLUTE line number, 4 bytes ABSOLUTE pc */
1478
    dst_ln_dln1_dpc0,           /* 1 byte line delta, pc delta = 0 */
1479
    dst_ln_ln_off_1,            /* statement escape, stmt # = 1 (2nd stmt on line) */
1480
    dst_ln_ln_off,              /* statement escape, stmt # = next byte */
1481
    dst_ln_entry,               /* entry escape, next byte is entry number */
1482
    dst_ln_exit,                /* exit escape */
1483
    dst_ln_stmt_end,            /* gap escape, 4 bytes pc delta */
1484
    dst_ln_escape_11,           /* reserved */
1485
    dst_ln_escape_12,           /* reserved */
1486
    dst_ln_escape_13,           /* reserved */
1487
    dst_ln_nxt_byte,            /* next byte contains the real escape code */
1488
    dst_ln_end,                 /* end escape, final entry follows */
1489
    dst_ln_escape_END_OF_ENUM
1490
  }
1491
dst_ln_escape_t;
1492
 
1493
/*
1494
   Line number table entry
1495
 */
1496
typedef union
1497
  {
1498
    struct
1499
      {
1500
        unsigned int ln_delta:4;        /* 4 bit line number delta */
1501
        unsigned int pc_delta:4;        /* 4 bit pc delta */
1502
      }
1503
    delta;
1504
 
1505
    struct
1506
      {
1507
        unsigned int esc_flag:4;        /* alias for ln_delta */
1508
        dst_ln_escape_t esc_code:4;     /* escape function code */
1509
      }
1510
    esc;
1511
 
1512
    char sdata;                 /* signed data byte */
1513
    unsigned char udata;        /* unsigned data byte */
1514
  }
1515
dst_ln_entry_t,
1516
 *dst_ln_entry_ptr_t,
1517
  dst_ln_table_t[dst_dummy_array_size];
1518
 
1519
/* The following macro will extract the ln_delta field as a signed value:
1520
 */
1521
#define dst_ln_ln_delta(ln_rec) \
1522
    ( ((short) ((ln_rec).delta.ln_delta << 12)) >> 12 )
1523
 
1524
 
1525
 
1526
 
1527
typedef struct dst_sec_struct
1528
  {
1529
    char *buffer;
1530
    long position;
1531
    long size;
1532
    long base;
1533
  }
1534
dst_sec;
1535
 
1536
 
1537
/* Macros for access to the data */
1538
 
1539
#define DST_comp_unit(x)        ((x)->rec_data.comp_unit_)
1540
#define DST_section_tab(x)      ((x)->rec_data.section_tab_)
1541
#define DST_file_tab(x)         ((x)->rec_data.file_tab_)
1542
#define DST_block(x)            ((x)->rec_data.block_)
1543
#define DST_var(x)              ((x)->rec_data.var_)
1544
#define DST_pointer(x)          ((x)->rec_data.pointer_)
1545
#define DST_array(x)            ((x)->rec_data.array_)
1546
#define DST_subrange(x)         ((x)->rec_data.subrange_)
1547
#define DST_set(x)              ((x)->rec_data.set_)
1548
#define DST_implicit_enum(x)    ((x)->rec_data.implicit_enum_)
1549
#define DST_explicit_enum(x)    ((x)->rec_data.explicit_enum_)
1550
#define DST_short_rec(x)        ((x)->rec_data.record_)
1551
#define DST_short_union(x)      ((x)->rec_data.record_)
1552
#define DST_file(x)             ((x)->rec_data.file_)
1553
#define DST_offset(x)           ((x)->rec_data.offset_)
1554
#define DST_alias(x)            ((x)->rec_data.alias_)
1555
#define DST_signature(x)        ((x)->rec_data.signature_)
1556
#define DST_old_label(x)        ((x)->rec_data.old_label_)
1557
#define DST_scope(x)            ((x)->rec_data.scope_)
1558
#define DST_string_tab(x)       ((x)->rec_data.string_tab_)
1559
#define DST_global_name_tab(x)  ((x)->rec_data.string_tab_)
1560
#define DST_forward(x)          ((x)->rec_data.forward_)
1561
#define DST_aux_size(x)         ((x)->rec_data.aux_size_)
1562
#define DST_aux_align(x)        ((x)->rec_data.aux_align_)
1563
#define DST_aux_field_size(x)   ((x)->rec_data.aux_field_size_)
1564
#define DST_aux_field_off(x)    ((x)->rec_data.aux_field_off_)
1565
#define DST_aux_field_align(x)  ((x)->rec_data.aux_field_align_)
1566
#define DST_aux_qual(x)         ((x)->rec_data.aux_qual_)
1567
#define DST_aux_var_bound(x)    ((x)->rec_data.aux_var_bound_)
1568
#define DST_extension(x)        ((x)->rec_data.extension_)
1569
#define DST_string(x)           ((x)->rec_data.string_)
1570
#define DST_const(x)            ((x)->rec_data.const_)
1571
#define DST_reference(x)        ((x)->rec_data.pointer_)
1572
#define DST_record(x)           ((x)->rec_data.record_)
1573
#define DST_union(x)            ((x)->rec_data.record_)
1574
#define DST_aux_type_deriv(x)   ((x)->rec_data.aux_type_deriv_)
1575
#define DST_locpool(x)          ((x)->rec_data.string_tab_)
1576
#define DST_variable(x)         ((x)->rec_data.variable_)
1577
#define DST_label(x)            ((x)->rec_data.label_)
1578
#define DST_entry(x)            ((x)->rec_data.entry_)
1579
#define DST_aux_lifetime(x)     ((x)->rec_data.aux_lifetime_)
1580
#define DST_aux_ptr_base(x)     ((x)->rec_data.aux_ptr_base_)
1581
#define DST_aux_src_range(x)    ((x)->rec_data.aux_src_range_)
1582
#define DST_aux_reg_val(x)      ((x)->rec_data.aux_reg_val_)
1583
#define DST_aux_unit_names(x)   ((x)->rec_data.aux_unit_names_)
1584
#define DST_aux_sect_info(x)    ((x)->rec_data.aux_sect_info_)
1585
 
1586
 
1587
/*
1588
 * Type codes for loc strings. I'm not entirely certain about all of
1589
 * these, but they seem to work.
1590
 *                              troy@cbme.unsw.EDU.AU
1591
 * If you find a variable whose location can't be decoded, you should
1592
 * find out it's code using "dstdump -s filename". It will record an
1593
 * entry for the variable, and give a text representation of what
1594
 * the locstring means. Before that explaination there will be a
1595
 * number. In the LOCSTRING table, that number will appear before
1596
 * the start of the location string. Location string codes are
1597
 * five bit codes with a 3 bit argument. Check the high 5 bits of
1598
 * the one byte code, and figure out where it goes in here.
1599
 * Then figure out exactly what the meaning is and code it in
1600
 * dstread.c
1601
 *
1602
 * Note that ranged locs mean that the variable is in different locations
1603
 * depending on the current PC. We ignore these because (a) gcc can't handle
1604
 * them, and (b), If you don't use high levels of optimisation they won't
1605
 * occur.
1606
 */
1607
typedef enum
1608
  {
1609
    dst_lsc_end,                /* End of string */
1610
    dst_lsc_indirect,           /* Indirect through previous. Arg == 6 */
1611
    /* Or register ax (x=arg) */
1612
    dst_lsc_dreg,               /* register dx (x=arg) */
1613
    dst_lsc_03,
1614
    dst_lsc_section,            /* Section (arg+1) */
1615
    dst_lsc_05,
1616
    dst_lsc_06,
1617
    dst_lsc_add,                /* Add (arg+1)*2 */
1618
    dst_lsc_sub,                /* Subtract (arg+1)*2 */
1619
    dst_lsc_09,
1620
    dst_lsc_0a,
1621
    dst_lsc_sec_byte,           /* Section of next byte+1 */
1622
    dst_lsc_add_byte,           /* Add next byte (arg == 5) or next word
1623
                                 * (arg == 6)
1624
                                 */
1625
    dst_lsc_sub_byte,           /* Subtract next byte. (arg == 1) or next
1626
                                 * word (arg == 6 ?)
1627
                                 */
1628
    dst_lsc_sbreg,              /* Stack base register (frame pointer). Arg==0 */
1629
    dst_lsc_0f,
1630
    dst_lsc_ranged,             /* location is pc dependent */
1631
    dst_lsc_11,
1632
    dst_lsc_12,
1633
    dst_lsc_13,
1634
    dst_lsc_14,
1635
    dst_lsc_15,
1636
    dst_lsc_16,
1637
    dst_lsc_17,
1638
    dst_lsc_18,
1639
    dst_lsc_19,
1640
    dst_lsc_1a,
1641
    dst_lsc_1b,
1642
    dst_lsc_1c,
1643
    dst_lsc_1d,
1644
    dst_lsc_1e,
1645
    dst_lsc_1f
1646
  }
1647
dst_loc_string_code_t;
1648
 
1649
/* If the following occurs after an addition/subtraction, that addition
1650
 * or subtraction should be multiplied by 256. It's a complete byte, not
1651
 * a code.
1652
 */
1653
 
1654
#define dst_multiply_256        ((char) 0x73)
1655
 
1656
typedef struct
1657
  {
1658
    char code:5;
1659
    char arg:3;
1660
  }
1661
dst_loc_header_t ALIGNED1;
1662
 
1663
typedef union
1664
  {
1665
    dst_loc_header_t header;
1666
    char data;
1667
  }
1668
dst_loc_entry_t ALIGNED1;
1669
 
1670
#undef ALIGNED1
1671
#endif /* apollo_dst_h */

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.