aboutsummaryrefslogtreecommitdiff
path: root/lib/CodeGen
diff options
context:
space:
mode:
authorJim Laskey <jlaskey@mac.com>2006-03-01 23:52:37 +0000
committerJim Laskey <jlaskey@mac.com>2006-03-01 23:52:37 +0000
commit6a3eb01084ff5fe0eee64a66cd050d86a38579c7 (patch)
tree9f7e4dbe282b0b85ec62f6f9f10ef1b805addd60 /lib/CodeGen
parent5df594069342a75a1f83a5c351adbd2e7abd51ea (diff)
Support for enumerations.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@26466 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen')
-rw-r--r--lib/CodeGen/DwarfWriter.cpp15
-rw-r--r--lib/CodeGen/MachineDebugInfo.cpp44
2 files changed, 57 insertions, 2 deletions
diff --git a/lib/CodeGen/DwarfWriter.cpp b/lib/CodeGen/DwarfWriter.cpp
index 58dc6dd813..dfe94f999f 100644
--- a/lib/CodeGen/DwarfWriter.cpp
+++ b/lib/CodeGen/DwarfWriter.cpp
@@ -1109,8 +1109,8 @@ DIE *DwarfWriter::NewType(DIE *Context, TypeDesc *TyDesc) {
if (Lo != Hi) {
Subrange->AddDIEntry(DW_AT_type, DW_FORM_ref4, IndexTy);
// Only add low if non-zero.
- if (Lo) Subrange->AddUInt(DW_AT_lower_bound, 0, Lo);
- Subrange->AddUInt(DW_AT_upper_bound, 0, Hi);
+ if (Lo) Subrange->AddSInt(DW_AT_lower_bound, 0, Lo);
+ Subrange->AddSInt(DW_AT_upper_bound, 0, Hi);
}
Ty->AddChild(Subrange);
}
@@ -1124,6 +1124,17 @@ DIE *DwarfWriter::NewType(DIE *Context, TypeDesc *TyDesc) {
break;
}
case DW_TAG_enumeration_type: {
+ // Add enumerators to enumeration type.
+ for(unsigned i = 0, N = Elements.size(); i < N; ++i) {
+ EnumeratorDesc *ED = cast<EnumeratorDesc>(Elements[i]);
+ const std::string &Name = ED->getName();
+ int64_t Value = ED->getValue();
+ DIE *Enumerator = new DIE(DW_TAG_enumerator);
+ Enumerator->AddString(DW_AT_name, DW_FORM_string, Name);
+ Enumerator->AddSInt(DW_AT_const_value, DW_FORM_sdata, Value);
+ Ty->AddChild(Enumerator);
+ }
+
break;
}
default: break;
diff --git a/lib/CodeGen/MachineDebugInfo.cpp b/lib/CodeGen/MachineDebugInfo.cpp
index 46163a777e..c530941705 100644
--- a/lib/CodeGen/MachineDebugInfo.cpp
+++ b/lib/CodeGen/MachineDebugInfo.cpp
@@ -516,6 +516,7 @@ DebugInfoDesc *DebugInfoDesc::DescFactory(unsigned Tag) {
case DW_TAG_union_type:
case DW_TAG_enumeration_type: return new CompositeTypeDesc(Tag);
case DW_TAG_subrange_type: return new SubrangeDesc();
+ case DW_TAG_enumerator: return new EnumeratorDesc();
default: break;
}
return NULL;
@@ -909,6 +910,49 @@ void SubrangeDesc::dump() {
//===----------------------------------------------------------------------===//
+EnumeratorDesc::EnumeratorDesc()
+: DebugInfoDesc(DW_TAG_enumerator)
+, Name("")
+, Value(0)
+{}
+
+// Implement isa/cast/dyncast.
+bool EnumeratorDesc::classof(const DebugInfoDesc *D) {
+ return D->getTag() == DW_TAG_enumerator;
+}
+
+/// ApplyToFields - Target the visitor to the fields of the EnumeratorDesc.
+///
+void EnumeratorDesc::ApplyToFields(DIVisitor *Visitor) {
+ DebugInfoDesc::ApplyToFields(Visitor);
+
+ Visitor->Apply(Name);
+ Visitor->Apply(Value);
+}
+
+/// getDescString - Return a string used to compose global names and labels.
+///
+const char *EnumeratorDesc::getDescString() const {
+ return "llvm.dbg.enumerator";
+}
+
+/// getTypeString - Return a string used to label this descriptor's type.
+///
+const char *EnumeratorDesc::getTypeString() const {
+ return "llvm.dbg.enumerator.type";
+}
+
+#ifndef NDEBUG
+void EnumeratorDesc::dump() {
+ std::cerr << getDescString() << " "
+ << "Tag(" << getTag() << "), "
+ << "Name(" << Name << "), "
+ << "Value(" << Value << ")\n";
+}
+#endif
+
+//===----------------------------------------------------------------------===//
+
GlobalDesc::GlobalDesc(unsigned T)
: AnchoredDesc(T)
, Context(0)