From d2d3ebb81992e107edf95c1c136d7a342d9b1418 Mon Sep 17 00:00:00 2001 From: Dimitry Andric Date: Sun, 16 Apr 2017 16:03:39 +0000 Subject: Vendor import of lld trunk r300422: https://llvm.org/svn/llvm-project/lld/trunk@300422 --- ELF/EhFrame.cpp | 30 ++++++++++++++---------------- 1 file changed, 14 insertions(+), 16 deletions(-) (limited to 'ELF/EhFrame.cpp') diff --git a/ELF/EhFrame.cpp b/ELF/EhFrame.cpp index 2428473d9012..90be30a5f0f9 100644 --- a/ELF/EhFrame.cpp +++ b/ELF/EhFrame.cpp @@ -38,13 +38,14 @@ using namespace lld::elf; namespace { template class EhReader { public: - EhReader(InputSectionBase *S, ArrayRef D) : IS(S), D(D) {} + EhReader(InputSectionBase *S, ArrayRef D) : IS(S), D(D) {} size_t readEhRecordSize(); uint8_t getFdeEncoding(); private: template void failOn(const P *Loc, const Twine &Msg) { - fatal(IS->getLocation((const uint8_t *)Loc - IS->Data.data()) + ": " + Msg); + fatal("corrupted .eh_frame: " + Msg + "\n>>> defined in " + + IS->getObjMsg((const uint8_t *)Loc - IS->Data.data())); } uint8_t readByte(); @@ -53,15 +54,16 @@ private: void skipLeb128(); void skipAugP(); - InputSectionBase *IS; + InputSectionBase *IS; ArrayRef D; }; } template -size_t elf::readEhRecordSize(InputSectionBase *S, size_t Off) { +size_t elf::readEhRecordSize(InputSectionBase *S, size_t Off) { return EhReader(S, S->Data.slice(Off)).readEhRecordSize(); } + // .eh_frame section is a sequence of records. Each record starts with // a 4 byte length field. This function reads the length. template size_t EhReader::readEhRecordSize() { @@ -121,11 +123,11 @@ template void EhReader::skipLeb128() { failOn(ErrPos, "corrupted CIE (failed to read LEB128)"); } -template static size_t getAugPSize(unsigned Enc) { +static size_t getAugPSize(unsigned Enc) { switch (Enc & 0x0f) { case DW_EH_PE_absptr: case DW_EH_PE_signed: - return ELFT::Is64Bits ? 8 : 4; + return Config->Wordsize; case DW_EH_PE_udata2: case DW_EH_PE_sdata2: return 2; @@ -143,7 +145,7 @@ template void EhReader::skipAugP() { uint8_t Enc = readByte(); if ((Enc & 0xf0) == DW_EH_PE_aligned) failOn(D.data() - 1, "DW_EH_PE_aligned encoding is not supported"); - size_t Size = getAugPSize(Enc); + size_t Size = getAugPSize(Enc); if (Size == 0) failOn(D.data() - 1, "unknown FDE encoding"); if (Size >= D.size()) @@ -152,7 +154,7 @@ template void EhReader::skipAugP() { } template uint8_t elf::getFdeEncoding(EhSectionPiece *P) { - auto *IS = static_cast *>(P->ID); + auto *IS = static_cast(P->ID); return EhReader(IS, P->data()).getFdeEncoding(); } @@ -199,14 +201,10 @@ template uint8_t EhReader::getFdeEncoding() { return DW_EH_PE_absptr; } -template size_t elf::readEhRecordSize(InputSectionBase *S, - size_t Off); -template size_t elf::readEhRecordSize(InputSectionBase *S, - size_t Off); -template size_t elf::readEhRecordSize(InputSectionBase *S, - size_t Off); -template size_t elf::readEhRecordSize(InputSectionBase *S, - size_t Off); +template size_t elf::readEhRecordSize(InputSectionBase *S, size_t Off); +template size_t elf::readEhRecordSize(InputSectionBase *S, size_t Off); +template size_t elf::readEhRecordSize(InputSectionBase *S, size_t Off); +template size_t elf::readEhRecordSize(InputSectionBase *S, size_t Off); template uint8_t elf::getFdeEncoding(EhSectionPiece *P); template uint8_t elf::getFdeEncoding(EhSectionPiece *P); -- cgit v1.3