Debug Info: add an assertion that the context field of a global variable can not
authorManman Ren <manman.ren@gmail.com>
Fri, 21 Nov 2014 19:47:48 +0000 (19:47 +0000)
committerManman Ren <manman.ren@gmail.com>
Fri, 21 Nov 2014 19:47:48 +0000 (19:47 +0000)
be a DIType with identifier.

This makes sure that there is no need to use DIScopeRef for global variable's
context.

rdar://18958417

llvm-svn: 222561

llvm/lib/IR/DIBuilder.cpp

index 4fe2be6..be43673 100644 (file)
@@ -836,6 +836,13 @@ static DIGlobalVariable createGlobalVariableHelper(
     StringRef LinkageName, DIFile F, unsigned LineNumber, DITypeRef Ty,
     bool isLocalToUnit, Constant *Val, MDNode *Decl, bool isDefinition,
     std::function<MDNode *(ArrayRef<Value *>)> CreateFunc) {
+
+  MDNode *TheCtx = getNonCompileUnitScope(Context);
+  if (DIScope(TheCtx).isCompositeType()) {
+    assert(!DICompositeType(TheCtx).getIdentifier() &&
+           "Context of a global variable should not be a type with identifier");
+  }
+
   Value *Elts[] = {HeaderBuilder::get(dwarf::DW_TAG_variable)
                        .concat(Name)
                        .concat(Name)
@@ -844,7 +851,7 @@ static DIGlobalVariable createGlobalVariableHelper(
                        .concat(isLocalToUnit)
                        .concat(isDefinition)
                        .get(VMContext),
-                   DIScope(getNonCompileUnitScope(Context)).getRef(), F, Ty, Val,
+                   DIScope(TheCtx).getRef(), F, Ty, Val,
                    DIDescriptor(Decl)};
 
   return DIGlobalVariable(CreateFunc(Elts));