aboutsummaryrefslogtreecommitdiff
path: root/contrib/llvm-project/llvm/tools/llvm-readobj/MachODumper.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/llvm-project/llvm/tools/llvm-readobj/MachODumper.cpp')
-rw-r--r--contrib/llvm-project/llvm/tools/llvm-readobj/MachODumper.cpp67
1 files changed, 56 insertions, 11 deletions
diff --git a/contrib/llvm-project/llvm/tools/llvm-readobj/MachODumper.cpp b/contrib/llvm-project/llvm/tools/llvm-readobj/MachODumper.cpp
index 945b16b8db86..599b0355917e 100644
--- a/contrib/llvm-project/llvm/tools/llvm-readobj/MachODumper.cpp
+++ b/contrib/llvm-project/llvm/tools/llvm-readobj/MachODumper.cpp
@@ -16,6 +16,7 @@
#include "llvm/ADT/SmallString.h"
#include "llvm/ADT/StringExtras.h"
#include "llvm/Object/MachO.h"
+#include "llvm/Support/BinaryStreamReader.h"
#include "llvm/Support/Casting.h"
#include "llvm/Support/ScopedPrinter.h"
@@ -34,6 +35,7 @@ public:
void printRelocations() override;
void printUnwindInfo() override;
void printStackMap() const override;
+ void printCGProfile() override;
void printNeededLibraries() override;
@@ -49,6 +51,8 @@ private:
template<class MachHeader>
void printFileHeaders(const MachHeader &Header);
+ StringRef getSymbolName(const SymbolRef &Symbol);
+
void printSymbols() override;
void printDynamicSymbols() override;
void printSymbol(const SymbolRef &Symbol);
@@ -551,10 +555,7 @@ void MachODumper::printRelocation(const MachOObjectFile *Obj,
if (IsExtern) {
symbol_iterator Symbol = Reloc.getSymbol();
if (Symbol != Obj->symbol_end()) {
- Expected<StringRef> TargetNameOrErr = Symbol->getName();
- if (!TargetNameOrErr)
- reportError(TargetNameOrErr.takeError(), Obj->getFileName());
- TargetName = *TargetNameOrErr;
+ TargetName = getSymbolName(*Symbol);
}
} else if (!IsScattered) {
section_iterator SecI = Obj->getRelocationSection(DR);
@@ -601,6 +602,14 @@ void MachODumper::printRelocation(const MachOObjectFile *Obj,
}
}
+StringRef MachODumper::getSymbolName(const SymbolRef &Symbol) {
+ Expected<StringRef> SymbolNameOrErr = Symbol.getName();
+ if (!SymbolNameOrErr) {
+ reportError(SymbolNameOrErr.takeError(), Obj->getFileName());
+ }
+ return *SymbolNameOrErr;
+}
+
void MachODumper::printSymbols() {
ListScope Group(W, "Symbols");
@@ -614,13 +623,7 @@ void MachODumper::printDynamicSymbols() {
}
void MachODumper::printSymbol(const SymbolRef &Symbol) {
- StringRef SymbolName;
- Expected<StringRef> SymbolNameOrErr = Symbol.getName();
- if (!SymbolNameOrErr) {
- // TODO: Actually report errors helpfully.
- consumeError(SymbolNameOrErr.takeError());
- } else
- SymbolName = *SymbolNameOrErr;
+ StringRef SymbolName = getSymbolName(Symbol);
MachOSymbol MOSymbol;
getSymbol(Obj, Symbol.getRawDataRefImpl(), MOSymbol);
@@ -696,6 +699,48 @@ void MachODumper::printStackMap() const {
W, StackMapParser<support::big>(StackMapContentsArray));
}
+void MachODumper::printCGProfile() {
+ object::SectionRef CGProfileSection;
+ for (auto Sec : Obj->sections()) {
+ StringRef Name;
+ if (Expected<StringRef> NameOrErr = Sec.getName())
+ Name = *NameOrErr;
+ else
+ consumeError(NameOrErr.takeError());
+
+ if (Name == "__cg_profile") {
+ CGProfileSection = Sec;
+ break;
+ }
+ }
+ if (CGProfileSection == object::SectionRef())
+ return;
+
+ StringRef CGProfileContents =
+ unwrapOrError(Obj->getFileName(), CGProfileSection.getContents());
+ BinaryStreamReader Reader(CGProfileContents, Obj->isLittleEndian()
+ ? llvm::support::little
+ : llvm::support::big);
+
+ ListScope L(W, "CGProfile");
+ while (!Reader.empty()) {
+ uint32_t FromIndex, ToIndex;
+ uint64_t Count;
+ if (Error Err = Reader.readInteger(FromIndex))
+ reportError(std::move(Err), Obj->getFileName());
+ if (Error Err = Reader.readInteger(ToIndex))
+ reportError(std::move(Err), Obj->getFileName());
+ if (Error Err = Reader.readInteger(Count))
+ reportError(std::move(Err), Obj->getFileName());
+ DictScope D(W, "CGProfileEntry");
+ W.printNumber("From", getSymbolName(*Obj->getSymbolByIndex(FromIndex)),
+ FromIndex);
+ W.printNumber("To", getSymbolName(*Obj->getSymbolByIndex(ToIndex)),
+ ToIndex);
+ W.printNumber("Weight", Count);
+ }
+}
+
void MachODumper::printNeededLibraries() {
ListScope D(W, "NeededLibraries");