aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Henderson <rth@redhat.com>2003-05-31 19:36:45 +0000
committerRichard Henderson <rth@redhat.com>2003-05-31 19:36:45 +0000
commiteafbc43f939a26cb4230d3d55ec637f441e3afe6 (patch)
tree8576168b3f31bd968853148dc33f86590d6449b0
parent38fafa6d088439f82e140d2f60f76fa0d15def57 (diff)
downloadgdb-eafbc43f939a26cb4230d3d55ec637f441e3afe6.zip
gdb-eafbc43f939a26cb4230d3d55ec637f441e3afe6.tar.gz
gdb-eafbc43f939a26cb4230d3d55ec637f441e3afe6.tar.bz2
* dw2gencfi.c (output_fde): Use fix_new to emit pc-relative reloc.
(cfi_finish): Set flag_traditional_format around .eh_frame data. * gas/alpha/elf-reloc-8.d: Correct .eh_frame relocs. * gas/cfi/cfi-alpha-2.d: New. * gas/cfi/cfi-alpha-2.s: New. * gas/cfi/cfi.exp: Run it.
-rw-r--r--gas/ChangeLog5
-rw-r--r--gas/dw2gencfi.c17
-rw-r--r--gas/testsuite/ChangeLog7
-rw-r--r--gas/testsuite/gas/alpha/elf-reloc-8.d34
-rw-r--r--gas/testsuite/gas/cfi/cfi-alpha-2.d9
-rw-r--r--gas/testsuite/gas/cfi/cfi-alpha-2.s14
-rw-r--r--gas/testsuite/gas/cfi/cfi.exp1
7 files changed, 69 insertions, 18 deletions
diff --git a/gas/ChangeLog b/gas/ChangeLog
index fc7d3fd..34e844b 100644
--- a/gas/ChangeLog
+++ b/gas/ChangeLog
@@ -1,3 +1,8 @@
+2003-05-31 Richard Henderson <rth@redhat.com>
+
+ * dw2gencfi.c (output_fde): Use fix_new to emit pc-relative reloc.
+ (cfi_finish): Set flag_traditional_format around .eh_frame data.
+
2003-05-29 Richard Henderson <rth@redhat.com>
* config/tc-alpha.c (alpha_cur_ent_sym): Remove.
diff --git a/gas/dw2gencfi.c b/gas/dw2gencfi.c
index 2239578..ee67027 100644
--- a/gas/dw2gencfi.c
+++ b/gas/dw2gencfi.c
@@ -666,9 +666,17 @@ output_fde (struct fde_entry *fde, struct cie_entry *cie,
exp.X_op_symbol = cie->start_address;
emit_expr (&exp, 4); /* CIE offset */
+ /* ??? Unsure why this works and the following doesn't.
+ Symptom was incorrect addends to the relocation. */
+#if 1
+ memset (frag_more (4), 0, 4); /* Code offset */
+ fix_new (frag_now, frag_now_fix () - 4, 4,
+ fde->start_address, 0, 1, BFD_RELOC_32);
+#else
exp.X_add_symbol = fde->start_address;
exp.X_op_symbol = symbol_temp_new_now ();
- emit_expr (&exp, 4); /* Code offset */
+ emit_expr (&exp, 4);
+#endif
exp.X_add_symbol = fde->end_address;
exp.X_op_symbol = fde->start_address; /* Code length */
@@ -770,6 +778,7 @@ cfi_finish (void)
{
segT cfi_seg;
struct fde_entry *fde;
+ int save_flag_traditional_format;
if (cur_fde_data)
{
@@ -789,6 +798,10 @@ cfi_finish (void)
subseg_set (cfi_seg, 0);
record_alignment (cfi_seg, 2);
+ /* Make sure check_eh_frame doesn't do anything with our output. */
+ save_flag_traditional_format = flag_traditional_format;
+ flag_traditional_format = 1;
+
for (fde = all_fde_data; fde ; fde = fde->next)
{
struct cfi_insn_data *first;
@@ -797,4 +810,6 @@ cfi_finish (void)
cie = select_cie_for_fde (fde, &first);
output_fde (fde, cie, first);
}
+
+ flag_traditional_format = save_flag_traditional_format;
}
diff --git a/gas/testsuite/ChangeLog b/gas/testsuite/ChangeLog
index 11f8745..82cef6c 100644
--- a/gas/testsuite/ChangeLog
+++ b/gas/testsuite/ChangeLog
@@ -1,3 +1,10 @@
+2003-05-31 Richard Henderson <rth@redhat.com>
+
+ * gas/alpha/elf-reloc-8.d: Correct .eh_frame relocs.
+ * gas/cfi/cfi-alpha-2.d: New.
+ * gas/cfi/cfi-alpha-2.s: New.
+ * gas/cfi/cfi.exp: Run it.
+
2003-05-29 Richard Henderson <rth@redhat.com>
* gas/alpha/elf-reloc-8.d: Add .eh_frame relocs.
diff --git a/gas/testsuite/gas/alpha/elf-reloc-8.d b/gas/testsuite/gas/alpha/elf-reloc-8.d
index de5e0e8..68f5678 100644
--- a/gas/testsuite/gas/alpha/elf-reloc-8.d
+++ b/gas/testsuite/gas/alpha/elf-reloc-8.d
@@ -311,20 +311,20 @@ OFFSET *TYPE *VALUE
RELOCATION RECORDS FOR \[\.eh_frame\]:
OFFSET *TYPE *VALUE
-0*000001c SREL32 \.init\.text\+0xf*ffffff8
-0*0000034 SREL32 \.init\.text\+0x0*0000048
-0*0000048 SREL32 \.init\.text\+0x0*0000078
-0*000005c SREL32 \.init\.text\+0x0*00000a8
-0*0000080 SREL32 \.init\.text\+0x0*00002b8
-0*00000a0 SREL32 \.init\.text\+0x0*0000598
-0*00000b8 SREL32 \.init\.text\+0x0*00005e8
-0*00000cc SREL32 \.init\.text\+0x0*0000608
-0*00000e0 SREL32 \.init\.text\+0x0*0000628
-0*00000fc SREL32 \.init\.text\+0x0*0000748
-0*0000120 SREL32 \.init\.text\+0x0*0000988
-0*000013c SREL32 \.init\.text\+0x0*0000a08
-0*0000150 SREL32 \.init\.text\+0x0*0000a18
-0*0000164 SREL32 \.init\.text\+0x0*0000a38
-0*000017c SREL32 \.init\.text\+0x0*0000a88
-0*0000190 SREL32 \.init\.text\+0x0*0000a98
-0*00001a4 SREL32 \.text\+0xf*ffffff8
+0*000001c SREL32 \.init\.text
+0*0000034 SREL32 \.init\.text\+0x0*0000050
+0*0000048 SREL32 \.init\.text\+0x0*0000080
+0*000005c SREL32 \.init\.text\+0x0*00000b0
+0*0000080 SREL32 \.init\.text\+0x0*00002c0
+0*00000a0 SREL32 \.init\.text\+0x0*00005a0
+0*00000b8 SREL32 \.init\.text\+0x0*00005f0
+0*00000cc SREL32 \.init\.text\+0x0*0000610
+0*00000e0 SREL32 \.init\.text\+0x0*0000630
+0*00000fc SREL32 \.init\.text\+0x0*0000750
+0*0000120 SREL32 \.init\.text\+0x0*0000990
+0*000013c SREL32 \.init\.text\+0x0*0000a10
+0*0000150 SREL32 \.init\.text\+0x0*0000a20
+0*0000164 SREL32 \.init\.text\+0x0*0000a40
+0*000017c SREL32 \.init\.text\+0x0*0000a90
+0*0000190 SREL32 \.init\.text\+0x0*0000aa0
+0*00001a4 SREL32 \.text
diff --git a/gas/testsuite/gas/cfi/cfi-alpha-2.d b/gas/testsuite/gas/cfi/cfi-alpha-2.d
new file mode 100644
index 0000000..4a87da2
--- /dev/null
+++ b/gas/testsuite/gas/cfi/cfi-alpha-2.d
@@ -0,0 +1,9 @@
+#objdump: -r -j .eh_frame
+#name: CFI on alpha, 2
+
+.*: file format elf64-alpha
+
+RELOCATION RECORDS FOR \[\.eh_frame\]:
+OFFSET TYPE VALUE
+0*000001c SREL32 \.text
+0*0000030 SREL32 \.text\+0x0*0000004
diff --git a/gas/testsuite/gas/cfi/cfi-alpha-2.s b/gas/testsuite/gas/cfi/cfi-alpha-2.s
new file mode 100644
index 0000000..56b22e8
--- /dev/null
+++ b/gas/testsuite/gas/cfi/cfi-alpha-2.s
@@ -0,0 +1,14 @@
+ .text
+ .ent foo
+foo:
+ .frame $30, 0, $26, 0
+ .prologue 1
+ ret
+ .end foo
+
+ .ent bar
+bar:
+ .frame $30, 0, $26, 0
+ .prologue 1
+ ret
+ .end bar
diff --git a/gas/testsuite/gas/cfi/cfi.exp b/gas/testsuite/gas/cfi/cfi.exp
index d52803f..b6acaad 100644
--- a/gas/testsuite/gas/cfi/cfi.exp
+++ b/gas/testsuite/gas/cfi/cfi.exp
@@ -15,5 +15,6 @@ if { [istarget alpha*-*-*] } then {
if $elf {
run_dump_test "cfi-alpha-1"
+ run_dump_test "cfi-alpha-2"
}
}