aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/llvm/CodeGen/MachineDebugInfo.h18
-rw-r--r--lib/CodeGen/MachineDebugInfo.cpp40
-rw-r--r--lib/Transforms/IPO/Internalize.cpp7
3 files changed, 46 insertions, 19 deletions
diff --git a/include/llvm/CodeGen/MachineDebugInfo.h b/include/llvm/CodeGen/MachineDebugInfo.h
index 3fad875415..f48e35727d 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 8e1d8f22c2..ba5bf03b96 100644
--- a/lib/CodeGen/MachineDebugInfo.cpp
+++ b/lib/CodeGen/MachineDebugInfo.cpp
@@ -53,7 +53,7 @@ getGlobalVariablesUsing(Module &M, const std::string &RootName) {
std::vector<const Type*> 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 2f2f06b43b..4bfc5a2186 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();