From: Richard Sandiford Date: Mon, 21 Sep 2009 18:55:08 +0000 (+0000) Subject: bfd/ X-Git-Tag: sid-snapshot-20091001~131 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=30af59626b24a4f41e0d9adc224617b8eec0a9d5;p=external%2Fbinutils.git 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. --- diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 9900119..a5fe823 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 4ea9627..995dac0 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 3185e3b..7049206 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 e718379..a460512 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 2913106..c77315f 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 e029420..e264955 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 a03476e..237c3d4 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