aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gas/ChangeLog8
-rw-r--r--gas/config/tc-hppa.c27
2 files changed, 28 insertions, 7 deletions
diff --git a/gas/ChangeLog b/gas/ChangeLog
index 1eee5ce..0872e46 100644
--- a/gas/ChangeLog
+++ b/gas/ChangeLog
@@ -1,3 +1,11 @@
+Tue Aug 10 12:58:31 1999 Jeffrey A Law (law@cygnus.com)
+
+ * config/tc-hppa.c (UNWIND_SECTION_NAME): Define for ELF.
+ (pa_build_unwind_subspace): Remove #if 0 wrapper. Select a
+ suitable relocation based on the size of the target's pointer.
+ Always Use subsegment zero for the unwinders.
+ (pa_level): Handle "2.0w".
+
Mon Aug 9 20:02:22 1998 J"orn Rennecke <amylaar@cygnus.co.uk>
* config/tc-d30v.c (write_2_short): Don't group repeat instructions
diff --git a/gas/config/tc-hppa.c b/gas/config/tc-hppa.c
index f7955bc..7f38fa6 100644
--- a/gas/config/tc-hppa.c
+++ b/gas/config/tc-hppa.c
@@ -59,6 +59,8 @@ typedef elf_symbol_type obj_symbol_type;
to store a copyright string. */
#define obj_version obj_elf_version
#define obj_copyright obj_elf_version
+
+#define UNWIND_SECTION_NAME ".PARISC.unwind"
#endif
#ifdef OBJ_SOM
@@ -4512,17 +4514,21 @@ static void
pa_build_unwind_subspace (call_info)
struct call_info *call_info;
{
-#if 0
char *unwind;
asection *seg, *save_seg;
+ asymbol *sym;
subsegT subseg, save_subseg;
- int i;
+ int i, reloc;
char c, *p;
+ if (bfd_get_arch_info (abfd)->bits_per_address == 32)
+ reloc = R_PARISC_DIR32
+ else
+ reloc = R_PARISC_SEGREL32
+
/* Get into the right seg/subseg. This may involve creating
the seg the first time through. Make sure to have the
old seg/subseg so that we can reset things when we are done. */
- subseg = SUBSEG_UNWIND;
seg = bfd_get_section_by_name (stdoutput, UNWIND_SECTION_NAME);
if (seg == ASEC_NULL)
{
@@ -4534,7 +4540,7 @@ pa_build_unwind_subspace (call_info)
save_seg = now_seg;
save_subseg = now_subseg;
- subseg_set (seg, subseg);
+ subseg_set (seg, 0);
/* Get some space to hold relocation information for the unwind
@@ -4545,7 +4551,8 @@ pa_build_unwind_subspace (call_info)
/* Relocation info. for start offset of the function. */
fix_new_hppa (frag_now, p - frag_now->fr_literal, 4,
call_info->start_symbol, (offsetT) 0,
- (expressionS *) NULL, 0, R_PARISC_DIR32, e_fsel, 32, 0, NULL);
+ (expressionS *) NULL, 0, reloc,
+ e_fsel, 32, 0, NULL);
p = frag_more (4);
md_number_to_chars (p, 0, 4);
@@ -4560,7 +4567,8 @@ pa_build_unwind_subspace (call_info)
fix_new_hppa (frag_now, p - frag_now->fr_literal, 4,
call_info->end_symbol, (offsetT) 0,
- (expressionS *) NULL, 0, R_PARISC_DIR32, e_fsel, 32, 0, NULL);
+ (expressionS *) NULL, 0, reloc,
+ e_fsel, 32, 0, NULL);
/* Dump it. */
unwind = (char *) &call_info->ci_unwind;
@@ -4574,7 +4582,6 @@ pa_build_unwind_subspace (call_info)
/* Return back to the original segment/subsegment. */
subseg_set (save_seg, save_subseg);
-#endif
}
#endif
@@ -5255,6 +5262,12 @@ pa_level (unused)
if (!bfd_set_arch_mach (stdoutput, bfd_arch_hppa, 11))
as_warn (_("could not set architecture and machine"));
}
+ else if (strncmp (level, "2.0w", 4) == 0)
+ {
+ input_line_pointer += 4;
+ if (!bfd_set_arch_mach (stdoutput, bfd_arch_hppa, 25))
+ as_warn (_("could not set architecture and machine"));
+ }
else if (strncmp (level, "2.0", 3) == 0)
{
input_line_pointer += 3;