summaryrefslogtreecommitdiffstats
path: root/llvm/tools/llvm-pdbdump
diff options
context:
space:
mode:
authorZachary Turner <zturner@google.com>2015-02-26 23:49:23 +0000
committerZachary Turner <zturner@google.com>2015-02-26 23:49:23 +0000
commitd270d22f3547aa4e7bf4f3c41c9828c6b981de70 (patch)
tree08909bf70a59d5e3dfc1d84cc1d01572a319a2e6 /llvm/tools/llvm-pdbdump
parent53a93c6c399b7e514f9500283be59022e20034a7 (diff)
downloadbcm5719-llvm-d270d22f3547aa4e7bf4f3c41c9828c6b981de70.tar.gz
bcm5719-llvm-d270d22f3547aa4e7bf4f3c41c9828c6b981de70.zip
[llvm-pdbdump] Fix dumping of function pointers and basic types.
Function pointers were not correctly handled by the dumper, and they would print as "* name". They now print as "int (__cdecl *name)(int arg1, int arg2)" as they should. Also, doubles were being printed as floats. This fixes that bug as well, and adds tests for all builtin types. as well as a test for function pointers. llvm-svn: 230703
Diffstat (limited to 'llvm/tools/llvm-pdbdump')
-rw-r--r--llvm/tools/llvm-pdbdump/CMakeLists.txt1
-rw-r--r--llvm/tools/llvm-pdbdump/FunctionDumper.cpp16
-rw-r--r--llvm/tools/llvm-pdbdump/FunctionDumper.h4
-rw-r--r--llvm/tools/llvm-pdbdump/TypeDumper.cpp2
-rw-r--r--llvm/tools/llvm-pdbdump/TypedefDumper.cpp12
-rw-r--r--llvm/tools/llvm-pdbdump/VariableDumper.cpp32
-rw-r--r--llvm/tools/llvm-pdbdump/VariableDumper.h2
7 files changed, 47 insertions, 22 deletions
diff --git a/llvm/tools/llvm-pdbdump/CMakeLists.txt b/llvm/tools/llvm-pdbdump/CMakeLists.txt
index 0519bf0634c..6dae9147bc2 100644
--- a/llvm/tools/llvm-pdbdump/CMakeLists.txt
+++ b/llvm/tools/llvm-pdbdump/CMakeLists.txt
@@ -5,6 +5,7 @@ set(LLVM_LINK_COMPONENTS
add_llvm_tool(llvm-pdbdump
llvm-pdbdump.cpp
+ BuiltinDumper.cpp
ClassDefinitionDumper.cpp
CompilandDumper.cpp
FunctionDumper.cpp
diff --git a/llvm/tools/llvm-pdbdump/FunctionDumper.cpp b/llvm/tools/llvm-pdbdump/FunctionDumper.cpp
index e65983034a6..1a1defed042 100644
--- a/llvm/tools/llvm-pdbdump/FunctionDumper.cpp
+++ b/llvm/tools/llvm-pdbdump/FunctionDumper.cpp
@@ -8,6 +8,7 @@
//===----------------------------------------------------------------------===//
#include "FunctionDumper.h"
+#include "BuiltinDumper.h"
#include "llvm-pdbdump.h"
#include "llvm/DebugInfo/PDB/IPDBSession.h"
@@ -16,7 +17,6 @@
#include "llvm/DebugInfo/PDB/PDBSymbolFuncDebugEnd.h"
#include "llvm/DebugInfo/PDB/PDBSymbolFuncDebugStart.h"
#include "llvm/DebugInfo/PDB/PDBSymbolTypeArray.h"
-#include "llvm/DebugInfo/PDB/PDBSymbolTypeBuiltin.h"
#include "llvm/DebugInfo/PDB/PDBSymbolTypeEnum.h"
#include "llvm/DebugInfo/PDB/PDBSymbolTypeFunctionArg.h"
#include "llvm/DebugInfo/PDB/PDBSymbolTypeFunctionSig.h"
@@ -45,7 +45,8 @@ void dumpClassParentWithScopeOperator(const T &Symbol, llvm::raw_ostream &OS,
FunctionDumper::FunctionDumper() : PDBSymDumper(true) {}
void FunctionDumper::start(const PDBSymbolTypeFunctionSig &Symbol,
- PointerType Pointer, raw_ostream &OS) {
+ const char *Name, PointerType Pointer,
+ raw_ostream &OS) {
auto ReturnType = Symbol.getReturnType();
ReturnType->dump(OS, 0, *this);
OS << " ";
@@ -70,13 +71,14 @@ void FunctionDumper::start(const PDBSymbolTypeFunctionSig &Symbol,
OS << "(";
if (ShouldDumpCallingConvention)
OS << CC << " ";
- OS << Symbol.getCallingConvention() << " ";
if (ClassParent)
OS << ClassParent->getName() << "::";
if (Pointer == PointerType::Reference)
OS << "&";
else
OS << "*";
+ if (Name)
+ OS << Name;
OS << ")";
}
@@ -185,10 +187,8 @@ void FunctionDumper::dump(const PDBSymbolTypeArray &Symbol, raw_ostream &OS,
void FunctionDumper::dump(const PDBSymbolTypeBuiltin &Symbol, raw_ostream &OS,
int Indent) {
- PDB_BuiltinType Type = Symbol.getBuiltinType();
- OS << Type;
- if (Type == PDB_BuiltinType::UInt || Type == PDB_BuiltinType::Int)
- OS << (8 * Symbol.getLength()) << "_t";
+ BuiltinDumper Dumper;
+ Dumper.start(Symbol, OS);
}
void FunctionDumper::dump(const PDBSymbolTypeEnum &Symbol, raw_ostream &OS,
@@ -226,7 +226,7 @@ void FunctionDumper::dump(const PDBSymbolTypePointer &Symbol, raw_ostream &OS,
FunctionDumper NestedDumper;
PointerType Pointer =
Symbol.isReference() ? PointerType::Reference : PointerType::Pointer;
- NestedDumper.start(*FuncSig, Pointer, OS);
+ NestedDumper.start(*FuncSig, nullptr, Pointer, OS);
} else {
if (Symbol.isConstType())
OS << "const ";
diff --git a/llvm/tools/llvm-pdbdump/FunctionDumper.h b/llvm/tools/llvm-pdbdump/FunctionDumper.h
index f9338cb8764..63aa5658f60 100644
--- a/llvm/tools/llvm-pdbdump/FunctionDumper.h
+++ b/llvm/tools/llvm-pdbdump/FunctionDumper.h
@@ -20,8 +20,8 @@ public:
enum class PointerType { None, Pointer, Reference };
- void start(const PDBSymbolTypeFunctionSig &Symbol, PointerType Pointer,
- raw_ostream &OS);
+ void start(const PDBSymbolTypeFunctionSig &Symbol, const char *Name,
+ PointerType Pointer, raw_ostream &OS);
void start(const PDBSymbolFunc &Symbol, PointerType Pointer, raw_ostream &OS,
int Indent);
diff --git a/llvm/tools/llvm-pdbdump/TypeDumper.cpp b/llvm/tools/llvm-pdbdump/TypeDumper.cpp
index 3131e9f00cc..7b705961441 100644
--- a/llvm/tools/llvm-pdbdump/TypeDumper.cpp
+++ b/llvm/tools/llvm-pdbdump/TypeDumper.cpp
@@ -68,7 +68,7 @@ void TypeDumper::dump(const PDBSymbolTypeFunctionSig &Symbol, raw_ostream &OS,
OS << newline(Indent);
FunctionDumper Dumper;
- Dumper.start(Symbol, FunctionDumper::PointerType::None, OS);
+ Dumper.start(Symbol, nullptr, FunctionDumper::PointerType::None, OS);
}
void TypeDumper::dump(const PDBSymbolTypeTypedef &Symbol, raw_ostream &OS,
diff --git a/llvm/tools/llvm-pdbdump/TypedefDumper.cpp b/llvm/tools/llvm-pdbdump/TypedefDumper.cpp
index 6eea6b69d95..7bb4b9d2d43 100644
--- a/llvm/tools/llvm-pdbdump/TypedefDumper.cpp
+++ b/llvm/tools/llvm-pdbdump/TypedefDumper.cpp
@@ -9,12 +9,12 @@
#include "TypedefDumper.h"
+#include "BuiltinDumper.h"
#include "FunctionDumper.h"
#include "llvm-pdbdump.h"
#include "llvm/DebugInfo/PDB/IPDBSession.h"
#include "llvm/DebugInfo/PDB/PDBExtras.h"
-#include "llvm/DebugInfo/PDB/PDBSymbolTypeBuiltin.h"
#include "llvm/DebugInfo/PDB/PDBSymbolTypeEnum.h"
#include "llvm/DebugInfo/PDB/PDBSymbolTypeFunctionSig.h"
#include "llvm/DebugInfo/PDB/PDBSymbolTypePointer.h"
@@ -39,10 +39,8 @@ void TypedefDumper::dump(const PDBSymbolTypeArray &Symbol, raw_ostream &OS,
void TypedefDumper::dump(const PDBSymbolTypeBuiltin &Symbol, raw_ostream &OS,
int Indent) {
- PDB_BuiltinType Type = Symbol.getBuiltinType();
- OS << Type;
- if (Type == PDB_BuiltinType::UInt || Type == PDB_BuiltinType::Int)
- OS << (8 * Symbol.getLength()) << "_t";
+ BuiltinDumper Dumper;
+ Dumper.start(Symbol, OS);
}
void TypedefDumper::dump(const PDBSymbolTypeEnum &Symbol, raw_ostream &OS,
@@ -65,7 +63,7 @@ void TypedefDumper::dump(const PDBSymbolTypePointer &Symbol, raw_ostream &OS,
if (Symbol.isReference())
Pointer = FunctionDumper::PointerType::Reference;
FunctionDumper NestedDumper;
- NestedDumper.start(*FuncSig, Pointer, OS);
+ NestedDumper.start(*FuncSig, nullptr, Pointer, OS);
} else {
PointeeType->dump(OS, Indent, *this);
OS << ((Symbol.isReference()) ? "&" : "*");
@@ -75,7 +73,7 @@ void TypedefDumper::dump(const PDBSymbolTypePointer &Symbol, raw_ostream &OS,
void TypedefDumper::dump(const PDBSymbolTypeFunctionSig &Symbol,
raw_ostream &OS, int Indent) {
FunctionDumper Dumper;
- Dumper.start(Symbol, FunctionDumper::PointerType::None, OS);
+ Dumper.start(Symbol, nullptr, FunctionDumper::PointerType::None, OS);
}
void TypedefDumper::dump(const PDBSymbolTypeUDT &Symbol, raw_ostream &OS,
diff --git a/llvm/tools/llvm-pdbdump/VariableDumper.cpp b/llvm/tools/llvm-pdbdump/VariableDumper.cpp
index 913cfee6622..371c270443a 100644
--- a/llvm/tools/llvm-pdbdump/VariableDumper.cpp
+++ b/llvm/tools/llvm-pdbdump/VariableDumper.cpp
@@ -9,13 +9,14 @@
#include "VariableDumper.h"
+#include "BuiltinDumper.h"
#include "llvm-pdbdump.h"
#include "FunctionDumper.h"
#include "llvm/DebugInfo/PDB/PDBSymbolData.h"
#include "llvm/DebugInfo/PDB/PDBSymbolFunc.h"
#include "llvm/DebugInfo/PDB/PDBSymbolTypeArray.h"
-#include "llvm/DebugInfo/PDB/PDBSymbolTypeBuiltin.h"
+#include "llvm/DebugInfo/PDB/PDBSymbolTypeFunctionSig.h"
#include "llvm/DebugInfo/PDB/PDBSymbolTypePointer.h"
#include "llvm/DebugInfo/PDB/PDBSymbolTypeTypedef.h"
#include "llvm/DebugInfo/PDB/PDBSymbolTypeEnum.h"
@@ -57,7 +58,8 @@ void VariableDumper::start(const PDBSymbolData &Var, raw_ostream &OS,
void VariableDumper::dump(const PDBSymbolTypeBuiltin &Symbol, raw_ostream &OS,
int Indent) {
- OS << Symbol.getBuiltinType();
+ BuiltinDumper Dumper;
+ Dumper.start(Symbol, OS);
}
void VariableDumper::dump(const PDBSymbolTypeEnum &Symbol, raw_ostream &OS,
@@ -114,7 +116,29 @@ void VariableDumper::dumpSymbolTypeAndName(const PDBSymbol &Type,
ElementType->dump(OS, 0, *this);
OS << " " << Name << IndexStream.str();
} else {
- Type.dump(OS, 0, *this);
- OS << " " << Name;
+ if (!tryDumpFunctionPointer(Type, Name, OS)) {
+ Type.dump(OS, 0, *this);
+ OS << " " << Name;
+ }
+ }
+}
+
+bool VariableDumper::tryDumpFunctionPointer(const PDBSymbol &Type,
+ StringRef Name, raw_ostream &OS) {
+ // Function pointers come across as pointers to function signatures. But the
+ // signature carries no name, so we have to handle this case separately.
+ if (auto *PointerType = dyn_cast<PDBSymbolTypePointer>(&Type)) {
+ auto PointeeType = PointerType->getPointeeType();
+ if (auto *FunctionSig =
+ dyn_cast<PDBSymbolTypeFunctionSig>(PointeeType.get())) {
+ FunctionDumper Dumper;
+ FunctionDumper::PointerType PT = FunctionDumper::PointerType::Pointer;
+ if (PointerType->isReference())
+ PT = FunctionDumper::PointerType::Reference;
+ std::string NameStr(Name.begin(), Name.end());
+ Dumper.start(*FunctionSig, NameStr.c_str(), PT, OS);
+ return true;
+ }
}
+ return false;
}
diff --git a/llvm/tools/llvm-pdbdump/VariableDumper.h b/llvm/tools/llvm-pdbdump/VariableDumper.h
index e6e71faca31..e8832e3d633 100644
--- a/llvm/tools/llvm-pdbdump/VariableDumper.h
+++ b/llvm/tools/llvm-pdbdump/VariableDumper.h
@@ -37,6 +37,8 @@ public:
private:
void dumpSymbolTypeAndName(const PDBSymbol &Type, StringRef Name,
raw_ostream &OS);
+ bool tryDumpFunctionPointer(const PDBSymbol &Type, StringRef Name,
+ raw_ostream &OS);
};
}
OpenPOWER on IntegriCloud