aboutsummaryrefslogtreecommitdiff
path: root/gas
diff options
context:
space:
mode:
Diffstat (limited to 'gas')
-rw-r--r--gas/ecoff.c214
1 files changed, 99 insertions, 115 deletions
diff --git a/gas/ecoff.c b/gas/ecoff.c
index cfd0901..ba6ff52 100644
--- a/gas/ecoff.c
+++ b/gas/ecoff.c
@@ -120,31 +120,31 @@
array, pointer, function, etc. qualifiers. The
current base types that I have documentation for are:
- btNil -- undefined
+ btNil -- undefined
btAdr -- address - integer same size as ptr
- btChar -- character
- btUChar -- unsigned character
- btShort -- short
- btUShort -- unsigned short
- btInt -- int
- btUInt -- unsigned int
- btLong -- long
- btULong -- unsigned long
- btFloat -- float (real)
- btDouble -- Double (real)
- btStruct -- Structure (Record)
- btUnion -- Union (variant)
- btEnum -- Enumerated
- btTypedef -- defined via a typedef isymRef
- btRange -- subrange of int
- btSet -- pascal sets
- btComplex -- fortran complex
- btDComplex -- fortran double complex
- btIndirect -- forward or unnamed typedef
- btFixedDec -- Fixed Decimal
- btFloatDec -- Float Decimal
- btString -- Varying Length Character String
- btBit -- Aligned Bit String
+ btChar -- character
+ btUChar -- unsigned character
+ btShort -- short
+ btUShort -- unsigned short
+ btInt -- int
+ btUInt -- unsigned int
+ btLong -- long
+ btULong -- unsigned long
+ btFloat -- float (real)
+ btDouble -- Double (real)
+ btStruct -- Structure (Record)
+ btUnion -- Union (variant)
+ btEnum -- Enumerated
+ btTypedef -- defined via a typedef isymRef
+ btRange -- subrange of int
+ btSet -- pascal sets
+ btComplex -- fortran complex
+ btDComplex -- fortran double complex
+ btIndirect -- forward or unnamed typedef
+ btFixedDec -- Fixed Decimal
+ btFloatDec -- Float Decimal
+ btString -- Varying Length Character String
+ btBit -- Aligned Bit String
btPicture -- Picture
btVoid -- Void (MIPS cc revision >= 2.00)
@@ -152,12 +152,12 @@
current type qualifier fields I have documentation for
are:
- tqNil -- no more qualifiers
- tqPtr -- pointer
- tqProc -- procedure
- tqArray -- array
- tqFar -- 8086 far pointers
- tqVol -- volatile
+ tqNil -- no more qualifiers
+ tqPtr -- pointer
+ tqProc -- procedure
+ tqArray -- array
+ tqFar -- 8086 far pointers
+ tqVol -- volatile
The dense number table is used in the front ends, and disappears by
@@ -266,7 +266,7 @@
}
Mips-tdump produces the following information:
-
+
Global file header:
magic number 0x162
# sections 2
@@ -275,12 +275,12 @@
symbolic header size 96
optional header 56
flags 0x0
-
+
Symbolic header, magic number = 0x7009, vstamp = 1.31:
-
+
Info Offset Number Bytes
==== ====== ====== =====
-
+
Line numbers 380 4 4 [13]
Dense numbers 0 0 0
Procedures Tables 384 1 52
@@ -292,14 +292,14 @@
File Tables 1008 2 144
Relative Files 0 0 0
External Symbols 1152 20 320
-
+
File #0, "hello2.c"
-
+
Name index = 1 Readin = No
Merge = No Endian = LITTLE
Debug level = G2 Language = C
Adr = 0x00000000
-
+
Info Start Number Size Offset
==== ===== ====== ==== ======
Local strings 0 15 15 784
@@ -309,7 +309,7 @@
Procedures 0 1 52 384
Auxiliary symbols 0 14 56 628
Relative Files 0 0 0 0
-
+
There are 6 local symbols, starting at 436
Symbol# 0: "hello2.c"
@@ -953,7 +953,7 @@ typedef struct efdr {
} efdr_t;
/* Pre-initialized extended file structure. */
-static const efdr_t init_file =
+static const efdr_t init_file =
{
{ /* FDR structure */
0, /* adr: memory address of beginning of file */
@@ -1401,6 +1401,7 @@ static int debug = 0; /* trace functions */
#endif
static int stabs_seen = 0; /* != 0 if stabs have been seen */
+static int current_file_idx;
/* Pseudo symbol to use when putting stabs into the symbol table. */
#ifndef STABS_SYMBOL
@@ -1462,10 +1463,7 @@ static unsigned long ecoff_build_ss
static unsigned long ecoff_build_fdr
PARAMS ((const struct ecoff_debug_swap *backend, char **buf, char **bufend,
unsigned long offset));
-static unsigned long ecoff_build_ext
- PARAMS ((const struct ecoff_debug_swap *backend, char **buf, char **bufend,
- unsigned long offset, varray_t *ext_strings,
- struct hash_control *ext_str_hash));
+static void ecoff_setup_ext PARAMS ((void));
static page_t *allocate_cluster PARAMS ((unsigned long npages));
static page_t *allocate_page PARAMS ((void));
static scope_t *allocate_scope PARAMS ((void));
@@ -1936,7 +1934,7 @@ add_aux_sym_tir (t, state, hash_tbl)
ret = vp->num_allocated++;
/* Add bitfield length if it exists.
-
+
NOTE: Mips documentation claims bitfield goes at the end of the
AUX record, but the DECstation compiler emits it here.
(This would only make a difference for enum bitfields.)
@@ -2232,7 +2230,7 @@ add_file (file_name, indx)
&file_desc.last->datum->file[file_desc.objects_last_page++];
*fil_ptr = init_file;
- fil_ptr->file_index = indx;
+ fil_ptr->file_index = current_file_idx++;
++file_desc.num_allocated;
/* Allocate the string hash table. */
@@ -2373,7 +2371,7 @@ ecoff_directive_begin (ignore)
demand_empty_rest_of_line ();
return;
}
-
+
name = input_line_pointer;
name_end = get_symbol_end ();
@@ -2951,7 +2949,7 @@ ecoff_directive_end (ignore)
name = input_line_pointer;
name_end = get_symbol_end ();
-
+
ch = *name;
if (! is_name_beginner (ch))
{
@@ -3120,7 +3118,13 @@ ecoff_directive_frame (ignore)
cur_proc_ptr->pdr.pcreg = tc_get_register (0);
+#if 0 /* Alpha-OSF1 adds "the offset of saved $a0 from $sp", according
+ to Sandro. I don't yet know where this value should be stored, if
+ anywhere. */
demand_empty_rest_of_line ();
+#else
+ s_ignore (42);
+#endif
}
/* Parse .mask directives. */
@@ -3289,6 +3293,7 @@ ecoff_stab (what, string, type, other, desc)
st_t st;
sc_t sc;
symint_t indx;
+ localsym_t *hold = NULL;
/* We don't handle .stabd. */
if (what != 's' && what != 'n')
@@ -3359,7 +3364,7 @@ ecoff_stab (what, string, type, other, desc)
if (listing && (type == N_SO || type == N_SOL))
listing_source_file (string);
#endif
-
+
if (isdigit (*input_line_pointer)
|| *input_line_pointer == '-'
|| *input_line_pointer == '+')
@@ -3401,8 +3406,17 @@ ecoff_stab (what, string, type, other, desc)
indx = ECOFF_MARK_STAB (type);
}
+ /* Don't store the stabs symbol we are creating as the type of the
+ ECOFF symbol. We want to compute the type of the ECOFF symbol
+ independently. */
+ if (sym != (symbolS *) NULL)
+ hold = sym->ecoff_symbol;
+
(void) add_ecoff_symbol (string, st, sc, sym, value, indx);
+ if (sym != (symbolS *) NULL)
+ sym->ecoff_symbol = hold;
+
/* Restore normal file type. */
cur_file_ptr = save_file_ptr;
}
@@ -3546,7 +3560,7 @@ ecoff_build_lineno (backend, buf, bufend, offset, linecntptr)
}
last = (lineno_list_t *) NULL;
- }
+ }
totcount += count;
@@ -3778,8 +3792,9 @@ ecoff_build_symbols (backend, buf, bufend, offset)
seg = S_GET_SEGMENT (as_sym);
segname = segment_name (seg);
- if (S_IS_EXTERNAL (as_sym)
- || ! S_IS_DEFINED (as_sym))
+ if (! ECOFF_IS_STAB (&sym_ptr->ecoff_sym.asym)
+ && (S_IS_EXTERNAL (as_sym)
+ || ! S_IS_DEFINED (as_sym)))
st = st_Global;
else if (seg == text_section)
st = st_Label;
@@ -3954,7 +3969,8 @@ ecoff_build_symbols (backend, buf, bufend, offset)
/* Record the local symbol index and file number in
case this is an external symbol. Note that this
destroys the asym.index field. */
- if (as_sym != (symbolS *) NULL)
+ if (as_sym != (symbolS *) NULL
+ && as_sym->ecoff_symbol == sym_ptr)
{
if (sym_ptr->ecoff_sym.asym.st == st_Proc
|| sym_ptr->ecoff_sym.asym.st == st_StaticProc)
@@ -3991,7 +4007,7 @@ ecoff_build_procs (backend, buf, bufend, offset)
vlinks_t *file_link;
pdr_out = *buf + offset;
-
+
first_fil = 1;
iproc = 0;
@@ -4082,7 +4098,7 @@ ecoff_build_aux (backend, buf, bufend, offset)
bigendian = stdoutput->xvec->header_byteorder_big_p;
aux_out = (union aux_ext *) (*buf + offset);
-
+
iaux = 0;
/* The aux entries are stored by file. */
@@ -4308,27 +4324,15 @@ ecoff_build_fdr (backend, buf, bufend, offset)
return offset + ifile * external_fdr_size;
}
-/* Swap out the external symbols. These are the symbols that the
- machine independent code has put in the symtab for the BFD. */
+/* Set up the external symbols. These are supposed to be handled by
+ the backend. This routine just gets the right information and
+ calls a backend function to deal with it. */
-static unsigned long
-ecoff_build_ext (backend, buf, bufend, offset, ext_strings, ext_str_hash)
- const struct ecoff_debug_swap *backend;
- char **buf;
- char **bufend;
- unsigned long offset;
- varray_t *ext_strings;
- struct hash_control *ext_str_hash;
+static void
+ecoff_setup_ext ()
{
- const bfd_size_type external_ext_size = backend->external_ext_size;
- void (* const swap_ext_out) PARAMS ((bfd *, const EXTR *, PTR))
- = backend->swap_ext_out;
register symbolS *sym;
- char *ext_out;
- long iext;
- ext_out = *buf + offset;
- iext = 0;
for (sym = symbol_rootP; sym != (symbolS *) NULL; sym = symbol_next (sym))
{
if (sym->ecoff_symbol == NULL)
@@ -4344,20 +4348,8 @@ ecoff_build_ext (backend, buf, bufend, offset, ext_strings, ext_str_hash)
sym->ecoff_symbol->ecoff_sym.asym.index = indexNil;
}
- sym->ecoff_symbol->ecoff_sym.asym.iss =
- add_string (ext_strings, ext_str_hash, S_GET_NAME (sym),
- (shash_t **) NULL);
- if (*bufend - ext_out < external_ext_size)
- ext_out = ecoff_add_bytes (buf, bufend, ext_out, external_ext_size);
- (*swap_ext_out) (stdoutput, &sym->ecoff_symbol->ecoff_sym, ext_out);
-#ifdef obj_set_sym_index
- obj_set_sym_index (as_sym->bsym, iext);
-#endif
- ext_out += external_ext_size;
- ++iext;
+ obj_ecoff_set_ext (sym, &sym->ecoff_symbol->ecoff_sym);
}
-
- return offset + iext * external_ext_size;
}
/* Build the ECOFF dbeugging information. */
@@ -4379,12 +4371,6 @@ ecoff_build_debug (hdr, bufp, backend)
char *buf;
char *bufend;
unsigned long offset;
- char *extbuf;
- char *extbufend;
- unsigned long extoffset;
- varray_t ext_strings;
- static varray_t init_ext_strings = INIT_VARRAY (char);
- struct hash_control *ext_str_hash;
/* Make sure we have a file. */
if (first_file == (efdr_t *) NULL)
@@ -4497,24 +4483,6 @@ ecoff_build_debug (hdr, bufp, backend)
offset = ecoff_build_ss (backend, &buf, &bufend, offset);
hdr->issMax = offset - hdr->cbSsOffset;
- /* Build the external symbols and external strings. We build these
- now because we want to copy out the external strings now. We
- copy out the external symbol information down below. */
- extbuf = xmalloc (PAGE_SIZE);
- extbufend = extbuf + PAGE_SIZE;
- ext_strings = init_ext_strings;
- ext_str_hash = hash_new ();
- extoffset = ecoff_build_ext (backend, &extbuf, &extbufend,
- (unsigned long) 0, &ext_strings,
- ext_str_hash);
-
- /* Copy out the external strings. */
- hdr->cbSsExtOffset = offset;
- offset += ecoff_build_strings (&buf, &bufend, offset, &ext_strings);
- offset = ecoff_padding_adjust (backend, &buf, &bufend, offset,
- (char **) NULL);
- hdr->issExtMax = offset - hdr->cbSsExtOffset;
-
/* We don't use relative file descriptors. */
hdr->crfd = 0;
hdr->cbRfdOffset = 0;
@@ -4524,13 +4492,13 @@ ecoff_build_debug (hdr, bufp, backend)
offset = ecoff_build_fdr (backend, &buf, &bufend, offset);
hdr->ifdMax = (offset - hdr->cbFdOffset) / backend->external_fdr_size;
- /* Copy out the external symbols. */
- hdr->cbExtOffset = offset;
- if (bufend - (buf + offset) < extoffset)
- (void) ecoff_add_bytes (&buf, &bufend, buf + offset, extoffset);
- memcpy (buf + offset, extbuf, extoffset);
- offset += extoffset;
- hdr->iextMax = (offset - hdr->cbExtOffset) / backend->external_ext_size;
+ /* Set up the external symbols, which are handled by the BFD back
+ end. */
+ hdr->issExtMax = 0;
+ hdr->cbSsExtOffset = 0;
+ hdr->iextMax = 0;
+ hdr->cbExtOffset = 0;
+ ecoff_setup_ext ();
know ((offset & (backend->debug_align - 1)) == 0);
@@ -4931,4 +4899,20 @@ allocate_lineno_list ()
return ptr;
}
+ecoff_set_gp_prolog_size (sz)
+ int sz;
+{
+ if (cur_proc_ptr == 0)
+ abort ();
+
+ cur_proc_ptr->pdr.gp_prologue = sz;
+ if (cur_proc_ptr->pdr.gp_prologue != sz)
+ {
+ as_warn ("GP prologue size exceeds field size, using 0 instead");
+ cur_proc_ptr->pdr.gp_prologue = 0;
+ }
+
+ cur_proc_ptr->pdr.gp_used = 1;
+}
+
#endif /* ECOFF_DEBUGGING */