mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-08 03:30:22 +00:00
Construct array/vector type DIEs using DebugInfo.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@61724 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
d0ed240e30
commit
68afdc3ab0
@ -86,6 +86,15 @@ namespace llvm {
|
|||||||
|
|
||||||
unsigned getAnchorTag() const { return getUnsignedField(1); }
|
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.
|
/// DIArray - This descriptor holds an array of descriptors.
|
||||||
class DIArray : public DIDescriptor {
|
class DIArray : public DIDescriptor {
|
||||||
@ -93,7 +102,9 @@ namespace llvm {
|
|||||||
explicit DIArray(GlobalVariable *GV = 0) : DIDescriptor(GV) {}
|
explicit DIArray(GlobalVariable *GV = 0) : DIDescriptor(GV) {}
|
||||||
|
|
||||||
unsigned getNumElements() const;
|
unsigned getNumElements() const;
|
||||||
DIDescriptor getElement(unsigned Idx) const;
|
DISubrange getElement(unsigned Idx) const {
|
||||||
|
return getFieldAs<DISubrange>(Idx);
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
/// DICompileUnit - A wrapper for a compile unit.
|
/// DICompileUnit - A wrapper for a compile unit.
|
||||||
@ -118,15 +129,6 @@ namespace llvm {
|
|||||||
uint64_t getLanguage() const { return getUInt64Field(2); }
|
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.
|
/// DIType - This is a wrapper for a type.
|
||||||
/// FIXME: Types should be factored much better so that CV qualifiers and
|
/// FIXME: Types should be factored much better so that CV qualifiers and
|
||||||
/// others do not require a huge and empty descriptor full of zeros.
|
/// others do not require a huge and empty descriptor full of zeros.
|
||||||
|
@ -174,7 +174,12 @@ DIVariable::DIVariable(GlobalVariable *GV) : DIDescriptor(GV) {
|
|||||||
GV = 0;
|
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
|
// DIFactory: Basic Helpers
|
||||||
|
@ -1512,6 +1512,7 @@ private:
|
|||||||
AddUInt(&Buffer, DW_AT_byte_size, 0, Size);
|
AddUInt(&Buffer, DW_AT_byte_size, 0, Size);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// ConstructType - Construct derived type die from DIDerivedType.
|
||||||
void ConstructType(CompileUnit *DW_Unit, DIE &Buffer,
|
void ConstructType(CompileUnit *DW_Unit, DIE &Buffer,
|
||||||
DIDerivedType *DTy) {
|
DIDerivedType *DTy) {
|
||||||
|
|
||||||
@ -1540,6 +1541,45 @@ private:
|
|||||||
// FIXME - Enable this. AddSourceLine(&Buffer, *DTy);
|
// 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.
|
/// ConstructType - Adds all the required attributes to the type.
|
||||||
///
|
///
|
||||||
void ConstructType(DIE &Buffer, TypeDesc *TyDesc, CompileUnit *Unit) {
|
void ConstructType(DIE &Buffer, TypeDesc *TyDesc, CompileUnit *Unit) {
|
||||||
|
Loading…
Reference in New Issue
Block a user