diff options
author | Zachary Turner <zturner@google.com> | 2015-02-26 23:49:23 +0000 |
---|---|---|
committer | Zachary Turner <zturner@google.com> | 2015-02-26 23:49:23 +0000 |
commit | d270d22f3547aa4e7bf4f3c41c9828c6b981de70 (patch) | |
tree | 08909bf70a59d5e3dfc1d84cc1d01572a319a2e6 /llvm/tools/llvm-pdbdump | |
parent | 53a93c6c399b7e514f9500283be59022e20034a7 (diff) | |
download | bcm5719-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.txt | 1 | ||||
-rw-r--r-- | llvm/tools/llvm-pdbdump/FunctionDumper.cpp | 16 | ||||
-rw-r--r-- | llvm/tools/llvm-pdbdump/FunctionDumper.h | 4 | ||||
-rw-r--r-- | llvm/tools/llvm-pdbdump/TypeDumper.cpp | 2 | ||||
-rw-r--r-- | llvm/tools/llvm-pdbdump/TypedefDumper.cpp | 12 | ||||
-rw-r--r-- | llvm/tools/llvm-pdbdump/VariableDumper.cpp | 32 | ||||
-rw-r--r-- | llvm/tools/llvm-pdbdump/VariableDumper.h | 2 |
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); }; } |