From e8a3a9901149ac2fe85f11b3c8bc66cf4074b94c Mon Sep 17 00:00:00 2001 From: Richard Sandiford Date: Mon, 21 Sep 2009 18:55:08 +0000 Subject: [PATCH] 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. --- bfd/ChangeLog | 5 +++++ bfd/elf-eh-frame.c | 28 +++++++++++++++++++++++++--- ld/testsuite/ChangeLog | 9 +++++++++ ld/testsuite/ld-mips-elf/eh-frame1-n32.d | 6 +++--- ld/testsuite/ld-mips-elf/eh-frame1-n64.d | 6 +++--- ld/testsuite/ld-mips-elf/eh-frame2-n32.d | 6 +++--- ld/testsuite/ld-mips-elf/eh-frame2-n64.d | 6 +++--- 7 files changed, 51 insertions(+), 15 deletions(-) diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 9900119f3..a5fe823ae 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,8 @@ +2009-09-21 Richard Sandiford + + * elf-eh-frame.c (make_pc_relative): New function. + (_bfd_elf_write_section_eh_frame): Use it. + 2009-09-21 Alan Modra * elf32-ppc.c (TLS_GET_ADDR_GLINK_SIZE): Define. diff --git a/bfd/elf-eh-frame.c b/bfd/elf-eh-frame.c index 4ea962734..995dac04e 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 3185e3b21..704920607 100644 --- a/ld/testsuite/ChangeLog +++ b/ld/testsuite/ChangeLog @@ -1,3 +1,12 @@ +2009-09-21 Richard Sandiford + + * 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 * 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 e718379d3..a460512a9 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 2913106c2..c77315f9c 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 e029420b8..e26495591 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 a03476ee1..237c3d46f 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 -- 2.11.4.GIT