summaryrefslogtreecommitdiffstats
path: root/llvm/tools/llvm-readobj/COFFDumper.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/tools/llvm-readobj/COFFDumper.cpp')
-rw-r--r--llvm/tools/llvm-readobj/COFFDumper.cpp45
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) {
OpenPOWER on IntegriCloud