summaryrefslogtreecommitdiffstats
path: root/llvm/tools
diff options
context:
space:
mode:
authorRui Ueyama <ruiu@google.com>2016-06-06 18:39:21 +0000
committerRui Ueyama <ruiu@google.com>2016-06-06 18:39:21 +0000
commitef2b48848256ce6e87ccd393d5a9cbb56a3042ef (patch)
treed90530af5768c85c13bf502446baf9999c0d34b2 /llvm/tools
parent77ea344786abf9e96805641868dcd04f59e452ad (diff)
downloadbcm5719-llvm-ef2b48848256ce6e87ccd393d5a9cbb56a3042ef.tar.gz
bcm5719-llvm-ef2b48848256ce6e87ccd393d5a9cbb56a3042ef.zip
[pdbdump] Print out New FPO stream contents.
The data strucutre in the new FPO stream is described in the PE/COFF spec. There is one record per function if frame pointer is omitted. Differential Revision: http://reviews.llvm.org/D20999 llvm-svn: 271926
Diffstat (limited to 'llvm/tools')
-rw-r--r--llvm/tools/llvm-pdbdump/LLVMOutputStyle.cpp25
-rw-r--r--llvm/tools/llvm-pdbdump/LLVMOutputStyle.h1
-rw-r--r--llvm/tools/llvm-pdbdump/OutputStyle.h1
-rw-r--r--llvm/tools/llvm-pdbdump/llvm-pdbdump.cpp8
-rw-r--r--llvm/tools/llvm-pdbdump/llvm-pdbdump.h1
5 files changed, 36 insertions, 0 deletions
diff --git a/llvm/tools/llvm-pdbdump/LLVMOutputStyle.cpp b/llvm/tools/llvm-pdbdump/LLVMOutputStyle.cpp
index 2c3dabf613b..1707454df66 100644
--- a/llvm/tools/llvm-pdbdump/LLVMOutputStyle.cpp
+++ b/llvm/tools/llvm-pdbdump/LLVMOutputStyle.cpp
@@ -669,3 +669,28 @@ Error LLVMOutputStyle::dumpSectionHeaders() {
}
return Error::success();
}
+
+Error LLVMOutputStyle::dumpFpoStream() {
+ if (!opts::DumpFpo)
+ return Error::success();
+
+ auto DbiS = File.getPDBDbiStream();
+ if (auto EC = DbiS.takeError())
+ return EC;
+ DbiStream &DS = DbiS.get();
+
+ ListScope D(P, "New FPO");
+ for (const object::FpoData &Fpo : DS.getFpoRecords()) {
+ DictScope DD(P, "");
+ P.printNumber("Offset", Fpo.Offset);
+ P.printNumber("Size", Fpo.Size);
+ P.printNumber("Number of locals", Fpo.NumLocals);
+ P.printNumber("Number of params", Fpo.NumParams);
+ P.printNumber("Size of Prolog", Fpo.getPrologSize());
+ P.printNumber("Number of Saved Registers", Fpo.getNumSavedRegs());
+ P.printBoolean("Has SEH", Fpo.hasSEH());
+ P.printBoolean("Use BP", Fpo.useBP());
+ P.printNumber("Frame Pointer", Fpo.getFP());
+ }
+ return Error::success();
+}
diff --git a/llvm/tools/llvm-pdbdump/LLVMOutputStyle.h b/llvm/tools/llvm-pdbdump/LLVMOutputStyle.h
index 1643b42bbdf..0c601c9b9b1 100644
--- a/llvm/tools/llvm-pdbdump/LLVMOutputStyle.h
+++ b/llvm/tools/llvm-pdbdump/LLVMOutputStyle.h
@@ -33,6 +33,7 @@ public:
Error dumpSectionMap() override;
Error dumpPublicsStream() override;
Error dumpSectionHeaders() override;
+ Error dumpFpoStream() override;
private:
PDBFile &File;
diff --git a/llvm/tools/llvm-pdbdump/OutputStyle.h b/llvm/tools/llvm-pdbdump/OutputStyle.h
index d8ab0d46464..c42f7d21002 100644
--- a/llvm/tools/llvm-pdbdump/OutputStyle.h
+++ b/llvm/tools/llvm-pdbdump/OutputStyle.h
@@ -31,6 +31,7 @@ public:
virtual Error dumpSectionMap() = 0;
virtual Error dumpPublicsStream() = 0;
virtual Error dumpSectionHeaders() = 0;
+ virtual Error dumpFpoStream() = 0;
};
}
}
diff --git a/llvm/tools/llvm-pdbdump/llvm-pdbdump.cpp b/llvm/tools/llvm-pdbdump/llvm-pdbdump.cpp
index 4396c0d681b..b798929ace8 100644
--- a/llvm/tools/llvm-pdbdump/llvm-pdbdump.cpp
+++ b/llvm/tools/llvm-pdbdump/llvm-pdbdump.cpp
@@ -154,6 +154,8 @@ cl::opt<bool>
cl::opt<bool> DumpSectionHeaders("raw-section-headers",
cl::desc("dump section headers"),
cl::cat(NativeOptions));
+cl::opt<bool> DumpFpo("raw-fpo", cl::desc("dump FPO records"),
+ cl::cat(NativeOptions));
cl::opt<bool>
RawAll("raw-all",
@@ -251,6 +253,9 @@ static Error dumpStructure(RawSession &RS) {
if (auto EC = O->dumpSectionHeaders())
return EC;
+
+ if (auto EC = O->dumpFpoStream())
+ return EC;
return Error::success();
}
@@ -291,6 +296,8 @@ bool isRawDumpEnabled() {
return true;
if (opts::DumpLineInfo)
return true;
+ if (opts::DumpFpo)
+ return true;
return false;
}
@@ -460,6 +467,7 @@ int main(int argc_, const char *argv_[]) {
opts::DumpSectionMap = true;
opts::DumpSectionContribs = true;
opts::DumpLineInfo = true;
+ opts::DumpFpo = true;
}
// When adding filters for excluded compilands and types, we need to remember
diff --git a/llvm/tools/llvm-pdbdump/llvm-pdbdump.h b/llvm/tools/llvm-pdbdump/llvm-pdbdump.h
index 4c12beadce3..4a6afaeb14e 100644
--- a/llvm/tools/llvm-pdbdump/llvm-pdbdump.h
+++ b/llvm/tools/llvm-pdbdump/llvm-pdbdump.h
@@ -43,6 +43,7 @@ extern llvm::cl::opt<bool> DumpLineInfo;
extern llvm::cl::opt<bool> DumpSectionMap;
extern llvm::cl::opt<bool> DumpSymRecordBytes;
extern llvm::cl::opt<bool> DumpSectionHeaders;
+extern llvm::cl::opt<bool> DumpFpo;
extern llvm::cl::opt<bool> ExcludeCompilerGenerated;
OpenPOWER on IntegriCloud