diff options
author | Peter Collingbourne <peter@pcc.me.uk> | 2018-08-22 23:58:16 +0000 |
---|---|---|
committer | Peter Collingbourne <peter@pcc.me.uk> | 2018-08-22 23:58:16 +0000 |
commit | bc3089f45f9eda5cbe5c728cdbb09e76e1e22176 (patch) | |
tree | 3a37839a68d7d656fcb24328e2ecb98590157995 /llvm/tools/llvm-readobj/COFFDumper.cpp | |
parent | a2761e437f220ec2cc4a5503bc427b317cc8c59d (diff) | |
download | bcm5719-llvm-bc3089f45f9eda5cbe5c728cdbb09e76e1e22176.tar.gz bcm5719-llvm-bc3089f45f9eda5cbe5c728cdbb09e76e1e22176.zip |
MC: Teach the COFF object writer to write address-significance tables.
The format is the same as in ELF: a sequence of ULEB128-encoded
symbol indexes.
Differential Revision: https://reviews.llvm.org/D51047
llvm-svn: 340499
Diffstat (limited to 'llvm/tools/llvm-readobj/COFFDumper.cpp')
-rw-r--r-- | llvm/tools/llvm-readobj/COFFDumper.cpp | 45 |
1 files changed, 45 insertions, 0 deletions
diff --git a/llvm/tools/llvm-readobj/COFFDumper.cpp b/llvm/tools/llvm-readobj/COFFDumper.cpp index 0ed4ccd09f6..c0579d63dff 100644 --- a/llvm/tools/llvm-readobj/COFFDumper.cpp +++ b/llvm/tools/llvm-readobj/COFFDumper.cpp @@ -50,6 +50,7 @@ #include "llvm/Support/ConvertUTF.h" #include "llvm/Support/FormatVariadic.h" #include "llvm/Support/ScopedPrinter.h" +#include "llvm/Support/LEB128.h" #include "llvm/Support/Win64EH.h" #include "llvm/Support/raw_ostream.h" @@ -98,6 +99,7 @@ public: mergeCodeViewTypes(llvm::codeview::MergingTypeTableBuilder &CVIDs, llvm::codeview::MergingTypeTableBuilder &CVTypes) override; void printStackMap() const override; + void printAddrsig() override; private: void printSymbol(const SymbolRef &Sym); void printRelocation(const SectionRef &Section, const RelocationRef &Reloc, @@ -1830,6 +1832,49 @@ void COFFDumper::printStackMap() const { StackMapV2Parser<support::big>(StackMapContentsArray)); } +void COFFDumper::printAddrsig() { + object::SectionRef AddrsigSection; + for (auto Sec : Obj->sections()) { + StringRef Name; + Sec.getName(Name); + if (Name == ".llvm_addrsig") { + AddrsigSection = Sec; + break; + } + } + + if (AddrsigSection == object::SectionRef()) + return; + + StringRef AddrsigContents; + AddrsigSection.getContents(AddrsigContents); + ArrayRef<uint8_t> AddrsigContentsArray( + reinterpret_cast<const uint8_t*>(AddrsigContents.data()), + AddrsigContents.size()); + + ListScope L(W, "Addrsig"); + auto *Cur = reinterpret_cast<const uint8_t *>(AddrsigContents.begin()); + auto *End = reinterpret_cast<const uint8_t *>(AddrsigContents.end()); + while (Cur != End) { + unsigned Size; + const char *Err; + uint64_t SymIndex = decodeULEB128(Cur, &Size, End, &Err); + if (Err) + reportError(Err); + + Expected<COFFSymbolRef> Sym = Obj->getSymbol(SymIndex); + StringRef SymName; + std::error_code EC = errorToErrorCode(Sym.takeError()); + if (EC || (EC = Obj->getSymbolName(*Sym, SymName))) { + SymName = ""; + error(EC); + } + + W.printNumber("Sym", SymName, SymIndex); + Cur += Size; + } +} + void llvm::dumpCodeViewMergedTypes( ScopedPrinter &Writer, llvm::codeview::MergingTypeTableBuilder &IDTable, llvm::codeview::MergingTypeTableBuilder &CVTypes) { |