[llvm] r233030 - DebugInfo: Overload get() in DIDescriptor subclasses
Duncan P. N. Exon Smith
dexonsmith at apple.com
Mon Mar 23 14:54:07 PDT 2015
Author: dexonsmith
Date: Mon Mar 23 16:54:07 2015
New Revision: 233030
URL: http://llvm.org/viewvc/llvm-project?rev=233030&view=rev
Log:
DebugInfo: Overload get() in DIDescriptor subclasses
Continue to simplify the `DIDescriptor` subclasses, so that they behave
more like raw pointers. Remove `getRaw()`, replace it with an
overloaded `get()`, and overload the arrow and cast operators. Two
testcases started to crash on the arrow operators with this change
because of `scope:` references that weren't real scopes. I fixed them.
Soon I'll add verifier checks for them too.
This also adds explicit dereference operators. Previously, the builtin
dereference against `operator MDNode *()` would have worked, but now the
builtins are ambiguous.
Modified:
llvm/trunk/include/llvm/IR/DebugInfo.h
llvm/trunk/lib/IR/DebugInfo.cpp
llvm/trunk/test/CodeGen/X86/2012-11-30-misched-dbg.ll
llvm/trunk/test/Transforms/Inline/debug-invoke.ll
Modified: llvm/trunk/include/llvm/IR/DebugInfo.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/IR/DebugInfo.h?rev=233030&r1=233029&r2=233030&view=diff
==============================================================================
--- llvm/trunk/include/llvm/IR/DebugInfo.h (original)
+++ llvm/trunk/include/llvm/IR/DebugInfo.h Mon Mar 23 16:54:07 2015
@@ -174,6 +174,10 @@ public:
MDNode *get() const { return const_cast<MDNode *>(DbgNode); }
operator MDNode *() const { return get(); }
MDNode *operator->() const { return get(); }
+ MDNode &operator*() const {
+ assert(get() && "Expected valid pointer");
+ return *get();
+ }
// An explicit operator bool so that we can do testing of DI values
// easily.
@@ -268,34 +272,39 @@ public:
#define RETURN_FROM_RAW(VALID, UNUSED) \
do { \
- assert(this->DbgNode && "Expected non-null in accessor"); \
- auto *N = getRaw(); \
- assert(N && "Expected correct subclass in accessor"); \
+ auto *N = get(); \
+ assert(N && "Expected non-null in accessor"); \
return VALID; \
} while (false)
#define RETURN_DESCRIPTOR_FROM_RAW(DESC, VALID) \
do { \
- assert(this->DbgNode && "Expected non-null in accessor"); \
- auto *N = getRaw(); \
- assert(N && "Expected correct subclass in accessor"); \
+ auto *N = get(); \
+ assert(N && "Expected non-null in accessor"); \
return DESC(dyn_cast_or_null<MDNode>(VALID)); \
} while (false)
#define RETURN_REF_FROM_RAW(REF, VALID) \
do { \
- assert(this->DbgNode && "Expected non-null in accessor"); \
- auto *N = getRaw(); \
- assert(N && "Expected correct subclass in accessor"); \
+ auto *N = get(); \
+ assert(N && "Expected non-null in accessor"); \
return REF::get(VALID); \
} while (false)
/// \brief This is used to represent ranges, for array bounds.
class DISubrange : public DIDescriptor {
- MDSubrange *getRaw() const { return dyn_cast_or_null<MDSubrange>(get()); }
-
public:
explicit DISubrange(const MDNode *N = nullptr) : DIDescriptor(N) {}
DISubrange(const MDSubrange *N) : DIDescriptor(N) {}
+ MDSubrange *get() const {
+ return cast_or_null<MDSubrange>(DIDescriptor::get());
+ }
+ operator MDSubrange *() const { return get(); }
+ MDSubrange *operator->() const { return get(); }
+ MDSubrange &operator*() const {
+ assert(get() && "Expected valid pointer");
+ return *get();
+ }
+
int64_t getLo() const { RETURN_FROM_RAW(N->getLo(), 0); }
int64_t getCount() const { RETURN_FROM_RAW(N->getCount(), 0); }
bool Verify() const;
@@ -318,12 +327,20 @@ typedef DITypedArray<DIDescriptor> DIArr
/// FIXME: it seems strange that this doesn't have either a reference to the
/// type/precision or a file/line pair for location info.
class DIEnumerator : public DIDescriptor {
- MDEnumerator *getRaw() const { return dyn_cast_or_null<MDEnumerator>(get()); }
-
public:
explicit DIEnumerator(const MDNode *N = nullptr) : DIDescriptor(N) {}
DIEnumerator(const MDEnumerator *N) : DIDescriptor(N) {}
+ MDEnumerator *get() const {
+ return cast_or_null<MDEnumerator>(DIDescriptor::get());
+ }
+ operator MDEnumerator *() const { return get(); }
+ MDEnumerator *operator->() const { return get(); }
+ MDEnumerator &operator*() const {
+ assert(get() && "Expected valid pointer");
+ return *get();
+ }
+
StringRef getName() const { RETURN_FROM_RAW(N->getName(), ""); }
int64_t getEnumValue() const { RETURN_FROM_RAW(N->getValue(), 0); }
bool Verify() const;
@@ -344,13 +361,18 @@ typedef DITypedArray<DITypeRef> DITypeAr
/// DIScopes that are scopes in the strict lexical scope sense
/// (DICompileUnit, DISubprogram, etc.), but not for, e.g., a DIType.
class DIScope : public DIDescriptor {
-protected:
- MDScope *getRaw() const { return dyn_cast_or_null<MDScope>(get()); }
-
public:
explicit DIScope(const MDNode *N = nullptr) : DIDescriptor(N) {}
DIScope(const MDScope *N) : DIDescriptor(N) {}
+ MDScope *get() const { return cast_or_null<MDScope>(DIDescriptor::get()); }
+ operator MDScope *() const { return get(); }
+ MDScope *operator->() const { return get(); }
+ MDScope &operator*() const {
+ assert(get() && "Expected valid pointer");
+ return *get();
+ }
+
/// \brief Get the parent scope.
///
/// Gets the parent scope for this scope node or returns a default
@@ -443,12 +465,18 @@ template <> DIRef<DIType>::DIRef(const M
/// FIXME: Types should be factored much better so that CV qualifiers and
/// others do not require a huge and empty descriptor full of zeros.
class DIType : public DIScope {
- MDType *getRaw() const { return dyn_cast_or_null<MDType>(get()); }
-
public:
explicit DIType(const MDNode *N = nullptr) : DIScope(N) {}
DIType(const MDType *N) : DIScope(N) {}
+ MDType *get() const { return cast_or_null<MDType>(DIDescriptor::get()); }
+ operator MDType *() const { return get(); }
+ MDType *operator->() const { return get(); }
+ MDType &operator*() const {
+ assert(get() && "Expected valid pointer");
+ return *get();
+ }
+
operator DITypeRef() const {
assert(isType() &&
"constructing DITypeRef from an MDNode that is not a type");
@@ -503,12 +531,20 @@ public:
/// \brief A basic type, like 'int' or 'float'.
class DIBasicType : public DIType {
- MDBasicType *getRaw() const { return dyn_cast_or_null<MDBasicType>(get()); }
-
public:
explicit DIBasicType(const MDNode *N = nullptr) : DIType(N) {}
DIBasicType(const MDBasicType *N) : DIType(N) {}
+ MDBasicType *get() const {
+ return cast_or_null<MDBasicType>(DIDescriptor::get());
+ }
+ operator MDBasicType *() const { return get(); }
+ MDBasicType *operator->() const { return get(); }
+ MDBasicType &operator*() const {
+ assert(get() && "Expected valid pointer");
+ return *get();
+ }
+
unsigned getEncoding() const { RETURN_FROM_RAW(N->getEncoding(), 0); }
bool Verify() const;
@@ -519,35 +555,41 @@ public:
/// Like a const qualified type, a typedef, a pointer or reference, et cetera.
/// Or, a data member of a class/struct/union.
class DIDerivedType : public DIType {
- MDDerivedTypeBase *getRaw() const {
- return dyn_cast_or_null<MDDerivedTypeBase>(get());
- }
-
public:
explicit DIDerivedType(const MDNode *N = nullptr) : DIType(N) {}
DIDerivedType(const MDDerivedTypeBase *N) : DIType(N) {}
+ MDDerivedTypeBase *get() const {
+ return cast_or_null<MDDerivedTypeBase>(DIDescriptor::get());
+ }
+ operator MDDerivedTypeBase *() const { return get(); }
+ MDDerivedTypeBase *operator->() const { return get(); }
+ MDDerivedTypeBase &operator*() const {
+ assert(get() && "Expected valid pointer");
+ return *get();
+ }
+
DITypeRef getTypeDerivedFrom() const {
RETURN_REF_FROM_RAW(DITypeRef, N->getBaseType());
}
/// \brief Return property node, if this ivar is associated with one.
MDNode *getObjCProperty() const {
- if (auto *N = dyn_cast_or_null<MDDerivedType>(get()))
+ if (auto *N = dyn_cast<MDDerivedType>(get()))
return dyn_cast_or_null<MDNode>(N->getExtraData());
return nullptr;
}
DITypeRef getClassType() const {
assert(getTag() == dwarf::DW_TAG_ptr_to_member_type);
- if (auto *N = dyn_cast_or_null<MDDerivedType>(get()))
+ if (auto *N = dyn_cast<MDDerivedType>(get()))
return DITypeRef::get(N->getExtraData());
return DITypeRef::get(nullptr);
}
Constant *getConstant() const {
assert((getTag() == dwarf::DW_TAG_member) && isStaticMember());
- if (auto *N = dyn_cast_or_null<MDDerivedType>(get()))
+ if (auto *N = dyn_cast<MDDerivedType>(get()))
if (auto *C = dyn_cast_or_null<ConstantAsMetadata>(N->getExtraData()))
return C->getValue();
@@ -572,14 +614,20 @@ class DICompositeType : public DIDerived
/// \brief Set the array of member DITypes.
void setArraysHelper(MDNode *Elements, MDNode *TParams);
- MDCompositeTypeBase *getRaw() const {
- return dyn_cast_or_null<MDCompositeTypeBase>(get());
- }
-
public:
explicit DICompositeType(const MDNode *N = nullptr) : DIDerivedType(N) {}
DICompositeType(const MDCompositeTypeBase *N) : DIDerivedType(N) {}
+ MDCompositeTypeBase *get() const {
+ return cast_or_null<MDCompositeTypeBase>(DIDescriptor::get());
+ }
+ operator MDCompositeTypeBase *() const { return get(); }
+ MDCompositeTypeBase *operator->() const { return get(); }
+ MDCompositeTypeBase &operator*() const {
+ assert(get() && "Expected valid pointer");
+ return *get();
+ }
+
DIArray getElements() const {
assert(!isSubroutineType() && "no elements for DISubroutineType");
RETURN_DESCRIPTOR_FROM_RAW(DIArray, N->getElements());
@@ -617,14 +665,20 @@ public:
};
class DISubroutineType : public DICompositeType {
- MDSubroutineType *getRaw() const {
- return dyn_cast_or_null<MDSubroutineType>(get());
- }
-
public:
explicit DISubroutineType(const MDNode *N = nullptr) : DICompositeType(N) {}
DISubroutineType(const MDSubroutineType *N) : DICompositeType(N) {}
+ MDSubroutineType *get() const {
+ return cast_or_null<MDSubroutineType>(DIDescriptor::get());
+ }
+ operator MDSubroutineType *() const { return get(); }
+ MDSubroutineType *operator->() const { return get(); }
+ MDSubroutineType &operator*() const {
+ assert(get() && "Expected valid pointer");
+ return *get();
+ }
+
DITypedArray<DITypeRef> getTypeArray() const {
RETURN_DESCRIPTOR_FROM_RAW(DITypedArray<DITypeRef>, N->getTypeArray());
}
@@ -632,12 +686,18 @@ public:
/// \brief This is a wrapper for a file.
class DIFile : public DIScope {
- MDFile *getRaw() const { return dyn_cast_or_null<MDFile>(get()); }
-
public:
explicit DIFile(const MDNode *N = nullptr) : DIScope(N) {}
DIFile(const MDFile *N) : DIScope(N) {}
+ MDFile *get() const { return cast_or_null<MDFile>(DIDescriptor::get()); }
+ operator MDFile *() const { return get(); }
+ MDFile *operator->() const { return get(); }
+ MDFile &operator*() const {
+ assert(get() && "Expected valid pointer");
+ return *get();
+ }
+
/// \brief Retrieve the MDNode for the directory/file pair.
MDNode *getFileNode() const { return get(); }
bool Verify() const;
@@ -645,14 +705,20 @@ public:
/// \brief A wrapper for a compile unit.
class DICompileUnit : public DIScope {
- MDCompileUnit *getRaw() const {
- return dyn_cast_or_null<MDCompileUnit>(get());
- }
-
public:
explicit DICompileUnit(const MDNode *N = nullptr) : DIScope(N) {}
DICompileUnit(const MDCompileUnit *N) : DIScope(N) {}
+ MDCompileUnit *get() const {
+ return cast_or_null<MDCompileUnit>(DIDescriptor::get());
+ }
+ operator MDCompileUnit *() const { return get(); }
+ MDCompileUnit *operator->() const { return get(); }
+ MDCompileUnit &operator*() const {
+ assert(get() && "Expected valid pointer");
+ return *get();
+ }
+
dwarf::SourceLanguage getLanguage() const {
RETURN_FROM_RAW(static_cast<dwarf::SourceLanguage>(N->getSourceLanguage()),
static_cast<dwarf::SourceLanguage>(0));
@@ -693,12 +759,20 @@ public:
/// \brief This is a wrapper for a subprogram (e.g. a function).
class DISubprogram : public DIScope {
- MDSubprogram *getRaw() const { return dyn_cast_or_null<MDSubprogram>(get()); }
-
public:
explicit DISubprogram(const MDNode *N = nullptr) : DIScope(N) {}
DISubprogram(const MDSubprogram *N) : DIScope(N) {}
+ MDSubprogram *get() const {
+ return cast_or_null<MDSubprogram>(DIDescriptor::get());
+ }
+ operator MDSubprogram *() const { return get(); }
+ MDSubprogram *operator->() const { return get(); }
+ MDSubprogram &operator*() const {
+ assert(get() && "Expected valid pointer");
+ return *get();
+ }
+
StringRef getName() const { RETURN_FROM_RAW(N->getName(), ""); }
StringRef getDisplayName() const { RETURN_FROM_RAW(N->getDisplayName(), ""); }
StringRef getLinkageName() const { RETURN_FROM_RAW(N->getLinkageName(), ""); }
@@ -737,7 +811,7 @@ public:
Function *getFunction() const;
void replaceFunction(Function *F) {
- if (auto *N = getRaw())
+ if (auto *N = get())
N->replaceFunction(F);
}
DIArray getTemplateParams() const {
@@ -788,24 +862,30 @@ public:
/// \brief This is a wrapper for a lexical block.
class DILexicalBlock : public DIScope {
- MDLexicalBlockBase *getRaw() const {
- return dyn_cast_or_null<MDLexicalBlockBase>(get());
- }
-
public:
explicit DILexicalBlock(const MDNode *N = nullptr) : DIScope(N) {}
DILexicalBlock(const MDLexicalBlock *N) : DIScope(N) {}
+ MDLexicalBlockBase *get() const {
+ return cast_or_null<MDLexicalBlockBase>(DIDescriptor::get());
+ }
+ operator MDLexicalBlockBase *() const { return get(); }
+ MDLexicalBlockBase *operator->() const { return get(); }
+ MDLexicalBlockBase &operator*() const {
+ assert(get() && "Expected valid pointer");
+ return *get();
+ }
+
DIScope getContext() const {
RETURN_DESCRIPTOR_FROM_RAW(DIScope, N->getScope());
}
unsigned getLineNumber() const {
- if (auto *N = dyn_cast_or_null<MDLexicalBlock>(get()))
+ if (auto *N = dyn_cast<MDLexicalBlock>(get()))
return N->getLine();
return 0;
}
unsigned getColumnNumber() const {
- if (auto *N = dyn_cast_or_null<MDLexicalBlock>(get()))
+ if (auto *N = dyn_cast<MDLexicalBlock>(get()))
return N->getColumn();
return 0;
}
@@ -814,14 +894,20 @@ public:
/// \brief This is a wrapper for a lexical block with a filename change.
class DILexicalBlockFile : public DIScope {
- MDLexicalBlockFile *getRaw() const {
- return dyn_cast_or_null<MDLexicalBlockFile>(get());
- }
-
public:
explicit DILexicalBlockFile(const MDNode *N = nullptr) : DIScope(N) {}
DILexicalBlockFile(const MDLexicalBlockFile *N) : DIScope(N) {}
+ MDLexicalBlockFile *get() const {
+ return cast_or_null<MDLexicalBlockFile>(DIDescriptor::get());
+ }
+ operator MDLexicalBlockFile *() const { return get(); }
+ MDLexicalBlockFile *operator->() const { return get(); }
+ MDLexicalBlockFile &operator*() const {
+ assert(get() && "Expected valid pointer");
+ return *get();
+ }
+
DIScope getContext() const {
// FIXME: This logic is horrible. getScope() returns a DILexicalBlock, but
// then we check if it's a subprogram? WHAT?!?
@@ -842,12 +928,20 @@ public:
/// \brief A wrapper for a C++ style name space.
class DINameSpace : public DIScope {
- MDNamespace *getRaw() const { return dyn_cast_or_null<MDNamespace>(get()); }
-
public:
explicit DINameSpace(const MDNode *N = nullptr) : DIScope(N) {}
DINameSpace(const MDNamespace *N) : DIScope(N) {}
+ MDNamespace *get() const {
+ return cast_or_null<MDNamespace>(DIDescriptor::get());
+ }
+ operator MDNamespace *() const { return get(); }
+ MDNamespace *operator->() const { return get(); }
+ MDNamespace &operator*() const {
+ assert(get() && "Expected valid pointer");
+ return *get();
+ }
+
StringRef getName() const { RETURN_FROM_RAW(N->getName(), ""); }
unsigned getLineNumber() const { RETURN_FROM_RAW(N->getLine(), 0); }
DIScope getContext() const {
@@ -858,15 +952,21 @@ public:
/// \brief This is a wrapper for template type parameter.
class DITemplateTypeParameter : public DIDescriptor {
- MDTemplateTypeParameter *getRaw() const {
- return dyn_cast_or_null<MDTemplateTypeParameter>(get());
- }
-
public:
explicit DITemplateTypeParameter(const MDNode *N = nullptr)
: DIDescriptor(N) {}
DITemplateTypeParameter(const MDTemplateTypeParameter *N) : DIDescriptor(N) {}
+ MDTemplateTypeParameter *get() const {
+ return cast_or_null<MDTemplateTypeParameter>(DIDescriptor::get());
+ }
+ operator MDTemplateTypeParameter *() const { return get(); }
+ MDTemplateTypeParameter *operator->() const { return get(); }
+ MDTemplateTypeParameter &operator*() const {
+ assert(get() && "Expected valid pointer");
+ return *get();
+ }
+
StringRef getName() const { RETURN_FROM_RAW(N->getName(), ""); }
DITypeRef getType() const { RETURN_REF_FROM_RAW(DITypeRef, N->getType()); }
@@ -875,16 +975,22 @@ public:
/// \brief This is a wrapper for template value parameter.
class DITemplateValueParameter : public DIDescriptor {
- MDTemplateValueParameter *getRaw() const {
- return dyn_cast_or_null<MDTemplateValueParameter>(get());
- }
-
public:
explicit DITemplateValueParameter(const MDNode *N = nullptr)
: DIDescriptor(N) {}
DITemplateValueParameter(const MDTemplateValueParameter *N)
: DIDescriptor(N) {}
+ MDTemplateValueParameter *get() const {
+ return cast_or_null<MDTemplateValueParameter>(DIDescriptor::get());
+ }
+ operator MDTemplateValueParameter *() const { return get(); }
+ MDTemplateValueParameter *operator->() const { return get(); }
+ MDTemplateValueParameter &operator*() const {
+ assert(get() && "Expected valid pointer");
+ return *get();
+ }
+
StringRef getName() const { RETURN_FROM_RAW(N->getName(), ""); }
DITypeRef getType() const { RETURN_REF_FROM_RAW(DITypeRef, N->getType()); }
Metadata *getValue() const { RETURN_FROM_RAW(N->getValue(), nullptr); }
@@ -893,16 +999,22 @@ public:
/// \brief This is a wrapper for a global variable.
class DIGlobalVariable : public DIDescriptor {
- MDGlobalVariable *getRaw() const {
- return dyn_cast_or_null<MDGlobalVariable>(get());
- }
-
DIFile getFile() const { RETURN_DESCRIPTOR_FROM_RAW(DIFile, N->getFile()); }
public:
explicit DIGlobalVariable(const MDNode *N = nullptr) : DIDescriptor(N) {}
DIGlobalVariable(const MDGlobalVariable *N) : DIDescriptor(N) {}
+ MDGlobalVariable *get() const {
+ return cast_or_null<MDGlobalVariable>(DIDescriptor::get());
+ }
+ operator MDGlobalVariable *() const { return get(); }
+ MDGlobalVariable *operator->() const { return get(); }
+ MDGlobalVariable &operator*() const {
+ assert(get() && "Expected valid pointer");
+ return *get();
+ }
+
StringRef getName() const { RETURN_FROM_RAW(N->getName(), ""); }
StringRef getDisplayName() const { RETURN_FROM_RAW(N->getDisplayName(), ""); }
StringRef getLinkageName() const { RETURN_FROM_RAW(N->getLinkageName(), ""); }
@@ -919,7 +1031,7 @@ public:
GlobalVariable *getGlobal() const;
Constant *getConstant() const {
- if (auto *N = getRaw())
+ if (auto *N = get())
if (auto *C = dyn_cast_or_null<ConstantAsMetadata>(N->getVariable()))
return C->getValue();
return nullptr;
@@ -934,16 +1046,22 @@ public:
/// \brief This is a wrapper for a variable (e.g. parameter, local, global etc).
class DIVariable : public DIDescriptor {
- MDLocalVariable *getRaw() const {
- return dyn_cast_or_null<MDLocalVariable>(get());
- }
-
unsigned getFlags() const { RETURN_FROM_RAW(N->getFlags(), 0); }
public:
explicit DIVariable(const MDNode *N = nullptr) : DIDescriptor(N) {}
DIVariable(const MDLocalVariable *N) : DIDescriptor(N) {}
+ MDLocalVariable *get() const {
+ return cast_or_null<MDLocalVariable>(DIDescriptor::get());
+ }
+ operator MDLocalVariable *() const { return get(); }
+ MDLocalVariable *operator->() const { return get(); }
+ MDLocalVariable &operator*() const {
+ assert(get() && "Expected valid pointer");
+ return *get();
+ }
+
StringRef getName() const { RETURN_FROM_RAW(N->getName(), ""); }
unsigned getLineNumber() const { RETURN_FROM_RAW(N->getLine(), 0); }
unsigned getArgNumber() const { RETURN_FROM_RAW(N->getArg(), 0); }
@@ -1001,6 +1119,10 @@ public:
}
operator MDExpression *() const { return get(); }
MDExpression *operator->() const { return get(); }
+ MDExpression &operator*() const {
+ assert(get() && "Expected valid pointer");
+ return *get();
+ }
// Don't call this. Call isValid() directly.
bool Verify() const = delete;
@@ -1083,11 +1205,19 @@ public:
///
/// This object is not associated with any DWARF tag.
class DILocation : public DIDescriptor {
- MDLocation *getRaw() const { return dyn_cast_or_null<MDLocation>(get()); }
-
public:
explicit DILocation(const MDNode *N) : DIDescriptor(N) {}
+ MDLocation *get() const {
+ return cast_or_null<MDLocation>(DIDescriptor::get());
+ }
+ operator MDLocation *() const { return get(); }
+ MDLocation *operator->() const { return get(); }
+ MDLocation &operator*() const {
+ assert(get() && "Expected valid pointer");
+ return *get();
+ }
+
unsigned getLineNumber() const { RETURN_FROM_RAW(N->getLine(), 0); }
unsigned getColumnNumber() const { RETURN_FROM_RAW(N->getColumn(), 0); }
DIScope getScope() const {
@@ -1130,14 +1260,20 @@ public:
};
class DIObjCProperty : public DIDescriptor {
- MDObjCProperty *getRaw() const {
- return dyn_cast_or_null<MDObjCProperty>(get());
- }
-
public:
explicit DIObjCProperty(const MDNode *N) : DIDescriptor(N) {}
DIObjCProperty(const MDObjCProperty *N) : DIDescriptor(N) {}
+ MDObjCProperty *get() const {
+ return cast_or_null<MDObjCProperty>(DIDescriptor::get());
+ }
+ operator MDObjCProperty *() const { return get(); }
+ MDObjCProperty *operator->() const { return get(); }
+ MDObjCProperty &operator*() const {
+ assert(get() && "Expected valid pointer");
+ return *get();
+ }
+
StringRef getObjCPropertyName() const { RETURN_FROM_RAW(N->getName(), ""); }
DIFile getFile() const { RETURN_DESCRIPTOR_FROM_RAW(DIFile, N->getFile()); }
unsigned getLineNumber() const { RETURN_FROM_RAW(N->getLine(), 0); }
@@ -1179,15 +1315,21 @@ public:
/// \brief An imported module (C++ using directive or similar).
class DIImportedEntity : public DIDescriptor {
- MDImportedEntity *getRaw() const {
- return dyn_cast_or_null<MDImportedEntity>(get());
- }
-
public:
DIImportedEntity() = default;
explicit DIImportedEntity(const MDNode *N) : DIDescriptor(N) {}
DIImportedEntity(const MDImportedEntity *N) : DIDescriptor(N) {}
+ MDImportedEntity *get() const {
+ return cast_or_null<MDImportedEntity>(DIDescriptor::get());
+ }
+ operator MDImportedEntity *() const { return get(); }
+ MDImportedEntity *operator->() const { return get(); }
+ MDImportedEntity &operator*() const {
+ assert(get() && "Expected valid pointer");
+ return *get();
+ }
+
DIScope getContext() const {
RETURN_DESCRIPTOR_FROM_RAW(DIScope, N->getScope());
}
Modified: llvm/trunk/lib/IR/DebugInfo.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/DebugInfo.cpp?rev=233030&r1=233029&r2=233030&view=diff
==============================================================================
--- llvm/trunk/lib/IR/DebugInfo.cpp (original)
+++ llvm/trunk/lib/IR/DebugInfo.cpp Mon Mar 23 16:54:07 2015
@@ -260,7 +260,7 @@ static bool isDescriptorRef(const Metada
#endif
bool DIType::Verify() const {
- auto *N = getRaw();
+ auto *N = dyn_cast_or_null<MDType>(DbgNode);
if (!N)
return false;
if (!isScopeRef(N->getScope()))
@@ -294,10 +294,12 @@ bool DIType::Verify() const {
return false;
}
-bool DIBasicType::Verify() const { return getRaw(); }
+bool DIBasicType::Verify() const {
+ return dyn_cast_or_null<MDBasicType>(DbgNode);
+}
bool DIDerivedType::Verify() const {
- auto *N = getRaw();
+ auto *N = dyn_cast_or_null<MDDerivedTypeBase>(DbgNode);
if (!N)
return false;
if (getTag() == dwarf::DW_TAG_ptr_to_member_type) {
@@ -311,13 +313,13 @@ bool DIDerivedType::Verify() const {
}
bool DICompositeType::Verify() const {
- auto *N = getRaw();
+ auto *N = dyn_cast_or_null<MDCompositeTypeBase>(DbgNode);
return N && isTypeRef(N->getBaseType()) && isTypeRef(N->getVTableHolder()) &&
!(isLValueReference() && isRValueReference());
}
bool DISubprogram::Verify() const {
- auto *N = getRaw();
+ auto *N = dyn_cast_or_null<MDSubprogram>(DbgNode);
if (!N)
return false;
@@ -370,7 +372,7 @@ bool DISubprogram::Verify() const {
}
bool DIGlobalVariable::Verify() const {
- auto *N = getRaw();
+ auto *N = dyn_cast_or_null<MDGlobalVariable>(DbgNode);
if (!N)
return false;
@@ -390,7 +392,7 @@ bool DIGlobalVariable::Verify() const {
}
bool DIVariable::Verify() const {
- auto *N = getRaw();
+ auto *N = dyn_cast_or_null<MDLocalVariable>(DbgNode);
if (!N)
return false;
@@ -402,19 +404,37 @@ bool DIVariable::Verify() const {
return isTypeRef(N->getType());
}
-bool DILocation::Verify() const { return getRaw(); }
-bool DINameSpace::Verify() const { return getRaw(); }
-bool DIFile::Verify() const { return getRaw(); }
-bool DIEnumerator::Verify() const { return getRaw(); }
-bool DISubrange::Verify() const { return getRaw(); }
-bool DILexicalBlock::Verify() const { return getRaw(); }
-bool DILexicalBlockFile::Verify() const { return getRaw(); }
-bool DITemplateTypeParameter::Verify() const { return getRaw(); }
-bool DITemplateValueParameter::Verify() const { return getRaw(); }
-bool DIImportedEntity::Verify() const { return getRaw(); }
+bool DILocation::Verify() const {
+ return dyn_cast_or_null<MDLocation>(DbgNode);
+}
+bool DINameSpace::Verify() const {
+ return dyn_cast_or_null<MDNamespace>(DbgNode);
+}
+bool DIFile::Verify() const { return dyn_cast_or_null<MDFile>(DbgNode); }
+bool DIEnumerator::Verify() const {
+ return dyn_cast_or_null<MDEnumerator>(DbgNode);
+}
+bool DISubrange::Verify() const {
+ return dyn_cast_or_null<MDSubrange>(DbgNode);
+}
+bool DILexicalBlock::Verify() const {
+ return dyn_cast_or_null<MDLexicalBlock>(DbgNode);
+}
+bool DILexicalBlockFile::Verify() const {
+ return dyn_cast_or_null<MDLexicalBlockFile>(DbgNode);
+}
+bool DITemplateTypeParameter::Verify() const {
+ return dyn_cast_or_null<MDTemplateTypeParameter>(DbgNode);
+}
+bool DITemplateValueParameter::Verify() const {
+ return dyn_cast_or_null<MDTemplateValueParameter>(DbgNode);
+}
+bool DIImportedEntity::Verify() const {
+ return dyn_cast_or_null<MDImportedEntity>(DbgNode);
+}
void DICompositeType::setArraysHelper(MDNode *Elements, MDNode *TParams) {
- TypedTrackingMDRef<MDCompositeTypeBase> N(getRaw());
+ TypedTrackingMDRef<MDCompositeTypeBase> N(get());
if (Elements)
N->replaceElements(cast<MDTuple>(Elements));
if (TParams)
@@ -432,7 +452,7 @@ DIScopeRef DIScope::getRef() const {
}
void DICompositeType::setContainingType(DICompositeType ContainingType) {
- TypedTrackingMDRef<MDCompositeTypeBase> N(getRaw());
+ TypedTrackingMDRef<MDCompositeTypeBase> N(get());
N->replaceVTableHolder(ContainingType.getRef());
DbgNode = N;
}
@@ -447,7 +467,7 @@ bool DIVariable::isInlinedFnArgument(con
}
Function *DISubprogram::getFunction() const {
- if (auto *N = getRaw())
+ if (auto *N = get())
if (auto *C = dyn_cast_or_null<ConstantAsMetadata>(N->getFunction()))
return dyn_cast<Function>(C->getValue());
return nullptr;
@@ -504,26 +524,25 @@ StringRef DIScope::getName() const {
}
StringRef DIScope::getFilename() const {
- if (auto *N = getRaw())
+ if (auto *N = get())
return ::getStringField(dyn_cast_or_null<MDNode>(N->getFile()), 0);
return "";
}
StringRef DIScope::getDirectory() const {
- if (auto *N = getRaw())
+ if (auto *N = get())
return ::getStringField(dyn_cast_or_null<MDNode>(N->getFile()), 1);
return "";
}
void DICompileUnit::replaceSubprograms(DIArray Subprograms) {
assert(Verify() && "Expected compile unit");
- getRaw()->replaceSubprograms(cast_or_null<MDTuple>(Subprograms.get()));
+ get()->replaceSubprograms(cast_or_null<MDTuple>(Subprograms.get()));
}
void DICompileUnit::replaceGlobalVariables(DIArray GlobalVariables) {
assert(Verify() && "Expected compile unit");
- getRaw()->replaceGlobalVariables(
- cast_or_null<MDTuple>(GlobalVariables.get()));
+ get()->replaceGlobalVariables(cast_or_null<MDTuple>(GlobalVariables.get()));
}
DILocation DILocation::copyWithNewScope(LLVMContext &Ctx,
Modified: llvm/trunk/test/CodeGen/X86/2012-11-30-misched-dbg.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/2012-11-30-misched-dbg.ll?rev=233030&r1=233029&r2=233030&view=diff
==============================================================================
--- llvm/trunk/test/CodeGen/X86/2012-11-30-misched-dbg.ll (original)
+++ llvm/trunk/test/CodeGen/X86/2012-11-30-misched-dbg.ll Mon Mar 23 16:54:07 2015
@@ -77,7 +77,7 @@ declare i32 @__sprintf_chk(i8*, i32, i64
!10 = distinct !MDLexicalBlock(line: 434, column: 0, file: !14, scope: !11)
!11 = distinct !MDLexicalBlock(line: 250, column: 0, file: !14, scope: !12)
!12 = distinct !MDLexicalBlock(line: 249, column: 0, file: !14, scope: !13)
-!13 = distinct !MDLexicalBlock(line: 221, column: 0, file: !14, scope: !2)
+!13 = distinct !MDLexicalBlock(line: 221, column: 0, file: !14, scope: !21)
!14 = !MDFile(filename: "MultiSource/Benchmarks/MiBench/consumer-typeset/z19.c", directory: "MultiSource/Benchmarks/MiBench/consumer-typeset")
!15 = !MDCompositeType(tag: DW_TAG_array_type, size: 160, align: 8, baseType: !16, elements: !17)
!16 = !MDBasicType(tag: DW_TAG_base_type, name: "char", size: 8, align: 8, encoding: DW_ATE_signed_char)
Modified: llvm/trunk/test/Transforms/Inline/debug-invoke.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/Inline/debug-invoke.ll?rev=233030&r1=233029&r2=233030&view=diff
==============================================================================
--- llvm/trunk/test/Transforms/Inline/debug-invoke.ll (original)
+++ llvm/trunk/test/Transforms/Inline/debug-invoke.ll Mon Mar 23 16:54:07 2015
@@ -4,9 +4,9 @@
; CHECK: invoke void @test()
; CHECK-NEXT: to label {{.*}} unwind label {{.*}}, !dbg [[INL_LOC:!.*]]
-; CHECK: [[EMPTY:.*]] = !{}
-; CHECK: [[INL_LOC]] = !MDLocation(line: 1, scope: [[EMPTY]], inlinedAt: [[INL_AT:.*]])
-; CHECK: [[INL_AT]] = distinct !MDLocation(line: 2, scope: [[EMPTY]])
+; CHECK: [[SP:.*]] = !MDSubprogram(
+; CHECK: [[INL_LOC]] = !MDLocation(line: 1, scope: [[SP]], inlinedAt: [[INL_AT:.*]])
+; CHECK: [[INL_AT]] = distinct !MDLocation(line: 2, scope: [[SP]])
declare void @test()
declare i32 @__gxx_personality_v0(...)
@@ -32,6 +32,6 @@ lpad:
!llvm.module.flags = !{!1}
!1 = !{i32 2, !"Debug Info Version", i32 3}
-!2 = !{}
+!2 = !MDSubprogram()
!3 = !MDLocation(line: 1, scope: !2)
!4 = !MDLocation(line: 2, scope: !2)
More information about the llvm-commits
mailing list