summaryrefslogtreecommitdiffstats
path: root/llvm/tools/llvm-readobj/MachODumper.cpp
diff options
context:
space:
mode:
authorLang Hames <lhames@gmail.com>2015-06-26 23:56:53 +0000
committerLang Hames <lhames@gmail.com>2015-06-26 23:56:53 +0000
commit0000afd88cc35d6febd25c72f484b22378897737 (patch)
treea5e8e0565506a1dcdd44174363cf95ef815a8fb7 /llvm/tools/llvm-readobj/MachODumper.cpp
parent605e1f6b6cb8bba842a08ef5d59eee3e42f5a834 (diff)
downloadbcm5719-llvm-0000afd88cc35d6febd25c72f484b22378897737.tar.gz
bcm5719-llvm-0000afd88cc35d6febd25c72f484b22378897737.zip
[StackMaps] Add a lightweight parser for stackmap version 1 sections.
The parser provides a convenient interface for reading llvm stackmap v1 sections in object files. This patch also includes a new option for llvm-readobj, '-stackmap', which uses the parser to pretty-print stackmap sections for debugging/testing purposes. llvm-svn: 240860
Diffstat (limited to 'llvm/tools/llvm-readobj/MachODumper.cpp')
-rw-r--r--llvm/tools/llvm-readobj/MachODumper.cpp31
1 files changed, 31 insertions, 0 deletions
diff --git a/llvm/tools/llvm-readobj/MachODumper.cpp b/llvm/tools/llvm-readobj/MachODumper.cpp
index aeb563a25ff..6666870825f 100644
--- a/llvm/tools/llvm-readobj/MachODumper.cpp
+++ b/llvm/tools/llvm-readobj/MachODumper.cpp
@@ -14,6 +14,7 @@
#include "llvm-readobj.h"
#include "Error.h"
#include "ObjDumper.h"
+#include "StackMapPrinter.h"
#include "StreamWriter.h"
#include "llvm/ADT/SmallString.h"
#include "llvm/ADT/StringExtras.h"
@@ -37,6 +38,7 @@ public:
void printSymbols() override;
void printDynamicSymbols() override;
void printUnwindInfo() override;
+ void printStackMap() const override;
private:
template<class MachHeader>
@@ -573,3 +575,32 @@ void MachODumper::printSymbol(const SymbolRef &Symbol) {
void MachODumper::printUnwindInfo() {
W.startLine() << "UnwindInfo not implemented.\n";
}
+
+void MachODumper::printStackMap() const {
+ object::SectionRef StackMapSection;
+ for (auto Sec : Obj->sections()) {
+ StringRef Name;
+ Sec.getName(Name);
+ if (Name == "__llvm_stackmaps") {
+ StackMapSection = Sec;
+ break;
+ }
+ }
+
+ if (StackMapSection == object::SectionRef())
+ return;
+
+ StringRef StackMapContents;
+ StackMapSection.getContents(StackMapContents);
+ ArrayRef<uint8_t> StackMapContentsArray(
+ reinterpret_cast<const uint8_t*>(StackMapContents.data()),
+ StackMapContents.size());
+
+ if (Obj->isLittleEndian())
+ prettyPrintStackMap(
+ llvm::outs(),
+ StackMapV1Parser<support::little>(StackMapContentsArray));
+ else
+ prettyPrintStackMap(llvm::outs(),
+ StackMapV1Parser<support::big>(StackMapContentsArray));
+}
OpenPOWER on IntegriCloud