diff options
-rw-r--r-- | gas/config/obj-som.c | 23 | ||||
-rw-r--r-- | gas/config/tc-hppa.c | 82 |
2 files changed, 89 insertions, 16 deletions
diff --git a/gas/config/obj-som.c b/gas/config/obj-som.c index a73dad3..77f6335 100644 --- a/gas/config/obj-som.c +++ b/gas/config/obj-som.c @@ -35,6 +35,9 @@ const pseudo_typeS obj_pseudo_table[] = static int version_seen = 0; static int copyright_seen = 0; +/* Unused by SOM. */ +void obj_read_begin_hook () {} + /* Handle a .version directive. */ void @@ -203,12 +206,28 @@ adjust_stab_sections (abfd, sec, xxx) bfd_h_put_32 (abfd, (bfd_vma) strsz, (bfd_byte *) p + 8); } +/* Adjust the VMA address for each $CODE$ subspace. */ +static void +adjust_code_sections (abfd, sec, xxx) + bfd *abfd; + asection *sec; + PTR xxx; +{ + static unsigned size_so_far = 0; + + if (strcmp (sec->name, "$CODE$")) + return; + + bfd_set_section_vma (stdoutput, sec, size_so_far); + size_so_far += bfd_get_section_size_before_reloc (sec); +} + /* 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. */ + stab entry and to set the starting address for each code subspace. */ void som_frob_file () { bfd_map_over_sections (stdoutput, adjust_stab_sections, (PTR) 0); + bfd_map_over_sections (stdoutput, adjust_code_sections, (PTR) 0); } diff --git a/gas/config/tc-hppa.c b/gas/config/tc-hppa.c index b070ae2..a868588 100644 --- a/gas/config/tc-hppa.c +++ b/gas/config/tc-hppa.c @@ -1348,7 +1348,11 @@ md_assemble (str) /* If we are within a procedure definition, make sure we've defined a label for the procedure; handle case where the - label was defined after the .PROC directive. */ + label was defined after the .PROC directive. + + Note there's not need to diddle with the segment or fragment + for the label symbol in this case. We have already switched + into the new $CODE$ subspace at this point. */ if (within_procedure && last_call_info->start_symbol == NULL) { label_symbol_struct *label_symbol = pa_get_label (); @@ -1359,6 +1363,19 @@ md_assemble (str) { last_call_info->start_symbol = label_symbol->lss_label; label_symbol->lss_label->bsym->flags |= BSF_FUNCTION; +#ifdef OBJ_SOM + /* Also handle allocation of a fixup to hold the unwind + information when the label appears after the proc/procend. */ + if (within_entry_exit) + { + 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, + (char *) &last_call_info->ci_unwind.descriptor); + } +#endif } else as_bad ("Missing function name for .PROC (corrupted label chain)"); @@ -2915,9 +2932,11 @@ md_apply_fix (fixP, valp) if ((fixP->fx_addsy && fixP->fx_addsy->bsym->section == &bfd_und_section) || (fixP->fx_subsy && fixP->fx_subsy->bsym->section == &bfd_und_section) - || (fixP->fx_addsy + || (fixP->fx_pcrel + && fixP->fx_addsy && S_GET_SEGMENT (fixP->fx_addsy) != hppa_fixP->segment) - || (fixP->fx_subsy + || (fixP->fx_pcrel + && fixP->fx_subsy && S_GET_SEGMENT (fixP->fx_subsy) != hppa_fixP->segment)) return 1; @@ -4369,10 +4388,6 @@ pa_entry (unused) demand_empty_rest_of_line (); within_entry_exit = TRUE; - /* 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 @@ -4383,14 +4398,15 @@ pa_entry (unused) 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); + if (last_call_info->start_symbol != NULL) + { + 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, - (char *) &last_call_info->ci_unwind.descriptor); - } + 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, + (char *) &last_call_info->ci_unwind.descriptor); + } #endif } @@ -4793,6 +4809,7 @@ pa_proc (unused) int unused; { struct call_info *call_info; + segT seg; if (within_procedure) as_fatal ("Nested procedures"); @@ -4801,6 +4818,33 @@ pa_proc (unused) callinfo_found = FALSE; within_procedure = TRUE; + /* Create a new CODE subspace for each procedure if we are not + using space/subspace aliases. */ + if (!USE_ALIASES && call_info_root != NULL) + { + /* Force creation of a new $CODE$ subspace; inherit attributes from + the first $CODE$ subspace. */ + seg = subseg_force_new ("$CODE$", 0); + + /* Now set the flags. */ + bfd_set_section_flags (stdoutput, seg, + bfd_get_section_flags (abfd, text_section)); + + /* Record any alignment request for this section. */ + record_alignment (seg, + bfd_get_section_alignment (stdoutput, text_section)); + + /* Change the "text_section" to be our new $CODE$ subspace. */ + text_section = seg; + subseg_set (text_section, 0); + +#ifdef obj_set_subsection_attributes + /* Need a way to inherit the the access bits, sort key and quadrant + from the first $CODE$ subspace. FIXME. */ + obj_set_subsection_attributes (seg, current_space->sd_seg, 0x2c, 24, 0); +#endif + } + /* Create another call_info structure. */ call_info = (struct call_info *) xmalloc (sizeof (struct call_info)); @@ -4839,6 +4883,16 @@ pa_proc (unused) { last_call_info->start_symbol = label_symbol->lss_label; label_symbol->lss_label->bsym->flags |= BSF_FUNCTION; + if (! USE_ALIASES) + { + /* The label was defined in a different segment. Fix that + along with the value and associated fragment. */ + S_SET_SEGMENT (last_call_info->start_symbol, now_seg); + S_SET_VALUE (last_call_info->start_symbol, + ((char*)obstack_next_free (&frags) + - frag_now->fr_literal)); + last_call_info->start_symbol->sy_frag = frag_now; + } } else as_bad ("Missing function name for .PROC (corrupted label chain)"); |