mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-02-22 13:29:44 +00:00
[Debug Info] add a template class DITypedArray.
Typedef DIArray to DITypedArray<DIDescriptor>. Also typedef DITypeArray as DITypedArray<DITypeRef>. This is the third of a series of patches to handle type uniqueing of the type array for a subroutine type. This commit should have no functionality change. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@214115 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
8e8c1ac702
commit
3cbd21c987
@ -38,7 +38,6 @@ namespace llvm {
|
||||
class DIFile;
|
||||
class DIEnumerator;
|
||||
class DIType;
|
||||
class DIArray;
|
||||
class DIGlobalVariable;
|
||||
class DIImportedEntity;
|
||||
class DINameSpace;
|
||||
@ -470,6 +469,9 @@ namespace llvm {
|
||||
/// getOrCreateArray - Get a DIArray, create one if required.
|
||||
DIArray getOrCreateArray(ArrayRef<Value *> Elements);
|
||||
|
||||
/// getOrCreateTypeArray - Get a DITypeArray, create one if required.
|
||||
DITypeArray getOrCreateTypeArray(ArrayRef<Value *> Elements);
|
||||
|
||||
/// getOrCreateSubrange - Create a descriptor for a value range. This
|
||||
/// implicitly uniques the values returned.
|
||||
DISubrange getOrCreateSubrange(int64_t Lo, int64_t Count);
|
||||
|
@ -167,17 +167,20 @@ public:
|
||||
bool Verify() const;
|
||||
};
|
||||
|
||||
/// DIArray - This descriptor holds an array of descriptors.
|
||||
class DIArray : public DIDescriptor {
|
||||
/// DITypedArray - This descriptor holds an array of nodes with type T.
|
||||
template <typename T> class DITypedArray : public DIDescriptor {
|
||||
public:
|
||||
explicit DIArray(const MDNode *N = nullptr) : DIDescriptor(N) {}
|
||||
|
||||
unsigned getNumElements() const;
|
||||
DIDescriptor getElement(unsigned Idx) const {
|
||||
return getDescriptorField(Idx);
|
||||
explicit DITypedArray(const MDNode *N = nullptr) : DIDescriptor(N) {}
|
||||
unsigned getNumElements() const {
|
||||
return DbgNode ? DbgNode->getNumOperands() : 0;
|
||||
}
|
||||
T getElement(unsigned Idx) const {
|
||||
return getFieldAs<T>(Idx);
|
||||
}
|
||||
};
|
||||
|
||||
typedef DITypedArray<DIDescriptor> DIArray;
|
||||
|
||||
/// DIEnumerator - A wrapper for an enumerator (e.g. X and Y in 'enum {X,Y}').
|
||||
/// FIXME: it seems strange that this doesn't have either a reference to the
|
||||
/// type/precision or a file/line pair for location info.
|
||||
@ -196,6 +199,7 @@ public:
|
||||
template <typename T> class DIRef;
|
||||
typedef DIRef<DIScope> DIScopeRef;
|
||||
typedef DIRef<DIType> DITypeRef;
|
||||
typedef DITypedArray<DITypeRef> DITypeArray;
|
||||
|
||||
/// DIScope - A base class for various scopes.
|
||||
///
|
||||
@ -421,12 +425,19 @@ public:
|
||||
class DICompositeType : public DIDerivedType {
|
||||
friend class DIDescriptor;
|
||||
void printInternal(raw_ostream &OS) const;
|
||||
void setArraysHelper(MDNode *Elements, MDNode *TParams);
|
||||
|
||||
public:
|
||||
explicit DICompositeType(const MDNode *N = nullptr) : DIDerivedType(N) {}
|
||||
|
||||
DIArray getElements() const { return getFieldAs<DIArray>(10); }
|
||||
void setArrays(DIArray Elements, DIArray TParams = DIArray());
|
||||
template <typename T>
|
||||
void setArrays(DITypedArray<T> Elements, DIArray TParams = DIArray()) {
|
||||
assert((!TParams || DbgNode->getNumOperands() == 15) &&
|
||||
"If you're setting the template parameters this should include a slot "
|
||||
"for that!");
|
||||
setArraysHelper(Elements, TParams);
|
||||
}
|
||||
unsigned getRunTimeLang() const { return getUnsignedField(11); }
|
||||
DITypeRef getContainingType() const { return getFieldAs<DITypeRef>(12); }
|
||||
void setContainingType(DICompositeType ContainingType);
|
||||
|
@ -956,6 +956,18 @@ DIArray DIBuilder::getOrCreateArray(ArrayRef<Value *> Elements) {
|
||||
return DIArray(MDNode::get(VMContext, Elements));
|
||||
}
|
||||
|
||||
/// getOrCreateTypeArray - Get a DITypeArray, create one if required.
|
||||
DITypeArray DIBuilder::getOrCreateTypeArray(ArrayRef<Value *> Elements) {
|
||||
SmallVector<llvm::Value *, 16> Elts;
|
||||
for (unsigned i = 0, e = Elements.size(); i != e; ++i) {
|
||||
if (Elements[i] && isa<MDNode>(Elements[i]))
|
||||
Elts.push_back(DIType(cast<MDNode>(Elements[i])).getRef());
|
||||
else
|
||||
Elts.push_back(Elements[i]);
|
||||
}
|
||||
return DITypeArray(MDNode::get(VMContext, Elts));
|
||||
}
|
||||
|
||||
/// getOrCreateSubrange - Create a descriptor for a value range. This
|
||||
/// implicitly uniques the values returned.
|
||||
DISubrange DIBuilder::getOrCreateSubrange(int64_t Lo, int64_t Count) {
|
||||
|
@ -338,12 +338,6 @@ bool DIDescriptor::isImportedEntity() const {
|
||||
// Simple Descriptor Constructors and other Methods
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
unsigned DIArray::getNumElements() const {
|
||||
if (!DbgNode)
|
||||
return 0;
|
||||
return DbgNode->getNumOperands();
|
||||
}
|
||||
|
||||
/// replaceAllUsesWith - Replace all uses of the MDNode used by this
|
||||
/// type with the one in the passed descriptor.
|
||||
void DIType::replaceAllUsesWith(LLVMContext &VMContext, DIDescriptor D) {
|
||||
@ -676,10 +670,7 @@ static void VerifySubsetOf(const MDNode *LHS, const MDNode *RHS) {
|
||||
#endif
|
||||
|
||||
/// \brief Set the array of member DITypes.
|
||||
void DICompositeType::setArrays(DIArray Elements, DIArray TParams) {
|
||||
assert((!TParams || DbgNode->getNumOperands() == 15) &&
|
||||
"If you're setting the template parameters this should include a slot "
|
||||
"for that!");
|
||||
void DICompositeType::setArraysHelper(MDNode *Elements, MDNode *TParams) {
|
||||
TrackingVH<MDNode> N(*this);
|
||||
if (Elements) {
|
||||
#ifndef NDEBUG
|
||||
|
Loading…
x
Reference in New Issue
Block a user