/// \brief Maps from type identifier to the actual MDNode.
typedef DenseMap<const MDString *, MDNode *> DITypeIdentifierMap;
-class DIDescriptor {
- MDNode *N;
-
-public:
- DIDescriptor(const MDNode *N = nullptr) : N(const_cast<MDNode *>(N)) {}
-
- operator MDNode *() const { return N; }
- MDNode *operator->() const { return N; }
- MDNode &operator*() const { return *N; }
-};
-
#define DECLARE_SIMPLIFY_DESCRIPTOR(DESC) \
class DESC; \
template <> struct simplify_type<const DESC>; \
template <> struct simplify_type<DESC>;
-DECLARE_SIMPLIFY_DESCRIPTOR(DIDescriptor)
DECLARE_SIMPLIFY_DESCRIPTOR(DISubrange)
DECLARE_SIMPLIFY_DESCRIPTOR(DIEnumerator)
DECLARE_SIMPLIFY_DESCRIPTOR(DIScope)
public:
DIScope(const MDScope *N = nullptr) : N(const_cast<MDScope *>(N)) {}
- operator DIDescriptor() const { return N; }
operator MDScope *() const { return N; }
MDScope *operator->() const { return N; }
MDScope &operator*() const { return *N; }
public:
DIType(const MDType *N = nullptr) : N(const_cast<MDType *>(N)) {}
- operator DIDescriptor() const { return N; }
operator DIScope() const { return N; }
operator MDType *() const { return N; }
MDType *operator->() const { return N; }
DIBasicType(const MDBasicType *N = nullptr)
: N(const_cast<MDBasicType *>(N)) {}
- operator DIDescriptor() const { return N; }
operator DIType() const { return N; }
operator MDBasicType *() const { return N; }
MDBasicType *operator->() const { return N; }
DIDerivedType(const MDDerivedTypeBase *N = nullptr)
: N(const_cast<MDDerivedTypeBase *>(N)) {}
- operator DIDescriptor() const { return N; }
operator DIType() const { return N; }
operator MDDerivedTypeBase *() const { return N; }
MDDerivedTypeBase *operator->() const { return N; }
DICompositeType(const MDCompositeTypeBase *N = nullptr)
: N(const_cast<MDCompositeTypeBase *>(N)) {}
- operator DIDescriptor() const { return N; }
operator DIType() const { return N; }
operator MDCompositeTypeBase *() const { return N; }
MDCompositeTypeBase *operator->() const { return N; }
DISubroutineType(const MDSubroutineType *N = nullptr)
: N(const_cast<MDSubroutineType *>(N)) {}
- operator DIDescriptor() const { return N; }
operator DIType() const { return N; }
operator DICompositeType() const { return N; }
operator MDSubroutineType *() const { return N; }
public:
DIFile(const MDFile *N = nullptr) : N(const_cast<MDFile *>(N)) {}
- operator DIDescriptor() const { return N; }
operator DIScope() const { return N; }
operator MDFile *() const { return N; }
MDFile *operator->() const { return N; }
DICompileUnit(const MDCompileUnit *N = nullptr)
: N(const_cast<MDCompileUnit *>(N)) {}
- operator DIDescriptor() const { return N; }
operator DIScope() const { return N; }
operator MDCompileUnit *() const { return N; }
MDCompileUnit *operator->() const { return N; }
DISubprogram(const MDSubprogram *N = nullptr)
: N(const_cast<MDSubprogram *>(N)) {}
- operator DIDescriptor() const { return N; }
operator DIScope() const { return N; }
operator MDSubprogram *() const { return N; }
MDSubprogram *operator->() const { return N; }
DILexicalBlock(const MDLexicalBlockBase *N = nullptr)
: N(const_cast<MDLexicalBlockBase *>(N)) {}
- operator DIDescriptor() const { return N; }
operator MDLexicalBlockBase *() const { return N; }
MDLexicalBlockBase *operator->() const { return N; }
MDLexicalBlockBase &operator*() const { return *N; }
DILexicalBlockFile(const MDLexicalBlockFile *N = nullptr)
: N(const_cast<MDLexicalBlockFile *>(N)) {}
- operator DIDescriptor() const { return N; }
operator MDLexicalBlockFile *() const { return N; }
MDLexicalBlockFile *operator->() const { return N; }
MDLexicalBlockFile &operator*() const { return *N; }
DINameSpace(const MDNamespace *N = nullptr)
: N(const_cast<MDNamespace *>(N)) {}
- operator DIDescriptor() const { return N; }
operator DIScope() const { return N; }
operator MDNamespace *() const { return N; }
MDNamespace *operator->() const { return N; }
DIGlobalVariable(const MDGlobalVariable *N = nullptr)
: N(const_cast<MDGlobalVariable *>(N)) {}
- operator DIDescriptor() const { return N; }
operator MDGlobalVariable *() const { return N; }
MDGlobalVariable *operator->() const { return N; }
MDGlobalVariable &operator*() const { return *N; }
DIImportedEntity(const MDImportedEntity *N = nullptr)
: N(const_cast<MDImportedEntity *>(N)) {}
- operator DIDescriptor() const { return N; }
operator MDImportedEntity *() const { return N; }
MDImportedEntity *operator->() const { return N; }
MDImportedEntity &operator*() const { return *N; }
static SimpleType getSimplifiedValue(const DESC &DI) { return DI; } \
}; \
template <> struct simplify_type<DESC> : simplify_type<const DESC> {};
-SIMPLIFY_DESCRIPTOR(DIDescriptor)
SIMPLIFY_DESCRIPTOR(DISubrange)
SIMPLIFY_DESCRIPTOR(DIEnumerator)
SIMPLIFY_DESCRIPTOR(DIScope)
if (includeMinimalInlineScopes())
ContextDIE = &getUnitDie();
// Some of this is duplicated from DwarfUnit::getOrCreateSubprogramDIE, with
- // the important distinction that the DIDescriptor is not associated with the
- // DIE (since the DIDescriptor will be associated with the concrete DIE, if
+ // the important distinction that the debug node is not associated with the
+ // DIE (since the debug node will be associated with the concrete DIE, if
// any). It could be refactored to some common utility function.
else if (auto *SPDecl = SP->getDeclaration()) {
ContextDIE = &getUnitDie();
} else
ContextDIE = getOrCreateContextDIE(resolve(SP->getScope()));
- // Passing null as the associated DIDescriptor because the abstract definition
+ // Passing null as the associated node because the abstract definition
// shouldn't be found by lookup.
- AbsDef =
- &createAndAddDIE(dwarf::DW_TAG_subprogram, *ContextDIE, DIDescriptor());
+ AbsDef = &createAndAddDIE(dwarf::DW_TAG_subprogram, *ContextDIE, nullptr);
applySubprogramAttributesToDefinition(SP, *AbsDef);
if (!includeMinimalInlineScopes())
}
/// Check whether the DIE for this MDNode can be shared across CUs.
-static bool isShareableAcrossCUs(DIDescriptor D) {
+static bool isShareableAcrossCUs(const DebugNode *D) {
// When the MDNode can be part of the type system, the DIE can be shared
// across CUs.
// Combining type units and cross-CU DIE sharing is lower value (since
/// specified debug variable. We delegate the request to DwarfDebug
/// when the DIE for this MDNode can be shared across CUs. The mappings
/// will be kept in DwarfDebug for shareable DIEs.
-DIE *DwarfUnit::getDIE(DIDescriptor D) const {
+DIE *DwarfUnit::getDIE(const DebugNode *D) const {
if (isShareableAcrossCUs(D))
return DU->getDIE(D);
return MDNodeToDieMap.lookup(D);
/// insertDIE - Insert DIE into the map. We delegate the request to DwarfDebug
/// when the DIE for this MDNode can be shared across CUs. The mappings
/// will be kept in DwarfDebug for shareable DIEs.
-void DwarfUnit::insertDIE(DIDescriptor Desc, DIE *D) {
+void DwarfUnit::insertDIE(const DebugNode *Desc, DIE *D) {
if (isShareableAcrossCUs(Desc)) {
DU->insertDIE(Desc, D);
return;
/// Create a DIE with the given Tag, add the DIE to its parent, and
/// call insertDIE if MD is not null.
-DIE &DwarfUnit::createAndAddDIE(unsigned Tag, DIE &Parent, DIDescriptor N) {
+DIE &DwarfUnit::createAndAddDIE(unsigned Tag, DIE &Parent, const DebugNode *N) {
assert(Tag != dwarf::DW_TAG_auto_variable &&
Tag != dwarf::DW_TAG_arg_variable);
Parent.addChild(make_unique<DIE>((dwarf::Tag)Tag));
/// addTemplateParams - Add template parameters into buffer.
void DwarfUnit::addTemplateParams(DIE &Buffer, DIArray TParams) {
// Add template parameters.
- for (unsigned i = 0, e = TParams.size(); i != e; ++i) {
- DIDescriptor Element = TParams[i];
+ for (const auto *Element : TParams) {
if (auto *TTP = dyn_cast<MDTemplateTypeParameter>(Element))
constructTemplateTypeParameterDIE(Buffer, TTP);
else if (auto *TVP = dyn_cast<MDTemplateValueParameter>(Element))
case dwarf::DW_TAG_class_type: {
// Add elements to structure type.
DIArray Elements = CTy->getElements();
- for (unsigned i = 0, N = Elements.size(); i < N; ++i) {
- DIDescriptor Element = Elements[i];
+ for (const auto *Element : Elements) {
if (!Element)
continue;
if (auto *SP = dyn_cast<MDSubprogram>(Element))
/// constructContainingTypeDIEs - Construct DIEs for types that contain
/// vtables.
void DwarfUnit::constructContainingTypeDIEs() {
- for (DenseMap<DIE *, const MDNode *>::iterator CI = ContainingTypeMap.begin(),
- CE = ContainingTypeMap.end();
+ for (auto CI = ContainingTypeMap.begin(), CE = ContainingTypeMap.end();
CI != CE; ++CI) {
DIE &SPDie = *CI->first;
- DIDescriptor D(CI->second);
+ const DebugNode *D = CI->second;
if (!D)
continue;
DIE *NDie = getDIE(D);
/// ContainingTypeMap - This map is used to keep track of subprogram DIEs that
/// need DW_AT_containing_type attribute. This attribute points to a DIE that
/// corresponds to the MDNode mapped with the subprogram DIE.
- DenseMap<DIE *, const MDNode *> ContainingTypeMap;
+ DenseMap<DIE *, const DebugNode *> ContainingTypeMap;
// DIEValueAllocator - All DIEValues are allocated through this allocator.
BumpPtrAllocator DIEValueAllocator;
/// when the MDNode can be part of the type system, since DIEs for
/// the type system can be shared across CUs and the mappings are
/// kept in DwarfDebug.
- DIE *getDIE(DIDescriptor D) const;
+ DIE *getDIE(const DebugNode *D) const;
/// getDIELoc - Returns a fresh newly allocated DIELoc.
DIELoc *getDIELoc() { return new (DIEValueAllocator) DIELoc(); }
/// when the MDNode can be part of the type system, since DIEs for
/// the type system can be shared across CUs and the mappings are
/// kept in DwarfDebug.
- void insertDIE(DIDescriptor Desc, DIE *D);
+ void insertDIE(const DebugNode *Desc, DIE *D);
/// addFlag - Add a flag that is true to the DIE.
void addFlag(DIE &Die, dwarf::Attribute Attribute);
/// Create a DIE with the given Tag, add the DIE to its parent, and
/// call insertDIE if MD is not null.
- DIE &createAndAddDIE(unsigned Tag, DIE &Parent,
- DIDescriptor N = DIDescriptor());
+ DIE &createAndAddDIE(unsigned Tag, DIE &Parent, const DebugNode *N = nullptr);
/// Compute the size of a header for this unit, not including the initial
/// length field.
BreakpointPrinter(raw_ostream &out) : ModulePass(ID), Out(out) {}
- void getContextName(DIDescriptor Context, std::string &N) {
+ void getContextName(const MDScope *Context, std::string &N) {
if (auto *NS = dyn_cast<MDNamespace>(Context)) {
if (!NS->getName().empty()) {
getContextName(NS->getScope(), N);
N = N + NS->getName().str() + "::";
}
- } else if (DIType TY = dyn_cast<MDType>(Context)) {
+ } else if (auto *TY = dyn_cast<MDType>(Context)) {
if (!TY->getName().empty()) {
getContextName(TY->getScope().resolve(TypeIdentifierMap), N);
N = N + TY->getName().str() + "::";