From e8c3e3b51c21dad94f0b427d7e0d6722e663fc64 Mon Sep 17 00:00:00 2001 From: Jim Laskey Date: Tue, 7 Mar 2006 20:53:47 +0000 Subject: [PATCH] Switch to using a numeric id for anchors. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@26598 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/CodeGen/MachineDebugInfo.h | 18 ++++++++--- lib/CodeGen/MachineDebugInfo.cpp | 40 +++++++++++++++++-------- lib/Transforms/IPO/Internalize.cpp | 7 +++-- 3 files changed, 46 insertions(+), 19 deletions(-) diff --git a/include/llvm/CodeGen/MachineDebugInfo.h b/include/llvm/CodeGen/MachineDebugInfo.h index 3fad875415d..f48e35727dd 100644 --- a/include/llvm/CodeGen/MachineDebugInfo.h +++ b/include/llvm/CodeGen/MachineDebugInfo.h @@ -142,16 +142,18 @@ public: //===----------------------------------------------------------------------===// /// AnchorDesc - Descriptors of this class act as markers for identifying /// descriptors of certain groups. +class AnchoredDesc; class AnchorDesc : public DebugInfoDesc { -private: - std::string Name; // Anchor type string. +private: + unsigned AnchorTag; // Tag number of descriptors anchored + // by this object. public: AnchorDesc(); - AnchorDesc(const std::string &N); + AnchorDesc(AnchoredDesc *D); // Accessors - const std::string &getName() const { return Name; } + unsigned getAnchorTag() const { return AnchorTag; } // Implement isa/cast/dyncast. static bool classof(const AnchorDesc *) { return true; } @@ -198,6 +200,10 @@ public: //===--------------------------------------------------------------------===// // Subclasses should supply the following virtual methods. + /// getAnchorString - Return a string used to label descriptor's anchor. + /// + virtual const char *getAnchorString() const = 0; + /// ApplyToFields - Target the visitor to the fields of the AnchoredDesc. /// virtual void ApplyToFields(DIVisitor *Visitor); @@ -217,6 +223,7 @@ private: public: CompileUnitDesc(); + // Accessors unsigned getDebugVersion() const { return DebugVersion; } unsigned getLanguage() const { return Language; } @@ -252,6 +259,7 @@ public: /// getAnchorString - Return a string used to label this descriptor's anchor. /// + static const char *AnchorString; virtual const char *getAnchorString() const; #ifndef NDEBUG @@ -553,6 +561,7 @@ public: /// getAnchorString - Return a string used to label this descriptor's anchor. /// + static const char *AnchorString; virtual const char *getAnchorString() const; #ifndef NDEBUG @@ -591,6 +600,7 @@ public: /// getAnchorString - Return a string used to label this descriptor's anchor. /// + static const char *AnchorString; virtual const char *getAnchorString() const; #ifndef NDEBUG diff --git a/lib/CodeGen/MachineDebugInfo.cpp b/lib/CodeGen/MachineDebugInfo.cpp index 8e1d8f22c25..ba5bf03b96f 100644 --- a/lib/CodeGen/MachineDebugInfo.cpp +++ b/lib/CodeGen/MachineDebugInfo.cpp @@ -53,7 +53,7 @@ getGlobalVariablesUsing(Module &M, const std::string &RootName) { std::vector FieldTypes; FieldTypes.push_back(Type::UIntTy); - FieldTypes.push_back(PointerType::get(Type::SByteTy)); + FieldTypes.push_back(Type::UIntTy); // Get the GlobalVariable root. GlobalVariable *UseRoot = M.getGlobalVariable(RootName, @@ -539,11 +539,11 @@ void DebugInfoDesc::ApplyToFields(DIVisitor *Visitor) { AnchorDesc::AnchorDesc() : DebugInfoDesc(DW_TAG_anchor) -, Name("") +, AnchorTag(0) {} -AnchorDesc::AnchorDesc(const std::string &N) +AnchorDesc::AnchorDesc(AnchoredDesc *D) : DebugInfoDesc(DW_TAG_anchor) -, Name(N) +, AnchorTag(D->getTag()) {} // Implement isa/cast/dyncast. @@ -562,13 +562,26 @@ GlobalValue::LinkageTypes AnchorDesc::getLinkage() const { void AnchorDesc::ApplyToFields(DIVisitor *Visitor) { DebugInfoDesc::ApplyToFields(Visitor); - Visitor->Apply(Name); + Visitor->Apply(AnchorTag); } -/// getDescString - Return a string used to compose global names and labels. -/// +/// getDescString - Return a string used to compose global names and labels. A +/// A global variable name needs to be defined for each debug descriptor that is +/// anchored. NOTE: that each global variable name here also needs to be added +/// to the list of names left external in the internalizer. +/// ExternalNames.insert("llvm.dbg.compile_units"); +/// ExternalNames.insert("llvm.dbg.global_variables"); +/// ExternalNames.insert("llvm.dbg.subprograms"); const char *AnchorDesc::getDescString() const { - return Name.c_str(); + switch (AnchorTag) { + case DW_TAG_compile_unit: return CompileUnitDesc::AnchorString; + case DW_TAG_variable: return GlobalVariableDesc::AnchorString; + case DW_TAG_subprogram: return SubprogramDesc::AnchorString; + default: break; + } + + assert(0 && "Tag does not have a case for anchor string"); + return ""; } /// getTypeString - Return a string used to label this descriptors type. @@ -581,7 +594,7 @@ const char *AnchorDesc::getTypeString() const { void AnchorDesc::dump() { std::cerr << getDescString() << " " << "Tag(" << getTag() << "), " - << "Name(" << Name << ")\n"; + << "AnchorTag(" << AnchorTag << ")\n"; } #endif @@ -649,8 +662,9 @@ const char *CompileUnitDesc::getTypeString() const { /// getAnchorString - Return a string used to label this descriptor's anchor. /// +const char *CompileUnitDesc::AnchorString = "llvm.dbg.compile_units"; const char *CompileUnitDesc::getAnchorString() const { - return "llvm.dbg.compile_units"; + return AnchorString; } #ifndef NDEBUG @@ -1014,8 +1028,9 @@ const char *GlobalVariableDesc::getTypeString() const { /// getAnchorString - Return a string used to label this descriptor's anchor. /// +const char *GlobalVariableDesc::AnchorString = "llvm.dbg.global_variables"; const char *GlobalVariableDesc::getAnchorString() const { - return "llvm.dbg.global_variables"; + return AnchorString; } #ifndef NDEBUG @@ -1063,8 +1078,9 @@ const char *SubprogramDesc::getTypeString() const { /// getAnchorString - Return a string used to label this descriptor's anchor. /// +const char *SubprogramDesc::AnchorString = "llvm.dbg.subprograms"; const char *SubprogramDesc::getAnchorString() const { - return "llvm.dbg.subprograms"; + return AnchorString; } #ifndef NDEBUG diff --git a/lib/Transforms/IPO/Internalize.cpp b/lib/Transforms/IPO/Internalize.cpp index 2f2f06b43b5..4bfc5a2186b 100644 --- a/lib/Transforms/IPO/Internalize.cpp +++ b/lib/Transforms/IPO/Internalize.cpp @@ -112,9 +112,10 @@ bool InternalizePass::runOnModule(Module &M) { ExternalNames.insert("llvm.used"); // Never internalize anchors used by the debugger, else the debugger won't - // find them. - ExternalNames.insert("llvm.dbg.translation_units"); - ExternalNames.insert("llvm.dbg.globals"); + // find them. (see MachineDebugInfo.) + ExternalNames.insert("llvm.dbg.compile_units"); + ExternalNames.insert("llvm.dbg.global_variables"); + ExternalNames.insert("llvm.dbg.subprograms"); // Mark all global variables with initializers as internal as well. for (Module::global_iterator I = M.global_begin(), E = M.global_end();