diff --git a/gas/ChangeLog b/gas/ChangeLog index 527ddb4602..64f6dcf2c6 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,5 +1,9 @@ Sun Dec 5 17:05:29 1993 Jeffrey A. Law (law@snake.cs.utah.edu) + * config/obj-som.c (obj_read_begin_hook): Delete unused function. + * config/obj-som.h (obj_read_begin_hook): Provide dummy definition. + (TARGET_SYMBOL_FIELDS): Delete. SOM isn't making use of them. + * config/tc-hppa.c (tc_gen_reloc, SOM version): Handle relocation expansion due to rounding mode selectors. Handle R_[RDSN]_MODE relocations for selecting the current rounding mode. diff --git a/gas/config/obj-som.c b/gas/config/obj-som.c index 9f6e4f37fd..fd8943a9bc 100644 --- a/gas/config/obj-som.c +++ b/gas/config/obj-som.c @@ -32,13 +32,6 @@ const pseudo_typeS obj_pseudo_table[] = {NULL} }; -/* SOM does not use this. */ - -void -obj_read_begin_hook () -{ -} - /* Handle a .version directive. FIXME. We just parse the .version directive and throw away the results!. */ @@ -46,7 +39,7 @@ void obj_som_version (unused) int unused; { - SKIP_WHITESPACE () + SKIP_WHITESPACE (); if (*input_line_pointer == '\"') { ++input_line_pointer; @@ -71,27 +64,91 @@ void obj_som_init_stab_section (seg) segT seg; { - segT saved_seg = now_seg, space; + segT saved_seg = now_seg; + segT space; subsegT saved_subseg = now_subseg; + char *p, *file; + unsigned int stroff; /* Make the space which will contain the debug subspaces. */ space = bfd_make_section_old_way (stdoutput, "$GDB_DEBUG$"); /* Set SOM specific attributes for the space. In particular we set - the space "defined", "private", "sort_key", and "spnum" values. */ - obj_set_section_attributes (space, 1, 1, 255, 2); + the space "defined", "private", "sort_key", and "spnum" values. + + Due to a bug in pxdb (called by hpux linker), the sort keys + of the various stabs spaces/subspaces need to be "small". We + reserve range 72/73 which appear to work well. */ + obj_set_section_attributes (space, 1, 1, 72, 2); + bfd_set_section_alignment (stdoutput, space, 2); /* Set the containing space for both stab sections to be $GDB_DEBUG$ (just created above). Also set some attributes which BFD does not understand. In particular, access bits, sort keys, and load quadrant. */ - obj_set_subsection_attributes (seg, space, 0x1f, 255, 0); + obj_set_subsection_attributes (seg, space, 0x1f, 73, 0); + bfd_set_section_alignment (stdoutput, seg, 2); - /* Likewise for the $GDB_STRINGS$ subspace. Note the section - hasn't been created at the time of this call, so we create - it now. */ - seg = subseg_new ("$GDB_STRINGS$", 0); - obj_set_subsection_attributes (seg, space, 0x1f, 254, 0); + /* Make some space for the first stab entry which is special. + It contains information about the length of this file's + stab string and the like. Using it avoids the need to + relocate the stab strings. + + The $GDB_STRINGS$ space will be created as a side effect of + the call to get_stab_string_offset. */ + p = frag_more (12); + as_where (&file, (unsigned int *) NULL); + stroff = get_stab_string_offset (file, "$GDB_STRINGS$"); + know (stroff == 1); + md_number_to_chars (p, stroff, 4); + seg_info (seg)->stabu.p = p; + + /* Set the containing space for both stab sections to be $GDB_DEBUG$ + (just created above). Also set some attributes which BFD does + not understand. In particular, access bits, sort keys, and load + quadrant. */ + seg = bfd_get_section_by_name (stdoutput, "$GDB_STRINGS$"); + obj_set_subsection_attributes (seg, space, 0x1f, 72, 0); + bfd_set_section_alignment (stdoutput, seg, 2); subseg_set (saved_seg, saved_subseg); } + +/* Fill in the counts in the first entry in a .stabs section. */ + +static void +adjust_stab_sections (abfd, sec, xxx) + bfd *abfd; + asection *sec; + PTR xxx; +{ + asection *strsec; + char *p; + int strsz, nsyms; + + if (strcmp ("$GDB_SYMBOLS$", sec->name)) + return; + + strsec = bfd_get_section_by_name (abfd, "$GDB_STRINGS$"); + if (strsec) + strsz = bfd_section_size (abfd, strsec); + else + strsz = 0; + nsyms = bfd_section_size (abfd, sec) / 12 - 1; + + p = seg_info (sec)->stabu.p; + assert (p != 0); + + bfd_h_put_16 (abfd, (bfd_vma) nsyms, (bfd_byte *) p + 6); + bfd_h_put_32 (abfd, (bfd_vma) strsz, (bfd_byte *) p + 8); +} + +/* Called late in the asssembly phase to adjust the special + stab entry. This is where any other late object-file dependent + processing which should happen. */ + +void +som_frob_file () +{ + bfd_map_over_sections (stdoutput, adjust_stab_sections, (PTR) 0); +} diff --git a/gas/config/obj-som.h b/gas/config/obj-som.h index 783468535e..5d2bbf816b 100644 --- a/gas/config/obj-som.h +++ b/gas/config/obj-som.h @@ -34,9 +34,6 @@ #define TRUE !FALSE #endif -#define TARGET_SYMBOL_FIELDS int local:1; unsigned long sy_name_offset; - - /* should be conditional on address size! */ #define som_symbol(asymbol) ((som_symbol_type *)(&(asymbol)->the_bfd)) @@ -54,6 +51,7 @@ extern void obj_som_version PARAMS ((int)); extern void obj_som_init_stab_section PARAMS ((segT)); #define obj_symbol_new_hook(s) {;} +#define obj_read_begin_hook() {;} /* SOM has several attributes for spaces/subspaces which can not be easily expressed in BFD. We use these macros to trigger calls @@ -64,6 +62,10 @@ extern void obj_som_init_stab_section PARAMS ((segT)); /* Likewise for symbol types. */ #define obj_set_symbol_type bfd_som_set_symbol_type +/* This is the trigger for calling a BFD routine to attach unwind + information to a function symbol. */ +#define obj_attach_unwind_info bfd_som_attach_unwind_info + /* Stabs go in a separate sections. GDB expects to find them in sections with the names $GDB_SYMBOLS$ and $GDB_STRINGS$ rather than .stab and .stabstr. */