[PATCH] D18911: ELF: Emit .eh_frame_hdr entries for FDEs with duplicate PCs.
Rafael EspĂndola via llvm-commits
llvm-commits at lists.llvm.org
Sat Apr 9 15:46:23 PDT 2016
Lgtm.
On Apr 9, 2016 15:25, "Peter Collingbourne" <peter at pcc.me.uk> wrote:
> pcc updated this revision to Diff 53146.
> pcc added a comment.
>
> Set FDE count in .eh_frame_hdr correctly instead
>
>
> http://reviews.llvm.org/D18911
>
> Files:
> ELF/OutputSections.cpp
> test/ELF/eh-frame-hdr-icf.s
>
> Index: test/ELF/eh-frame-hdr-icf.s
> ===================================================================
> --- /dev/null
> +++ test/ELF/eh-frame-hdr-icf.s
> @@ -0,0 +1,27 @@
> +# REQUIRES: x86
> +
> +# RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t
> +# RUN: ld.lld %t -o %t2 --icf=all --eh-frame-hdr
> +# RUN: llvm-objdump -s %t2 | FileCheck %s
> +
> +# CHECK: Contents of section .eh_frame_hdr:
> +# CHECK-NEXT: 101a0 011b033b b4ffffff 01000000 600e0000
> +# ^ FDE count
> +# CHECK-NEXT: 101b0 e8ffffff 00000000 00000000
> +# ^ FDE for f2
> +
> +.globl _start, f1, f2
> +_start:
> + ret
> +
> +.section .text.f1, "ax"
> +f1:
> + .cfi_startproc
> + ret
> + .cfi_endproc
> +
> +.section .text.f2, "ax"
> +f2:
> + .cfi_startproc
> + ret
> + .cfi_endproc
> Index: ELF/OutputSections.cpp
> ===================================================================
> --- ELF/OutputSections.cpp
> +++ ELF/OutputSections.cpp
> @@ -733,23 +733,25 @@
> template <class ELFT> void EhFrameHeader<ELFT>::writeTo(uint8_t *Buf) {
> const endianness E = ELFT::TargetEndianness;
>
> + uintX_t EhVA = Sec->getVA();
> + uintX_t VA = this->getVA();
> +
> + // InitialPC -> Offset in .eh_frame, sorted by InitialPC, and
> deduplicate PCs.
> + // FIXME: Deduplication leaves unneeded null bytes at the end of the
> section.
> + std::map<uintX_t, size_t> PcToOffset;
> + for (const FdeData &F : FdeList)
> + PcToOffset[getFdePc(EhVA, F)] = F.Off;
> +
> const uint8_t Header[] = {1, DW_EH_PE_pcrel | DW_EH_PE_sdata4,
> DW_EH_PE_udata4,
> DW_EH_PE_datarel | DW_EH_PE_sdata4};
> memcpy(Buf, Header, sizeof(Header));
>
> - uintX_t EhVA = Sec->getVA();
> - uintX_t VA = this->getVA();
> uintX_t EhOff = EhVA - VA - 4;
> write32<E>(Buf + 4, EhOff);
> - write32<E>(Buf + 8, this->FdeList.size());
> + write32<E>(Buf + 8, PcToOffset.size());
> Buf += 12;
>
> - // InitialPC -> Offset in .eh_frame, sorted by InitialPC.
> - std::map<uintX_t, size_t> PcToOffset;
> - for (const FdeData &F : FdeList)
> - PcToOffset[getFdePc(EhVA, F)] = F.Off;
> -
> for (auto &I : PcToOffset) {
> // The first four bytes are an offset to the initial PC value for the
> FDE.
> write32<E>(Buf, I.first - VA);
>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20160409/8f4d92bb/attachment.html>
More information about the llvm-commits
mailing list