From 494f8c6cfaa7443bc708f6006c70f37ca30ac765 Mon Sep 17 00:00:00 2001 From: Bill Wendling Date: Tue, 26 Jun 2012 22:57:33 +0000 Subject: [PATCH] Revamp how debugging information is emitted for debug info objects. It's not necessary for each DI class to have its own copy of `print' and `dump'. Instead, just give DIDescriptor those methods and have it call the appropriate debugging printing routine based on the type of the debug information. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@159237 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/Analysis/DebugInfo.h | 91 ++++-------- lib/Analysis/DebugInfo.cpp | 220 ++++++++++++------------------ 2 files changed, 114 insertions(+), 197 deletions(-) diff --git a/include/llvm/Analysis/DebugInfo.h b/include/llvm/Analysis/DebugInfo.h index eb90ca4ae22..78c48917117 100644 --- a/include/llvm/Analysis/DebugInfo.h +++ b/include/llvm/Analysis/DebugInfo.h @@ -104,12 +104,6 @@ namespace llvm { return getUnsignedField(0) & ~LLVMDebugVersionMask; } - /// print - print descriptor. - void print(raw_ostream &OS) const; - - /// dump - print descriptor to dbgs() with a newline. - void dump() const; - bool isDerivedType() const; bool isCompositeType() const; bool isBasicType() const; @@ -130,10 +124,18 @@ namespace llvm { bool isTemplateTypeParameter() const; bool isTemplateValueParameter() const; bool isObjCProperty() const; + + /// print - print descriptor. + void print(raw_ostream &OS) const; + + /// dump - print descriptor to dbgs() with a newline. + void dump() const; }; /// DISubrange - This is used to represent ranges, for array bounds. class DISubrange : public DIDescriptor { + friend class DIDescriptor; + void printInternal(raw_ostream &OS) const; public: explicit DISubrange(const MDNode *N = 0) : DIDescriptor(N) {} @@ -156,6 +158,9 @@ namespace llvm { /// DIScope - A base class for various scopes. class DIScope : public DIDescriptor { virtual void anchor(); + protected: + friend class DIDescriptor; + void printInternal(raw_ostream &OS) const; public: explicit DIScope(const MDNode *N = 0) : DIDescriptor (N) {} virtual ~DIScope() {} @@ -167,6 +172,8 @@ namespace llvm { /// DICompileUnit - A wrapper for a compile unit. class DICompileUnit : public DIScope { virtual void anchor(); + friend class DIDescriptor; + void printInternal(raw_ostream &OS) const; public: explicit DICompileUnit(const MDNode *N = 0) : DIScope(N) {} @@ -196,17 +203,13 @@ namespace llvm { /// Verify - Verify that a compile unit is well formed. bool Verify() const; - - /// print - print compile unit. - void print(raw_ostream &OS) const; - - /// dump - print compile unit to dbgs() with a newline. - void dump() const; }; /// DIFile - This is a wrapper for a file. class DIFile : public DIScope { virtual void anchor(); + friend class DIDescriptor; + void printInternal(raw_ostream &OS) const {} // FIXME: Output something? public: explicit DIFile(const MDNode *N = 0) : DIScope(N) { if (DbgNode && !isFile()) @@ -224,6 +227,8 @@ namespace llvm { /// FIXME: it seems strange that this doesn't have either a reference to the /// type/precision or a file/line pair for location info. class DIEnumerator : public DIDescriptor { + friend class DIDescriptor; + void printInternal(raw_ostream &OS) const; public: explicit DIEnumerator(const MDNode *N = 0) : DIDescriptor(N) {} @@ -237,12 +242,12 @@ namespace llvm { class DIType : public DIScope { virtual void anchor(); protected: + friend class DIDescriptor; + void printInternal(raw_ostream &OS) const; // This ctor is used when the Tag has already been validated by a derived // ctor. DIType(const MDNode *N, bool, bool) : DIScope(N) {} - public: - /// Verify - Verify that a type descriptor is well formed. bool Verify() const; explicit DIType(const MDNode *N); @@ -314,12 +319,6 @@ namespace llvm { /// this descriptor. void replaceAllUsesWith(DIDescriptor &D); void replaceAllUsesWith(MDNode *D); - - /// print - print type. - void print(raw_ostream &OS) const; - - /// dump - print type to dbgs() with a newline. - void dump() const; }; /// DIBasicType - A basic type, like 'int' or 'float'. @@ -332,18 +331,14 @@ namespace llvm { /// Verify - Verify that a basic type descriptor is well formed. bool Verify() const; - - /// print - print basic type. - void print(raw_ostream &OS) const; - - /// dump - print basic type to dbgs() with a newline. - void dump() const; }; /// DIDerivedType - A simple derived type, like a const qualified type, /// a typedef, a pointer or reference, etc. class DIDerivedType : public DIType { virtual void anchor(); + friend class DIDescriptor; + void printInternal(raw_ostream &OS) const; protected: explicit DIDerivedType(const MDNode *N, bool, bool) : DIType(N, true, true) {} @@ -401,12 +396,6 @@ namespace llvm { /// Verify - Verify that a derived type descriptor is well formed. bool Verify() const; - - /// print - print derived type. - void print(raw_ostream &OS) const; - - /// dump - print derived type to dbgs() with a newline. - void dump() const; }; /// DICompositeType - This descriptor holds a type that can refer to multiple @@ -414,6 +403,8 @@ namespace llvm { /// FIXME: Why is this a DIDerivedType?? class DICompositeType : public DIDerivedType { virtual void anchor(); + friend class DIDescriptor; + void printInternal(raw_ostream &OS) const; public: explicit DICompositeType(const MDNode *N = 0) : DIDerivedType(N, true, true) { @@ -430,12 +421,6 @@ namespace llvm { /// Verify - Verify that a composite type descriptor is well formed. bool Verify() const; - - /// print - print composite type. - void print(raw_ostream &OS) const; - - /// dump - print composite type to dbgs() with a newline. - void dump() const; }; /// DITemplateTypeParameter - This is a wrapper for template type parameter. @@ -478,6 +463,8 @@ namespace llvm { /// DISubprogram - This is a wrapper for a subprogram (e.g. a function). class DISubprogram : public DIScope { virtual void anchor(); + friend class DIDescriptor; + void printInternal(raw_ostream &OS) const; public: explicit DISubprogram(const MDNode *N = 0) : DIScope(N) {} @@ -576,12 +563,6 @@ namespace llvm { /// Verify - Verify that a subprogram descriptor is well formed. bool Verify() const; - /// print - print subprogram. - void print(raw_ostream &OS) const; - - /// dump - print subprogram to dbgs() with a newline. - void dump() const; - /// describes - Return true if this subprogram provides debugging /// information for the function F. bool describes(const Function *F); @@ -597,6 +578,8 @@ namespace llvm { /// DIGlobalVariable - This is a wrapper for a global variable. class DIGlobalVariable : public DIDescriptor { + friend class DIDescriptor; + void printInternal(raw_ostream &OS) const; public: explicit DIGlobalVariable(const MDNode *N = 0) : DIDescriptor(N) {} @@ -634,17 +617,13 @@ namespace llvm { /// Verify - Verify that a global variable descriptor is well formed. bool Verify() const; - - /// print - print global variable. - void print(raw_ostream &OS) const; - - /// dump - print global variable to dbgs() with a newline. - void dump() const; }; /// DIVariable - This is a wrapper for a variable (e.g. parameter, local, /// global etc). class DIVariable : public DIDescriptor { + friend class DIDescriptor; + void printInternal(raw_ostream &OS) const; public: explicit DIVariable(const MDNode *N = 0) : DIDescriptor(N) {} @@ -706,13 +685,7 @@ namespace llvm { /// information for an inlined function arguments. bool isInlinedFnArgument(const Function *CurFn); - /// print - print variable. - void print(raw_ostream &OS) const; - void printExtendedName(raw_ostream &OS) const; - - /// dump - print variable to dbgs() with a newline. - void dump() const; }; /// DILexicalBlock - This is a wrapper for a lexical block. @@ -830,12 +803,6 @@ namespace llvm { /// Verify - Verify that a derived type descriptor is well formed. bool Verify() const; - - /// print - print derived type. - void print(raw_ostream &OS) const; - - /// dump - print derived type to dbgs() with a newline. - void dump() const; }; /// getDISubprogram - Find subprogram that is enclosing this scope. diff --git a/lib/Analysis/DebugInfo.cpp b/lib/Analysis/DebugInfo.cpp index 194aed8b9f6..00a2eaadba3 100644 --- a/lib/Analysis/DebugInfo.cpp +++ b/lib/Analysis/DebugInfo.cpp @@ -694,131 +694,139 @@ void DILexicalBlockFile::anchor() { } // DIDescriptor: dump routines for all descriptors. //===----------------------------------------------------------------------===// +/// dump - Print descriptor to dbgs() with a newline. +void DIDescriptor::dump() const { + print(dbgs()); dbgs() << '\n'; +} /// print - Print descriptor. void DIDescriptor::print(raw_ostream &OS) const { - OS << "[" << dwarf::TagString(getTag()) << "] "; - OS.write_hex((intptr_t) &*DbgNode) << ']'; + if (!DbgNode) return; + + OS << "[" << dwarf::TagString(getTag()) << ']'; + + if (this->isSubrange()) { + DISubrange(DbgNode).printInternal(OS); + } else if (this->isScope()) { + DIScope(DbgNode).printInternal(OS); + } else if (this->isCompileUnit()) { + DICompileUnit(DbgNode).printInternal(OS); + } else if (this->isFile()) { + DIFile(DbgNode).printInternal(OS); + } else if (this->isEnumerator()) { + DIEnumerator(DbgNode).printInternal(OS); + } else if (this->isBasicType()) { + DIType(DbgNode).printInternal(OS); + } else if (this->isDerivedType()) { + DIDerivedType(DbgNode).printInternal(OS); + } else if (this->isCompositeType()) { + DICompositeType(DbgNode).printInternal(OS); + } else if (this->isSubprogram()) { + DISubprogram(DbgNode).printInternal(OS); + } else if (this->isGlobalVariable()) { + DIGlobalVariable(DbgNode).printInternal(OS); + } else if (this->isVariable()) { + DIVariable(DbgNode).printInternal(OS); + } } -/// print - Print compile unit. -void DICompileUnit::print(raw_ostream &OS) const { - if (getLanguage()) - OS << " [" << dwarf::LanguageString(getLanguage()) << "] "; - - OS << " [" << getDirectory() << "/" << getFilename() << "]"; +void DISubrange::printInternal(raw_ostream &OS) const { + OS << " [" << getLo() << ", " << getHi() << ']'; } -/// print - Print type. -void DIType::print(raw_ostream &OS) const { +void DIScope::printInternal(raw_ostream &OS) const { + OS << " [" << getDirectory() << "/" << getFilename() << ']'; +} + +void DICompileUnit::printInternal(raw_ostream &OS) const { + DIScope::printInternal(OS); + if (unsigned Lang = getLanguage()) + OS << " [" << dwarf::LanguageString(Lang) << ']'; +} + +void DIEnumerator::printInternal(raw_ostream &OS) const { + OS << " [" << getName() << " :: " << getEnumValue() << ']'; +} + +void DIType::printInternal(raw_ostream &OS) const { if (!DbgNode) return; StringRef Res = getName(); if (!Res.empty()) - OS << " [" << Res << "] "; + OS << " [" << Res << "]"; - unsigned Tag = getTag(); - OS << " [" << dwarf::TagString(Tag) << "] "; + // TODO: Print context? - // TODO : Print context - OS << " [" - << "line " << getLineNumber() << ", " - << getSizeInBits() << " bits, " - << getAlignInBits() << " bit alignment, " - << getOffsetInBits() << " bit offset" - << "] "; + OS << " [line " << getLineNumber() + << ", size " << getSizeInBits() + << ", align " << getAlignInBits() + << ", offset " << getOffsetInBits(); + if (isBasicType()) + OS << ", enc " + << dwarf::AttributeEncodingString(DIBasicType(DbgNode).getEncoding()); + OS << "]"; if (isPrivate()) - OS << " [private] "; + OS << " [private]"; else if (isProtected()) - OS << " [protected] "; + OS << " [protected]"; if (isForwardDecl()) - OS << " [fwd] "; - - if (isBasicType()) - DIBasicType(DbgNode).print(OS); - else if (isDerivedType()) { - DIDerivedType DTy = DIDerivedType(DbgNode); - DTy.print(OS); - DICompositeType CTy = getDICompositeType(DTy); - if (CTy.Verify()) - CTy.print(OS); - } - else if (isCompositeType()) - DICompositeType(DbgNode).print(OS); - else { - OS << "Invalid DIType\n"; - return; - } - - OS << "\n"; + OS << " [fwd]"; } -/// print - Print basic type. -void DIBasicType::print(raw_ostream &OS) const { - OS << " [" << dwarf::AttributeEncodingString(getEncoding()) << "] "; +void DIDerivedType::printInternal(raw_ostream &OS) const { + DIType::printInternal(OS); + OS << " [from " << getTypeDerivedFrom().getName() << ']'; } -/// print - Print derived type. -void DIDerivedType::print(raw_ostream &OS) const { - OS << "\n\t Derived From: "; - getTypeDerivedFrom().print(OS); - OS << "\n\t"; -} - -/// print - Print composite type. -void DICompositeType::print(raw_ostream &OS) const { +void DICompositeType::printInternal(raw_ostream &OS) const { + DIType::printInternal(OS); DIArray A = getTypeArray(); OS << " [" << A.getNumElements() << " elements]"; } -/// print - Print subprogram. -void DISubprogram::print(raw_ostream &OS) const { +void DISubprogram::printInternal(raw_ostream &OS) const { StringRef Res = getName(); if (!Res.empty()) - OS << " [" << Res << "] "; - - unsigned Tag = getTag(); - OS << " [" << dwarf::TagString(Tag) << "] "; + OS << " [" << Res << ']'; // TODO : Print context - OS << " [" << getLineNumber() << "] "; + + OS << " [line " << getLineNumber() << ']'; if (isLocalToUnit()) - OS << " [local] "; + OS << " [local]"; if (isDefinition()) - OS << " [def] "; + OS << " [def]"; if (getScopeLineNumber() != getLineNumber()) - OS << " [Scope: " << getScopeLineNumber() << "] "; - - OS << "\n"; + OS << " [scope " << getScopeLineNumber() << "]"; } -/// print - Print global variable. -void DIGlobalVariable::print(raw_ostream &OS) const { - OS << " ["; +void DIGlobalVariable::printInternal(raw_ostream &OS) const { StringRef Res = getName(); if (!Res.empty()) - OS << " [" << Res << "] "; + OS << " [" << Res << ']'; - unsigned Tag = getTag(); - OS << " [" << dwarf::TagString(Tag) << "] "; + OS << " [line " << getLineNumber() << ']'; // TODO : Print context - OS << " [" << getLineNumber() << "] "; if (isLocalToUnit()) - OS << " [local] "; + OS << " [local]"; if (isDefinition()) - OS << " [def] "; + OS << " [def]"; +} - if (isGlobalVariable()) - DIGlobalVariable(DbgNode).print(OS); - OS << "]\n"; +void DIVariable::printInternal(raw_ostream &OS) const { + StringRef Res = getName(); + if (!Res.empty()) + OS << " [" << Res << ']'; + + OS << " [line " << getLineNumber() << ']'; } static void printDebugLoc(DebugLoc DL, raw_ostream &CommentOS, @@ -857,64 +865,6 @@ void DIVariable::printExtendedName(raw_ostream &OS) const { } } -/// print - Print variable. -void DIVariable::print(raw_ostream &OS) const { - StringRef Res = getName(); - if (!Res.empty()) - OS << " [" << Res << "] "; - - OS << " [" << getLineNumber() << "] "; - getType().print(OS); - OS << "\n"; - - // FIXME: Dump complex addresses -} - -/// dump - Print descriptor to dbgs() with a newline. -void DIDescriptor::dump() const { - print(dbgs()); dbgs() << '\n'; -} - -/// dump - Print compile unit to dbgs() with a newline. -void DICompileUnit::dump() const { - print(dbgs()); dbgs() << '\n'; -} - -/// dump - Print type to dbgs() with a newline. -void DIType::dump() const { - print(dbgs()); dbgs() << '\n'; -} - -/// dump - Print basic type to dbgs() with a newline. -void DIBasicType::dump() const { - print(dbgs()); dbgs() << '\n'; -} - -/// dump - Print derived type to dbgs() with a newline. -void DIDerivedType::dump() const { - print(dbgs()); dbgs() << '\n'; -} - -/// dump - Print composite type to dbgs() with a newline. -void DICompositeType::dump() const { - print(dbgs()); dbgs() << '\n'; -} - -/// dump - Print subprogram to dbgs() with a newline. -void DISubprogram::dump() const { - print(dbgs()); dbgs() << '\n'; -} - -/// dump - Print global variable. -void DIGlobalVariable::dump() const { - print(dbgs()); dbgs() << '\n'; -} - -/// dump - Print variable. -void DIVariable::dump() const { - print(dbgs()); dbgs() << '\n'; -} - /// fixupObjcLikeName - Replace contains special characters used /// in a typical Objective-C names with '.' in a given string. static void fixupObjcLikeName(StringRef Str, SmallVectorImpl &Out) {