[llvm-commits] [llvm] r61724 - in /llvm/trunk: include/llvm/Analysis/DebugInfo.h lib/Analysis/DebugInfo.cpp lib/CodeGen/AsmPrinter/DwarfWriter.cpp
Devang Patel
dpatel at apple.com
Mon Jan 5 10:33:01 PST 2009
Author: dpatel
Date: Mon Jan 5 12:33:01 2009
New Revision: 61724
URL: http://llvm.org/viewvc/llvm-project?rev=61724&view=rev
Log:
Construct array/vector type DIEs using DebugInfo.
Modified:
llvm/trunk/include/llvm/Analysis/DebugInfo.h
llvm/trunk/lib/Analysis/DebugInfo.cpp
llvm/trunk/lib/CodeGen/AsmPrinter/DwarfWriter.cpp
Modified: llvm/trunk/include/llvm/Analysis/DebugInfo.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/DebugInfo.h?rev=61724&r1=61723&r2=61724&view=diff
==============================================================================
--- llvm/trunk/include/llvm/Analysis/DebugInfo.h (original)
+++ llvm/trunk/include/llvm/Analysis/DebugInfo.h Mon Jan 5 12:33:01 2009
@@ -86,6 +86,15 @@
unsigned getAnchorTag() const { return getUnsignedField(1); }
};
+
+ /// DISubrange - This is used to represent ranges, for array bounds.
+ class DISubrange : public DIDescriptor {
+ public:
+ explicit DISubrange(GlobalVariable *GV = 0);
+
+ int64_t getLo() const { return (int64_t)getUInt64Field(1); }
+ int64_t getHi() const { return (int64_t)getUInt64Field(2); }
+ };
/// DIArray - This descriptor holds an array of descriptors.
class DIArray : public DIDescriptor {
@@ -93,7 +102,9 @@
explicit DIArray(GlobalVariable *GV = 0) : DIDescriptor(GV) {}
unsigned getNumElements() const;
- DIDescriptor getElement(unsigned Idx) const;
+ DISubrange getElement(unsigned Idx) const {
+ return getFieldAs<DISubrange>(Idx);
+ }
};
/// DICompileUnit - A wrapper for a compile unit.
@@ -118,15 +129,6 @@
uint64_t getLanguage() const { return getUInt64Field(2); }
};
- /// DISubrange - This is used to represent ranges, for array bounds.
- class DISubrange : public DIDescriptor {
- public:
- explicit DISubrange(GlobalVariable *GV = 0);
-
- int64_t getLo() const { return (int64_t)getUInt64Field(1); }
- int64_t getHi() const { return (int64_t)getUInt64Field(2); }
- };
-
/// DIType - This is a wrapper for a type.
/// FIXME: Types should be factored much better so that CV qualifiers and
/// others do not require a huge and empty descriptor full of zeros.
Modified: llvm/trunk/lib/Analysis/DebugInfo.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/DebugInfo.cpp?rev=61724&r1=61723&r2=61724&view=diff
==============================================================================
--- llvm/trunk/lib/Analysis/DebugInfo.cpp (original)
+++ llvm/trunk/lib/Analysis/DebugInfo.cpp Mon Jan 5 12:33:01 2009
@@ -174,7 +174,12 @@
GV = 0;
}
-
+unsigned DIArray::getNumElements() const {
+ assert (GV && "Invalid DIArray");
+ Constant *C = GV->getInitializer();
+ assert (C && "Invalid DIArray initializer");
+ return C->getNumOperands();
+}
//===----------------------------------------------------------------------===//
// DIFactory: Basic Helpers
Modified: llvm/trunk/lib/CodeGen/AsmPrinter/DwarfWriter.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DwarfWriter.cpp?rev=61724&r1=61723&r2=61724&view=diff
==============================================================================
--- llvm/trunk/lib/CodeGen/AsmPrinter/DwarfWriter.cpp (original)
+++ llvm/trunk/lib/CodeGen/AsmPrinter/DwarfWriter.cpp Mon Jan 5 12:33:01 2009
@@ -1512,6 +1512,7 @@
AddUInt(&Buffer, DW_AT_byte_size, 0, Size);
}
+ /// ConstructType - Construct derived type die from DIDerivedType.
void ConstructType(CompileUnit *DW_Unit, DIE &Buffer,
DIDerivedType *DTy) {
@@ -1540,6 +1541,45 @@
// FIXME - Enable this. AddSourceLine(&Buffer, *DTy);
}
+ // ConstructSubrangeDIE - Construct subrange DIE from DISubrange.
+ void ConstructSubrangeDIE (DIE &Buffer, DISubrange *SR, DIE *IndexTy) {
+ int64_t L = SR->getLo();
+ int64_t H = SR->getHi();
+ DIE *DW_Subrange = new DIE(DW_TAG_subrange_type);
+ if (L != H) {
+ AddDIEntry(DW_Subrange, DW_AT_type, DW_FORM_ref4, IndexTy);
+ if (L)
+ AddSInt(DW_Subrange, DW_AT_lower_bound, 0, L);
+ AddSInt(DW_Subrange, DW_AT_upper_bound, 0, H);
+ }
+ Buffer.AddChild(DW_Subrange);
+ }
+
+ /// ConstructArrayTypeDIE - Construct array type DIE from DICompositeType.
+ void ConstructArrayTypeDIE(CompileUnit *DW_Unit, DIE &Buffer,
+ DICompositeType *CTy) {
+ Buffer.setTag(DW_TAG_array_type);
+ if (CTy->getTag() == DW_TAG_vector_type)
+ AddUInt(&Buffer, DW_AT_GNU_vector, DW_FORM_flag, 1);
+
+ DIArray Elements = CTy->getTypeArray();
+ // FIXME - Enable this.
+ // AddType(&Buffer, CTy->getTypeDerivedFrom(), DW_Unit);
+
+ // Construct an anonymous type for index type.
+ DIE IdxBuffer(DW_TAG_base_type);
+ AddUInt(&IdxBuffer, DW_AT_byte_size, 0, sizeof(int32_t));
+ AddUInt(&IdxBuffer, DW_AT_encoding, DW_FORM_data1, DW_ATE_signed);
+ DIE *IndexTy = DW_Unit->AddDie(IdxBuffer);
+
+ // Add subranges to array type.
+ for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
+ DISubrange Element = Elements.getElement(i);
+ ConstructSubrangeDIE(Buffer, &Element, IndexTy);
+ }
+ }
+
+
/// ConstructType - Adds all the required attributes to the type.
///
void ConstructType(DIE &Buffer, TypeDesc *TyDesc, CompileUnit *Unit) {
More information about the llvm-commits
mailing list