diff options
author | Jeff Law <law@redhat.com> | 1993-11-02 08:06:23 +0000 |
---|---|---|
committer | Jeff Law <law@redhat.com> | 1993-11-02 08:06:23 +0000 |
commit | ff852e117747b0b407dc688b63e59d7a62d8f9d7 (patch) | |
tree | dba329730b8ca56e20f08254b64f92d02432dcf8 /gas/config | |
parent | 97335255fb6b3803cf8e21712feb703682c2f092 (diff) | |
download | gdb-ff852e117747b0b407dc688b63e59d7a62d8f9d7.zip gdb-ff852e117747b0b407dc688b63e59d7a62d8f9d7.tar.gz gdb-ff852e117747b0b407dc688b63e59d7a62d8f9d7.tar.bz2 |
* config/obj-som.h (obj_attach_unwind_info): Define as a hook
so GAS can attach unwind descriptor information to a BFD symbol.
* config/tc-hppa.c (fix_new_hppa): If necessary attach unwind
descriptor information to the BFD symbol.
(md_apply_fix): R_HPPA_ENTRY and R_HPPA_EXIT can never be "applied",
they are simply markers. Make R_HPPA_UNWIND_* handling OBJ_ELF
dependent.
(pa_build_unwind_subspace): Whole function is OBJ_ELF dependent.
(pa_entry): Build a R_HPPA_ENTRY relocation when configured for SOM.
(pa_exit): Likewise, but built a R_HPPA_EXIT relocation. Do not
build "end-of-function" symbols for SOM, they are not needed.
Diffstat (limited to 'gas/config')
-rw-r--r-- | gas/config/tc-hppa.c | 67 |
1 files changed, 61 insertions, 6 deletions
diff --git a/gas/config/tc-hppa.c b/gas/config/tc-hppa.c index 9a6d3ec..8eca5c0 100644 --- a/gas/config/tc-hppa.c +++ b/gas/config/tc-hppa.c @@ -1312,8 +1312,16 @@ fix_new_hppa (frag, where, size, add_symbol, offset, exp, pcrel, hppa_fix->fx_r_format = r_format; hppa_fix->fx_arg_reloc = arg_reloc; if (unwind_desc) - bcopy (unwind_desc, hppa_fix->fx_unwind, 8); + { + bcopy (unwind_desc, hppa_fix->fx_unwind, 8); + /* If necessary call BFD backend function to attach the + unwind bits to the target dependent parts of a BFD symbol. + Yuk. */ +#ifdef obj_attach_unwind_info + obj_attach_unwind_info (add_symbol->bsym, unwind_desc); +#endif + } } /* Parse a .byte, .word, .long expression for the HPPA. Called by @@ -3097,6 +3105,14 @@ md_apply_fix_1 (fixP, val) long new_val, result; unsigned int w1, w2, w; + /* SOM uses R_HPPA_ENTRY and R_HPPA_EXIT relocations which can + never be "applied". They must always be emitted. */ +#ifdef OBJ_SOM + if (fixP->fx_r_type == R_HPPA_ENTRY + || fixP->fx_r_type == R_HPPA_EXIT) + return; +#endif + /* There should have been an HPPA specific fixup associated with the GAS fixup. */ if (hppa_fixP) @@ -3205,6 +3221,8 @@ md_apply_fix_1 (fixP, val) case 32: #ifdef OBJ_ELF + /* These are ELF specific relocations. ELF unfortunately + handles unwinds in a completely different manner. */ if (hppa_fixP->fx_r_type == R_HPPA_UNWIND_ENTRY || hppa_fixP->fx_r_type == R_HPPA_UNWIND_ENTRIES) result = fixP->fx_addnumber; @@ -4248,8 +4266,11 @@ is_same_frag (frag1, frag2) return (FALSE); } -/* Build an entry in the UNWIND subspace from the given - function attributes in CALL_INFO. */ +#ifdef OBJ_ELF +/* Build an entry in the UNWIND subspace from the given function + attributes in CALL_INFO. This is not needed for SOM as using + R_ENTRY and R_EXIT relocations allow the linker to handle building + of the unwind spaces. */ static void pa_build_unwind_subspace (call_info) @@ -4348,6 +4369,7 @@ pa_build_unwind_subspace (call_info) /* Return back to the original segment/subsegment. */ subseg_set (save_seg, save_subseg); } +#endif /* Process a .CALLINFO pseudo-op. This information is used later to build unwind descriptors and maybe one day to support @@ -4618,8 +4640,6 @@ static void pa_entry (unused) int unused; { - char *where; - if (!within_procedure) as_bad ("Misplaced .entry. Ignored."); else @@ -4631,12 +4651,31 @@ pa_entry (unused) } demand_empty_rest_of_line (); within_entry_exit = TRUE; - where = frag_more (0); /* Go back to the last symbol and turn on the BSF_FUNCTION flag. It will not be on if no .EXPORT pseudo-op exists (static function). */ last_call_info->start_symbol->bsym->flags |= BSF_FUNCTION; +#ifdef OBJ_SOM + /* SOM defers building of unwind descriptors until the link phase. + The assembler is responsible for creating an R_ENTRY relocation + to mark the beginning of a region and hold the unwind bits, and + for creating an R_EXIT relocation to mark the end of the region. + + FIXME. ELF should be using the same conventions! The problem + is an unwind requires too much relocation space. Hmmm. Maybe + if we split the unwind bits up between the relocations which + denote the entry and exit points. */ + { + char *where = frag_more (0); + + fix_new_hppa (frag_now, where - frag_now->fr_literal, 0, + last_call_info->start_symbol, (offsetT) 0, NULL, + 0, R_HPPA_ENTRY, e_fsel, 0, 0, + &last_call_info->ci_unwind.descriptor); + } +#endif + return; } @@ -4679,6 +4718,7 @@ process_exit () where = frag_more (0); +#ifdef OBJ_ELF /* ELF does not have EXIT relocations. All we do is create a temporary symbol marking the end of the function. */ { @@ -4723,6 +4763,21 @@ process_exit () table. */ last_call_info->end_frag = frag_now; pa_build_unwind_subspace (last_call_info); +#else + /* SOM defers building of unwind descriptors until the link phase. + The assembler is responsible for creating an R_ENTRY relocation + to mark the beginning of a region and hold the unwind bits, and + for creating an R_EXIT relocation to mark the end of the region. + + FIXME. ELF should be using the same conventions! The problem + is an unwind requires too much relocation space. Hmmm. Maybe + if we split the unwind bits up between the relocations which + denote the entry and exit points. */ + fix_new_hppa (frag_now, where - frag_now->fr_literal, 0, + last_call_info->start_symbol, (offsetT) 0, + NULL, 0, R_HPPA_EXIT, e_fsel, 0, 0, NULL); +#endif + exit_processing_complete = TRUE; } |