diff options
author | Rui Ueyama <ruiu@google.com> | 2018-03-07 22:29:48 +0000 |
---|---|---|
committer | Rui Ueyama <ruiu@google.com> | 2018-03-07 22:29:48 +0000 |
commit | 4d09eef8ec55322f04014fc74dacd61260b97f57 (patch) | |
tree | ba8ba0bb2db172ab92547fa2f1cc132b734a3aeb /tools/llvm-readobj | |
parent | 55371ce3e71e68ea44e01a8aeaa0ea368c48c578 (diff) |
Revert r326932: [DebugInfo] Support DWARF expressions in eh_frame
This reverts commit rr326932 because it broke lld/test/ELF/eh-frame-hdr-augmentation.s.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@326953 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'tools/llvm-readobj')
-rw-r--r-- | tools/llvm-readobj/CMakeLists.txt | 1 | ||||
-rw-r--r-- | tools/llvm-readobj/DwarfCFIEHPrinter.h | 244 | ||||
-rw-r--r-- | tools/llvm-readobj/ELFDumper.cpp | 6 |
3 files changed, 0 insertions, 251 deletions
diff --git a/tools/llvm-readobj/CMakeLists.txt b/tools/llvm-readobj/CMakeLists.txt index b0550f34012..dafc9e10cfa 100644 --- a/tools/llvm-readobj/CMakeLists.txt +++ b/tools/llvm-readobj/CMakeLists.txt @@ -1,6 +1,5 @@ set(LLVM_LINK_COMPONENTS DebugInfoCodeView - DebugInfoDWARF Object BinaryFormat Support diff --git a/tools/llvm-readobj/DwarfCFIEHPrinter.h b/tools/llvm-readobj/DwarfCFIEHPrinter.h deleted file mode 100644 index 928ac58a875..00000000000 --- a/tools/llvm-readobj/DwarfCFIEHPrinter.h +++ /dev/null @@ -1,244 +0,0 @@ -//===--- DwarfCFIEHPrinter.h - DWARF-based Unwind Information Printer -----===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// - -#ifndef LLVM_TOOLS_LLVM_READOBJ_DWARFCFIEHPRINTER_H -#define LLVM_TOOLS_LLVM_READOBJ_DWARFCFIEHPRINTER_H - -#include "Error.h" -#include "llvm/ADT/STLExtras.h" -#include "llvm/BinaryFormat/Dwarf.h" -#include "llvm/Object/ELF.h" -#include "llvm/Object/ELFTypes.h" -#include "llvm/Support/Casting.h" -#include "llvm/Support/ScopedPrinter.h" -#include "llvm/Support/Debug.h" -#include "llvm/DebugInfo/DWARF/DWARFDataExtractor.h" -#include "llvm/DebugInfo/DWARF/DWARFDebugFrame.h" -#include "llvm/Support/Endian.h" -#include "llvm/Support/Format.h" -#include "llvm/Support/type_traits.h" - -namespace llvm { -namespace DwarfCFIEH { - -template <typename ELFT> -class PrinterContext { - ScopedPrinter &W; - const object::ELFFile<ELFT> *Obj; - - void printEHFrameHdr(uint64_t Offset, uint64_t Address, uint64_t Size) const; - - void printEHFrame(const typename ELFT::Shdr *EHFrameShdr) const; - -public: - PrinterContext(ScopedPrinter &W, const object::ELFFile<ELFT> *Obj) - : W(W), Obj(Obj) {} - - void printUnwindInformation() const; -}; - -template <class ELFO> -static const typename ELFO::Elf_Shdr *findSectionByAddress(const ELFO *Obj, - uint64_t Addr) { - auto Sections = Obj->sections(); - if (Error E = Sections.takeError()) - reportError(toString(std::move(E))); - - for (const auto &Shdr : *Sections) - if (Shdr.sh_addr == Addr) - return &Shdr; - return nullptr; -} - -template <typename ELFT> -void PrinterContext<ELFT>::printUnwindInformation() const { - const typename ELFT::Phdr *EHFramePhdr = nullptr; - - auto PHs = Obj->program_headers(); - if (Error E = PHs.takeError()) - reportError(toString(std::move(E))); - - for (const auto &Phdr : *PHs) { - if (Phdr.p_type == ELF::PT_GNU_EH_FRAME) { - EHFramePhdr = &Phdr; - if (Phdr.p_memsz != Phdr.p_filesz) - reportError("p_memsz does not match p_filesz for GNU_EH_FRAME"); - break; - } - } - - if (EHFramePhdr) - printEHFrameHdr(EHFramePhdr->p_offset, EHFramePhdr->p_vaddr, - EHFramePhdr->p_memsz); - - auto Sections = Obj->sections(); - if (Error E = Sections.takeError()) - reportError(toString(std::move(E))); - - for (const auto &Shdr : *Sections) { - auto SectionName = Obj->getSectionName(&Shdr); - if (Error E = SectionName.takeError()) - reportError(toString(std::move(E))); - - if (*SectionName == ".eh_frame") - printEHFrame(&Shdr); - } -} - -template <typename ELFT> -void PrinterContext<ELFT>::printEHFrameHdr(uint64_t EHFrameHdrOffset, - uint64_t EHFrameHdrAddress, - uint64_t EHFrameHdrSize) const { - ListScope L(W, "EH_FRAME Header"); - W.startLine() << format("Address: 0x%" PRIx64 "\n", EHFrameHdrAddress); - W.startLine() << format("Offset: 0x%" PRIx64 "\n", EHFrameHdrOffset); - W.startLine() << format("Size: 0x%" PRIx64 "\n", EHFrameHdrSize); - - const auto *EHFrameHdrShdr = findSectionByAddress(Obj, EHFrameHdrAddress); - if (EHFrameHdrShdr) { - auto SectionName = Obj->getSectionName(EHFrameHdrShdr); - if (Error E = SectionName.takeError()) - reportError(toString(std::move(E))); - - W.printString("Corresponding Section", *SectionName); - } - - DataExtractor DE( - StringRef(reinterpret_cast<const char *>(Obj->base()) + EHFrameHdrOffset, - EHFrameHdrSize), - ELFT::TargetEndianness == support::endianness::little, - ELFT::Is64Bits ? 8 : 4); - - DictScope D(W, "Header"); - uint32_t Offset = 0; - - auto Version = DE.getU8(&Offset); - W.printNumber("version", Version); - if (Version != 1) - reportError("only version 1 of .eh_frame_hdr is supported"); - - auto EHFramePtrEnc = DE.getU8(&Offset); - W.startLine() << format("eh_frame_ptr_enc: 0x%" PRIx64 "\n", EHFramePtrEnc); - if (EHFramePtrEnc != (dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_sdata4)) - reportError("unexpected encoding eh_frame_ptr_enc"); - - auto FDECountEnc = DE.getU8(&Offset); - W.startLine() << format("fde_count_enc: 0x%" PRIx64 "\n", FDECountEnc); - if (FDECountEnc != dwarf::DW_EH_PE_udata4) - reportError("unexpected encoding fde_count_enc"); - - auto TableEnc = DE.getU8(&Offset); - W.startLine() << format("table_enc: 0x%" PRIx64 "\n", TableEnc); - if (TableEnc != (dwarf::DW_EH_PE_datarel | dwarf::DW_EH_PE_sdata4)) - reportError("unexpected encoding table_enc"); - - auto EHFramePtr = DE.getSigned(&Offset, 4) + EHFrameHdrAddress + 4; - W.startLine() << format("eh_frame_ptr: 0x%" PRIx64 "\n", EHFramePtr); - - auto FDECount = DE.getUnsigned(&Offset, 4); - W.printNumber("fde_count", FDECount); - - unsigned NumEntries = 0; - uint64_t PrevPC = 0; - while (Offset + 8 <= EHFrameHdrSize && NumEntries < FDECount) { - DictScope D(W, std::string("entry ") + std::to_string(NumEntries)); - - auto InitialPC = DE.getSigned(&Offset, 4) + EHFrameHdrAddress; - W.startLine() << format("initial_location: 0x%" PRIx64 "\n", InitialPC); - auto Address = DE.getSigned(&Offset, 4) + EHFrameHdrAddress; - W.startLine() << format("address: 0x%" PRIx64 "\n", Address); - - if (InitialPC < PrevPC) - reportError("initial_location is out of order"); - - PrevPC = InitialPC; - ++NumEntries; - } -} - -template <typename ELFT> -void PrinterContext<ELFT>::printEHFrame( - const typename ELFT::Shdr *EHFrameShdr) const { - uint64_t Address = EHFrameShdr->sh_addr; - uint64_t ShOffset = EHFrameShdr->sh_offset; - W.startLine() << format(".eh_frame section at offset 0x%" PRIx64 - " address 0x%" PRIx64 ":\n", - ShOffset, Address); - W.indent(); - - auto Result = Obj->getSectionContents(EHFrameShdr); - if (Error E = Result.takeError()) - reportError(toString(std::move(E))); - - auto Contents = Result.get(); - DWARFDataExtractor DE( - StringRef(reinterpret_cast<const char *>(Contents.data()), - Contents.size()), - ELFT::TargetEndianness == support::endianness::little, - ELFT::Is64Bits ? 8 : 4); - DWARFDebugFrame EHFrame(/*IsEH=*/true, /*EHFrameAddress=*/Address); - EHFrame.parse(DE); - - for (const auto &Entry : EHFrame) { - if (const auto *CIE = dyn_cast<dwarf::CIE>(&Entry)) { - W.startLine() << format("[0x%" PRIx64 "] CIE length=%" PRIu64 "\n", - Address + CIE->getOffset(), - CIE->getLength()); - W.indent(); - - W.printNumber("version", CIE->getVersion()); - W.printString("augmentation", CIE->getAugmentationString()); - W.printNumber("code_alignment_factor", CIE->getCodeAlignmentFactor()); - W.printNumber("data_alignment_factor", CIE->getDataAlignmentFactor()); - W.printNumber("return_address_register", CIE->getReturnAddressRegister()); - - W.getOStream() << "\n"; - W.startLine() << "Program:\n"; - W.indent(); - CIE->cfis().dump(W.getOStream(), nullptr, W.getIndentLevel()); - W.unindent(); - - W.unindent(); - W.getOStream() << "\n"; - - } else if (const auto *FDE = dyn_cast<dwarf::FDE>(&Entry)) { - W.startLine() << format("[0x%" PRIx64 "] FDE length=%" PRIu64 - " cie=[0x%" PRIx64 "]\n", - Address + FDE->getOffset(), - FDE->getLength(), - Address + FDE->getLinkedCIE()->getOffset()); - W.indent(); - - W.startLine() << format("initial_location: 0x%" PRIx64 "\n", - FDE->getInitialLocation()); - W.startLine() - << format("address_range: 0x%" PRIx64 " (end : 0x%" PRIx64 ")\n", - FDE->getAddressRange(), - FDE->getInitialLocation() + FDE->getAddressRange()); - - W.getOStream() << "\n"; - W.startLine() << "Program:\n"; - W.indent(); - FDE->cfis().dump(W.getOStream(), nullptr, W.getIndentLevel()); - W.unindent(); - - W.unindent(); - W.getOStream() << "\n"; - } else { - llvm_unreachable("unexpected DWARF frame kind"); - } - } - - W.unindent(); -} - -} -} - -#endif diff --git a/tools/llvm-readobj/ELFDumper.cpp b/tools/llvm-readobj/ELFDumper.cpp index 6b6582b7566..36cda459225 100644 --- a/tools/llvm-readobj/ELFDumper.cpp +++ b/tools/llvm-readobj/ELFDumper.cpp @@ -13,7 +13,6 @@ //===----------------------------------------------------------------------===// #include "ARMEHABIPrinter.h" -#include "DwarfCFIEHPrinter.h" #include "Error.h" #include "ObjDumper.h" #include "StackMapPrinter.h" @@ -1809,11 +1808,6 @@ void ELFDumper<ELFT>::printValue(uint64_t Type, uint64_t Value) { template<class ELFT> void ELFDumper<ELFT>::printUnwindInfo() { - const unsigned Machine = Obj->getHeader()->e_machine; - if (Machine == EM_386 || Machine == EM_X86_64) { - DwarfCFIEH::PrinterContext<ELFT> Ctx(W, Obj); - return Ctx.printUnwindInformation(); - } W.startLine() << "UnwindInfo not implemented.\n"; } |