From: Devang Patel Date: Fri, 30 Jan 2009 01:03:10 +0000 (+0000) Subject: Add dump() routines to help debug debug info :) X-Git-Url: http://plrg.eecs.uci.edu/git/?a=commitdiff_plain;h=bf3f5a08eed98e723e920a06a0cde9699593aa41;hp=35247c35136232bb30aa17543dbcf9c92fa24d29;p=oota-llvm.git Add dump() routines to help debug debug info :) git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@63353 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/llvm/Analysis/DebugInfo.h b/include/llvm/Analysis/DebugInfo.h index 336d816bc14..310c1acf08f 100644 --- a/include/llvm/Analysis/DebugInfo.h +++ b/include/llvm/Analysis/DebugInfo.h @@ -114,6 +114,9 @@ namespace llvm { /// Verify - Verify that a compile unit is well formed. bool Verify() const; + + /// dump - print compile unit. + void dump() const; }; /// DIEnumerator - A wrapper for an enumerator (e.g. X and Y in 'enum {X,Y}'). @@ -189,6 +192,9 @@ namespace llvm { assert (0 && "Invalid DIDescriptor"); return ""; } + + /// dump - print type. + void dump() const; }; /// DIBasicType - A basic type, like 'int' or 'float'. @@ -199,6 +205,9 @@ namespace llvm { unsigned getEncoding() const { return getUnsignedField(9); } std::string getFilename() const { return getStringField(10); } std::string getDirectory() const { return getStringField(11); } + + /// dump - print basic type. + void dump() const; }; /// DIDerivedType - A simple derived type, like a const qualified type, @@ -213,6 +222,9 @@ namespace llvm { DIType getTypeDerivedFrom() const { return getFieldAs(9); } std::string getFilename() const { return getStringField(10); } std::string getDirectory() const { return getStringField(11); } + + /// dump - print derived type. + void dump() const; }; /// DICompositeType - This descriptor holds a type that can refer to multiple @@ -228,6 +240,9 @@ namespace llvm { /// Verify - Verify that a composite type descriptor is well formed. bool Verify() const; + + /// dump - print composite type. + void dump() const; }; /// DIGlobal - This is a common class for global variables and subprograms. @@ -273,6 +288,9 @@ namespace llvm { assert (0 && "Invalid DIDescriptor"); return ""; } + + /// dump - print global. + void dump() const; }; /// DISubprogram - This is a wrapper for a subprogram (e.g. a function). @@ -285,6 +303,9 @@ namespace llvm { /// Verify - Verify that a subprogram descriptor is well formed. bool Verify() const; + + /// dump - print subprogram. + void dump() const; }; /// DIGlobalVariable - This is a wrapper for a global variable. @@ -298,6 +319,9 @@ namespace llvm { /// Verify - Verify that a global variable descriptor is well formed. bool Verify() const; + + /// dump - print global variable. + void dump() const; }; /// DIVariable - This is a wrapper for a variable (e.g. parameter, local, @@ -319,6 +343,9 @@ namespace llvm { /// Verify - Verify that a variable descriptor is well formed. bool Verify() const; + + /// dump - print variable. + void dump() const; }; /// DIBlock - This is a wrapper for a block (e.g. a function, scope, etc). diff --git a/lib/Analysis/DebugInfo.cpp b/lib/Analysis/DebugInfo.cpp index 2f336572a1d..e5bbbd5aab0 100644 --- a/lib/Analysis/DebugInfo.cpp +++ b/lib/Analysis/DebugInfo.cpp @@ -20,6 +20,7 @@ #include "llvm/Instructions.h" #include "llvm/Module.h" #include "llvm/Analysis/ValueTracking.h" +#include "llvm/Support/Streams.h" using namespace llvm; //===----------------------------------------------------------------------===// @@ -870,3 +871,103 @@ namespace llvm { } } +/// dump - print compile unit. +void DICompileUnit::dump() const { + cerr << " [" << dwarf::LanguageString(getLanguage()) << "] "; + cerr << " [" << getDirectory() << "/" << getFilename() << " ]"; +} + +/// dump - print type. +void DIType::dump() const { + if (isNull()) return; + if (!getName().empty()) + cerr << " [" << getName() << "] "; + unsigned Tag = getTag(); + cerr << " [" << dwarf::TagString(Tag) << "] "; + // TODO : Print context + getCompileUnit().dump(); + cerr << " [" + << getLineNumber() << ", " + << getSizeInBits() << ", " + << getAlignInBits() << ", " + << getOffsetInBits() + << "] "; + if (isPrivate()) + cerr << " [private] "; + else if (isProtected()) + cerr << " [protected] "; + if (isForwardDecl()) + cerr << " [fwd] "; + + if (isBasicType(Tag)) + DIBasicType(GV).dump(); + else if (isDerivedType(Tag)) + DIDerivedType(GV).dump(); + else if (isCompositeType(Tag)) + DICompositeType(GV).dump(); + else { + cerr << "Invalid DIType\n"; + return; + } + cerr << "\n"; +} + +/// dump - print basic type. +void DIBasicType::dump() const { + cerr << " [" << dwarf::AttributeEncodingString(getEncoding()) << "] "; + +} + +/// dump - print derived type. +void DIDerivedType::dump() const { + cerr << "\n\t Derived From: "; getTypeDerivedFrom().dump(); +} + +/// dump - print composite type. +void DICompositeType::dump() const { + DIArray A = getTypeArray(); + if (A.isNull()) + return; + cerr << " [" << A.getNumElements() << " elements]"; +} + +/// dump - print global. +void DIGlobal::dump() const { + + if (!getName().empty()) + cerr << " [" << getName() << "] "; + unsigned Tag = getTag(); + cerr << " [" << dwarf::TagString(Tag) << "] "; + // TODO : Print context + getCompileUnit().dump(); + cerr << " [" << getLineNumber() << "] "; + if (isLocalToUnit()) + cerr << " [local] "; + if (isDefinition()) + cerr << " [def] "; + + if (isGlobalVariable(Tag)) + DIGlobalVariable(GV).dump(); + + cerr << "\n"; +} + +/// dump - print subprogram. +void DISubprogram::dump() const { + DIGlobal::dump(); +} + +/// dump - print global variable. +void DIGlobalVariable::dump() const { + cerr << " ["; getGlobal()->dump(); cerr << "] "; +} + +/// dump - print variable. +void DIVariable::dump() const { + if (!getName().empty()) + cerr << " [" << getName() << "] "; + getCompileUnit().dump(); + cerr << " [" << getLineNumber() << "] "; + getType().dump(); + cerr << "\n"; +}