summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRichard Sandiford <rdsandiford@googlemail.com>2009-09-21 18:55:08 +0000
committerRichard Sandiford <rdsandiford@googlemail.com>2009-09-21 18:55:08 +0000
commit30af59626b24a4f41e0d9adc224617b8eec0a9d5 (patch)
treeb32f2bc11776f758c68e35a35b0de2ada952cb3e
parentce0420dced59a0e1fc114e9bee2117ded5342021 (diff)
downloadppe42-binutils-30af59626b24a4f41e0d9adc224617b8eec0a9d5.tar.gz
ppe42-binutils-30af59626b24a4f41e0d9adc224617b8eec0a9d5.zip
bfd/
* elf-eh-frame.c (make_pc_relative): New function. (_bfd_elf_write_section_eh_frame): Use it. ld/testsuite/ * ld-mips-elf/eh-frame1-n32.d: Expect PC-relative encodings to include DW_EH_PE_sdata4. * ld-mips-elf/eh-frame2-n32.d: Likewise. * ld-mips-elf/eh-frame1-n64.d: Expect PC-relative encodings to include DW_EH_PE_sdata8. * ld-mips-elf/eh-frame2-n64.d: Likewise.
-rw-r--r--bfd/ChangeLog5
-rw-r--r--bfd/elf-eh-frame.c28
-rw-r--r--ld/testsuite/ChangeLog9
-rw-r--r--ld/testsuite/ld-mips-elf/eh-frame1-n32.d6
-rw-r--r--ld/testsuite/ld-mips-elf/eh-frame1-n64.d6
-rw-r--r--ld/testsuite/ld-mips-elf/eh-frame2-n32.d6
-rw-r--r--ld/testsuite/ld-mips-elf/eh-frame2-n64.d6
7 files changed, 51 insertions, 15 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index 9900119f37..a5fe823aeb 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,3 +1,8 @@
+2009-09-21 Richard Sandiford <rdsandiford@googlemail.com>
+
+ * elf-eh-frame.c (make_pc_relative): New function.
+ (_bfd_elf_write_section_eh_frame): Use it.
+
2009-09-21 Alan Modra <amodra@bigpond.net.au>
* elf32-ppc.c (TLS_GET_ADDR_GLINK_SIZE): Define.
diff --git a/bfd/elf-eh-frame.c b/bfd/elf-eh-frame.c
index 4ea9627342..995dac04ee 100644
--- a/bfd/elf-eh-frame.c
+++ b/bfd/elf-eh-frame.c
@@ -423,6 +423,28 @@ skip_non_nops (bfd_byte *buf, bfd_byte *end, unsigned int encoded_ptr_width,
return last;
}
+/* Convert absolute encoding ENCODING into PC-relative form.
+ SIZE is the size of a pointer. */
+
+static unsigned char
+make_pc_relative (unsigned char encoding, unsigned int ptr_size)
+{
+ if ((encoding & 0x7f) == DW_EH_PE_absptr)
+ switch (ptr_size)
+ {
+ case 2:
+ encoding |= DW_EH_PE_sdata2;
+ break;
+ case 4:
+ encoding |= DW_EH_PE_sdata4;
+ break;
+ case 8:
+ encoding |= DW_EH_PE_sdata8;
+ break;
+ }
+ return encoding | DW_EH_PE_pcrel;
+}
+
/* Called before calling _bfd_elf_parse_eh_frame on every input bfd's
.eh_frame section. */
@@ -1454,7 +1476,7 @@ _bfd_elf_write_section_eh_frame (bfd *abfd,
{
BFD_ASSERT (action & 1);
*aug++ = 'R';
- *buf++ = DW_EH_PE_pcrel;
+ *buf++ = make_pc_relative (DW_EH_PE_absptr, ptr_size);
action &= ~1;
}
@@ -1465,7 +1487,7 @@ _bfd_elf_write_section_eh_frame (bfd *abfd,
if (action & 2)
{
BFD_ASSERT (*buf == ent->lsda_encoding);
- *buf |= DW_EH_PE_pcrel;
+ *buf = make_pc_relative (*buf, ptr_size);
action &= ~2;
}
buf++;
@@ -1506,7 +1528,7 @@ _bfd_elf_write_section_eh_frame (bfd *abfd,
if (action & 1)
{
BFD_ASSERT (*buf == ent->fde_encoding);
- *buf |= DW_EH_PE_pcrel;
+ *buf = make_pc_relative (*buf, ptr_size);
action &= ~1;
}
buf++;
diff --git a/ld/testsuite/ChangeLog b/ld/testsuite/ChangeLog
index 3185e3b217..7049206076 100644
--- a/ld/testsuite/ChangeLog
+++ b/ld/testsuite/ChangeLog
@@ -1,3 +1,12 @@
+2009-09-21 Richard Sandiford <rdsandiford@googlemail.com>
+
+ * ld-mips-elf/eh-frame1-n32.d: Expect PC-relative encodings
+ to include DW_EH_PE_sdata4.
+ * ld-mips-elf/eh-frame2-n32.d: Likewise.
+ * ld-mips-elf/eh-frame1-n64.d: Expect PC-relative encodings
+ to include DW_EH_PE_sdata8.
+ * ld-mips-elf/eh-frame2-n64.d: Likewise.
+
2009-09-21 Alan Modra <amodra@bigpond.net.au>
* ld-powerpc/tlslib.s: Delete dot-symbol entry syms. Add
diff --git a/ld/testsuite/ld-mips-elf/eh-frame1-n32.d b/ld/testsuite/ld-mips-elf/eh-frame1-n32.d
index e718379d36..a460512a97 100644
--- a/ld/testsuite/ld-mips-elf/eh-frame1-n32.d
+++ b/ld/testsuite/ld-mips-elf/eh-frame1-n32.d
@@ -25,7 +25,7 @@ Contents of the \.eh_frame section:
Code alignment factor: 1
Data alignment factor: 4
Return address column: 31
- Augmentation data: 10
+ Augmentation data: 1b
DW_CFA_advance_loc: 0 to 00000000
DW_CFA_advance_loc: 0 to 00000000
@@ -65,7 +65,7 @@ Contents of the \.eh_frame section:
Code alignment factor: 1
Data alignment factor: 4
Return address column: 31
- Augmentation data: 10 00 00 00 00 00
+ Augmentation data: 1b 00 00 00 00 00
DW_CFA_advance_loc: 0 to 00000000
DW_CFA_advance_loc: 0 to 00000000
@@ -108,7 +108,7 @@ Contents of the \.eh_frame section:
Code alignment factor: 1
Data alignment factor: 4
Return address column: 31
- Augmentation data: 00 00 00 00 00 10
+ Augmentation data: 00 00 00 00 00 1b
DW_CFA_advance_loc: 0 to 00000000
diff --git a/ld/testsuite/ld-mips-elf/eh-frame1-n64.d b/ld/testsuite/ld-mips-elf/eh-frame1-n64.d
index 2913106c28..c77315f9cb 100644
--- a/ld/testsuite/ld-mips-elf/eh-frame1-n64.d
+++ b/ld/testsuite/ld-mips-elf/eh-frame1-n64.d
@@ -41,7 +41,7 @@ Contents of the \.eh_frame section:
Code alignment factor: 1
Data alignment factor: 4
Return address column: 31
- Augmentation data: 10
+ Augmentation data: 1c
DW_CFA_advance_loc: 0 to 00000000
DW_CFA_advance_loc: 0 to 00000000
@@ -105,7 +105,7 @@ Contents of the \.eh_frame section:
Code alignment factor: 1
Data alignment factor: 4
Return address column: 31
- Augmentation data: 10 00 00 00 00 00 00 00 00 00
+ Augmentation data: 1c 00 00 00 00 00 00 00 00 00
DW_CFA_advance_loc: 0 to 00000000
DW_CFA_advance_loc: 0 to 00000000
@@ -172,7 +172,7 @@ Contents of the \.eh_frame section:
Code alignment factor: 1
Data alignment factor: 4
Return address column: 31
- Augmentation data: 00 00 00 00 00 00 00 00 00 10
+ Augmentation data: 00 00 00 00 00 00 00 00 00 1c
DW_CFA_advance_loc: 0 to 00000000
DW_CFA_advance_loc: 0 to 00000000
diff --git a/ld/testsuite/ld-mips-elf/eh-frame2-n32.d b/ld/testsuite/ld-mips-elf/eh-frame2-n32.d
index e029420b8e..e264955915 100644
--- a/ld/testsuite/ld-mips-elf/eh-frame2-n32.d
+++ b/ld/testsuite/ld-mips-elf/eh-frame2-n32.d
@@ -25,7 +25,7 @@ Contents of the \.eh_frame section:
Code alignment factor: 1
Data alignment factor: 4
Return address column: 31
- Augmentation data: 10
+ Augmentation data: 1b
DW_CFA_nop
DW_CFA_nop
@@ -65,7 +65,7 @@ Contents of the \.eh_frame section:
Code alignment factor: 1
Data alignment factor: 4
Return address column: 31
- Augmentation data: 10 00 00 00 00 00
+ Augmentation data: 1b 00 00 00 00 00
DW_CFA_nop
@@ -104,7 +104,7 @@ Contents of the \.eh_frame section:
Code alignment factor: 1
Data alignment factor: 4
Return address column: 31
- Augmentation data: 00 00 00 00 00 10
+ Augmentation data: 00 00 00 00 00 1b
DW_CFA_nop
diff --git a/ld/testsuite/ld-mips-elf/eh-frame2-n64.d b/ld/testsuite/ld-mips-elf/eh-frame2-n64.d
index a03476ee11..237c3d46f9 100644
--- a/ld/testsuite/ld-mips-elf/eh-frame2-n64.d
+++ b/ld/testsuite/ld-mips-elf/eh-frame2-n64.d
@@ -41,7 +41,7 @@ Contents of the \.eh_frame section:
Code alignment factor: 1
Data alignment factor: 4
Return address column: 31
- Augmentation data: 10
+ Augmentation data: 1c
DW_CFA_nop
DW_CFA_nop
@@ -105,7 +105,7 @@ Contents of the \.eh_frame section:
Code alignment factor: 1
Data alignment factor: 4
Return address column: 31
- Augmentation data: 10 00 00 00 00 00 00 00 00 00
+ Augmentation data: 1c 00 00 00 00 00 00 00 00 00
DW_CFA_nop
DW_CFA_nop
@@ -164,7 +164,7 @@ Contents of the \.eh_frame section:
Code alignment factor: 1
Data alignment factor: 4
Return address column: 31
- Augmentation data: 00 00 00 00 00 00 00 00 00 10
+ Augmentation data: 00 00 00 00 00 00 00 00 00 1c
DW_CFA_nop
DW_CFA_nop
OpenPOWER on IntegriCloud