Debug Info: Use DIScopeRef for DIType::getContext.
In DIBuilder, the context field of a TAG_member is updated to use the
scope reference. Verifier is updated accordingly.
DebugInfoFinder now needs to generate a type identifier map to have
access to the actual scope. Same applies for BreakpointPrinter.
processModule of DebugInfoFinder is called during initialization phase
of the verifier to make sure the type identifier map is constructed early
enough.
We are now able to unique a simple class as demonstrated by the added
testing case.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@190334 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp b/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp
index f9ce591..1a527f2 100644
--- a/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp
+++ b/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp
@@ -800,7 +800,7 @@
addAccelType(Ty.getName(), std::make_pair(TyDIE, Flags));
}
- addToContextOwner(TyDIE, Ty.getContext());
+ addToContextOwner(TyDIE, DD->resolve(Ty.getContext()));
return TyDIE;
}
@@ -832,7 +832,7 @@
/// addGlobalType - Add a new global type to the compile unit.
///
void CompileUnit::addGlobalType(DIType Ty) {
- DIDescriptor Context = Ty.getContext();
+ DIDescriptor Context = DD->resolve(Ty.getContext());
if (Ty.isCompositeType() && !Ty.getName().empty() && !Ty.isForwardDecl()
&& (!Context || Context.isCompileUnit() || Context.isFile()
|| Context.isNameSpace()))
@@ -914,7 +914,7 @@
/// Return true if the type is appropriately scoped to be contained inside
/// its own type unit.
static bool isTypeUnitScoped(DIType Ty, const DwarfDebug *DD) {
- DIScope Parent = Ty.getContext();
+ DIScope Parent = DD->resolve(Ty.getContext());
while (Parent) {
// Don't generate a hash for anything scoped inside a function.
if (Parent.isSubprogram())
@@ -1088,7 +1088,7 @@
addDIEEntry(&Buffer, dwarf::DW_AT_containing_type, dwarf::DW_FORM_ref4,
getOrCreateTypeDIE(DIType(ContainingType)));
else
- addToContextOwner(&Buffer, CTy.getContext());
+ addToContextOwner(&Buffer, DD->resolve(CTy.getContext()));
if (CTy.isObjcClassComplete())
addFlag(&Buffer, dwarf::DW_AT_APPLE_objc_complete_type);
@@ -1373,7 +1373,7 @@
// We need the declaration DIE that is in the static member's class.
// But that class might not exist in the DWARF yet.
// Creating the class will create the static member decl DIE.
- getOrCreateContextDIE(SDMDecl.getContext());
+ getOrCreateContextDIE(DD->resolve(SDMDecl.getContext()));
VariableDIE = getDIE(SDMDecl);
assert(VariableDIE && "Static member decl has no context?");
IsStaticMember = true;