Adding DIImportedModules to DIScopes.
This is just the basic groundwork for supporting DW_TAG_imported_module but I
wanted to commit this before pushing support further into Clang or LLVM so that
this rather churny change is isolated from the rest of the work. The major
churn here is obviously adding another field (within the common DIScope prefix)
to all DIScopes (files, classes, namespaces, lexical scopes, etc). This should
be the last big churny change needed for DW_TAG_imported_module/using directive
support/PR14606.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@178099 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/IR/DIBuilder.cpp b/lib/IR/DIBuilder.cpp
index 0d18bed..ee53dff 100644
--- a/lib/IR/DIBuilder.cpp
+++ b/lib/IR/DIBuilder.cpp
@@ -104,6 +104,7 @@
Value *Elts[] = {
GetTagConstant(VMContext, dwarf::DW_TAG_compile_unit),
createFilePathPair(VMContext, Filename, Directory),
+ NULL, // Imported modules
ConstantInt::get(Type::getInt32Ty(VMContext), Lang),
MDString::get(VMContext, Producer),
ConstantInt::get(Type::getInt1Ty(VMContext), isOptimized),
@@ -115,7 +116,9 @@
TempGVs,
MDString::get(VMContext, SplitName)
};
- TheCU = DICompileUnit(MDNode::get(VMContext, Elts));
+ DICompileUnit CU(MDNode::get(VMContext, Elts));
+ assert(CU.Verify() && "The compile unit should be valid");
+ TheCU = CU;
// Create a named metadata so that it is easier to find cu in a module.
NamedMDNode *NMD = M.getOrInsertNamedMetadata("llvm.dbg.cu");
@@ -127,9 +130,12 @@
DIFile DIBuilder::createFile(StringRef Filename, StringRef Directory) {
Value *Elts[] = {
GetTagConstant(VMContext, dwarf::DW_TAG_file_type),
- createFilePathPair(VMContext, Filename, Directory)
+ createFilePathPair(VMContext, Filename, Directory),
+ NULL // Imported modules
};
- return DIFile(MDNode::get(VMContext, Elts));
+ DIFile F(MDNode::get(VMContext, Elts));
+ assert(F.Verify() && "The DIFile should be valid");
+ return F;
}
/// createEnumerator - Create a single enumerator value.
@@ -140,7 +146,9 @@
MDString::get(VMContext, Name),
ConstantInt::get(Type::getInt64Ty(VMContext), Val)
};
- return DIEnumerator(MDNode::get(VMContext, Elts));
+ DIEnumerator E(MDNode::get(VMContext, Elts));
+ assert(E.Verify() && "The enumerator should be valid");
+ return E;
}
/// createNullPtrType - Create C++0x nullptr type.
@@ -151,6 +159,7 @@
Value *Elts[] = {
GetTagConstant(VMContext, dwarf::DW_TAG_unspecified_type),
NULL, // Filename
+ Constant::getNullValue(Type::getInt32Ty(VMContext)), // Imported modules
NULL, //TheCU,
MDString::get(VMContext, Name),
ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Line
@@ -160,7 +169,9 @@
ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Flags;
ConstantInt::get(Type::getInt32Ty(VMContext), 0) // Encoding
};
- return DIType(MDNode::get(VMContext, Elts));
+ DIType T(MDNode::get(VMContext, Elts));
+ assert(T.Verify() && "The nullptr type should be valid");
+ return T;
}
/// createBasicType - Create debugging information entry for a basic
@@ -174,6 +185,7 @@
Value *Elts[] = {
GetTagConstant(VMContext, dwarf::DW_TAG_base_type),
NULL, // File/directory name
+ NULL, // Imported modules
NULL, //TheCU,
MDString::get(VMContext, Name),
ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Line
@@ -183,7 +195,9 @@
ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Flags;
ConstantInt::get(Type::getInt32Ty(VMContext), Encoding)
};
- return DIBasicType(MDNode::get(VMContext, Elts));
+ DIBasicType T(MDNode::get(VMContext, Elts));
+ assert(T.Verify() && "The basic type should be valid");
+ return T;
}
/// createQualifiedType - Create debugging information entry for a qualified
@@ -193,6 +207,7 @@
Value *Elts[] = {
GetTagConstant(VMContext, Tag),
NULL, // Filename
+ NULL, // Imported modules
NULL, //TheCU,
MDString::get(VMContext, StringRef()), // Empty name.
ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Line
@@ -202,7 +217,9 @@
ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Flags
FromTy
};
- return DIDerivedType(MDNode::get(VMContext, Elts));
+ DIDerivedType T(MDNode::get(VMContext, Elts));
+ assert(T.Verify() && "The derived type should be valid");
+ return T;
}
/// createPointerType - Create debugging information entry for a pointer.
@@ -213,6 +230,7 @@
Value *Elts[] = {
GetTagConstant(VMContext, dwarf::DW_TAG_pointer_type),
NULL, // Filename
+ NULL, // Imported modules
NULL, //TheCU,
MDString::get(VMContext, Name),
ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Line
@@ -222,7 +240,9 @@
ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Flags
PointeeTy
};
- return DIDerivedType(MDNode::get(VMContext, Elts));
+ DIDerivedType T(MDNode::get(VMContext, Elts));
+ assert(T.Verify() && "The pointer type should be valid");
+ return T;
}
DIDerivedType DIBuilder::createMemberPointerType(DIType PointeeTy, DIType Base) {
@@ -230,6 +250,7 @@
Value *Elts[] = {
GetTagConstant(VMContext, dwarf::DW_TAG_ptr_to_member_type),
NULL, // Filename
+ NULL, // Imported modules
NULL, //TheCU,
NULL,
ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Line
@@ -240,7 +261,9 @@
PointeeTy,
Base
};
- return DIDerivedType(MDNode::get(VMContext, Elts));
+ DIDerivedType T(MDNode::get(VMContext, Elts));
+ assert(T.Verify() && "The member pointer type should be valid");
+ return T;
}
/// createReferenceType - Create debugging information entry for a reference
@@ -251,6 +274,7 @@
Value *Elts[] = {
GetTagConstant(VMContext, Tag),
NULL, // Filename
+ NULL, // Imported modules
NULL, // TheCU,
NULL, // Name
ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Line
@@ -260,7 +284,9 @@
ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Flags
RTy
};
- return DIDerivedType(MDNode::get(VMContext, Elts));
+ DIDerivedType T(MDNode::get(VMContext, Elts));
+ assert(T.Verify() && "The reference type should be valid");
+ return T;
}
/// createTypedef - Create debugging information entry for a typedef.
@@ -271,6 +297,7 @@
Value *Elts[] = {
GetTagConstant(VMContext, dwarf::DW_TAG_typedef),
File.getFileNode(),
+ NULL, // Imported modules
getNonCompileUnitScope(Context),
MDString::get(VMContext, Name),
ConstantInt::get(Type::getInt32Ty(VMContext), LineNo),
@@ -280,7 +307,9 @@
ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Flags
Ty
};
- return DIDerivedType(MDNode::get(VMContext, Elts));
+ DIDerivedType T(MDNode::get(VMContext, Elts));
+ assert(T.Verify() && "The typedef Type should be valid");
+ return T;
}
/// createFriend - Create debugging information entry for a 'friend'.
@@ -291,6 +320,7 @@
Value *Elts[] = {
GetTagConstant(VMContext, dwarf::DW_TAG_friend),
NULL,
+ NULL, // Imported modules
Ty,
NULL, // Name
ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Line
@@ -300,7 +330,9 @@
ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Flags
FriendTy
};
- return DIType(MDNode::get(VMContext, Elts));
+ DIType T(MDNode::get(VMContext, Elts));
+ assert(T.Verify() && "The friend type should be valid");
+ return T;
}
/// createInheritance - Create debugging information entry to establish
@@ -312,6 +344,7 @@
Value *Elts[] = {
GetTagConstant(VMContext, dwarf::DW_TAG_inheritance),
NULL,
+ NULL, // Imported modules
Ty,
NULL, // Name
ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Line
@@ -321,7 +354,9 @@
ConstantInt::get(Type::getInt32Ty(VMContext), Flags),
BaseTy
};
- return DIDerivedType(MDNode::get(VMContext, Elts));
+ DIDerivedType T(MDNode::get(VMContext, Elts));
+ assert(T.Verify() && "The inheritance type should be valid");
+ return T;
}
/// createMemberType - Create debugging information entry for a member.
@@ -333,6 +368,7 @@
Value *Elts[] = {
GetTagConstant(VMContext, dwarf::DW_TAG_member),
File.getFileNode(),
+ NULL, // Imported modules
getNonCompileUnitScope(Scope),
MDString::get(VMContext, Name),
ConstantInt::get(Type::getInt32Ty(VMContext), LineNumber),
@@ -342,7 +378,9 @@
ConstantInt::get(Type::getInt32Ty(VMContext), Flags),
Ty
};
- return DIDerivedType(MDNode::get(VMContext, Elts));
+ DIDerivedType T(MDNode::get(VMContext, Elts));
+ assert(T.Verify() && "The member type should be valid");
+ return T;
}
/// createStaticMemberType - Create debugging information entry for a
@@ -356,6 +394,7 @@
Value *Elts[] = {
GetTagConstant(VMContext, dwarf::DW_TAG_member),
File.getFileNode(),
+ NULL, // Imported modules
getNonCompileUnitScope(Scope),
MDString::get(VMContext, Name),
ConstantInt::get(Type::getInt32Ty(VMContext), LineNumber),
@@ -366,7 +405,9 @@
Ty,
Val
};
- return DIType(MDNode::get(VMContext, Elts));
+ DIType T(MDNode::get(VMContext, Elts));
+ assert(T.Verify() && "The static member type should be valid");
+ return T;
}
/// createObjCIVar - Create debugging information entry for Objective-C
@@ -382,6 +423,7 @@
Value *Elts[] = {
GetTagConstant(VMContext, dwarf::DW_TAG_member),
File.getFileNode(),
+ NULL, // Imported modules
getNonCompileUnitScope(File),
MDString::get(VMContext, Name),
ConstantInt::get(Type::getInt32Ty(VMContext), LineNumber),
@@ -395,7 +437,9 @@
MDString::get(VMContext, SetterName),
ConstantInt::get(Type::getInt32Ty(VMContext), PropertyAttributes)
};
- return DIType(MDNode::get(VMContext, Elts));
+ DIType T(MDNode::get(VMContext, Elts));
+ assert(T.Verify() && "The Objective-C IVar type should be valid");
+ return T;
}
/// createObjCIVar - Create debugging information entry for Objective-C
@@ -409,6 +453,7 @@
Value *Elts[] = {
GetTagConstant(VMContext, dwarf::DW_TAG_member),
File.getFileNode(),
+ NULL, // Imported modules
getNonCompileUnitScope(File),
MDString::get(VMContext, Name),
ConstantInt::get(Type::getInt32Ty(VMContext), LineNumber),
@@ -419,7 +464,9 @@
Ty,
PropertyNode
};
- return DIType(MDNode::get(VMContext, Elts));
+ DIType T(MDNode::get(VMContext, Elts));
+ assert(T.Verify() && "The Objective-C IVar type should be valid");
+ return T;
}
/// createObjCProperty - Create debugging information entry for Objective-C
@@ -440,7 +487,9 @@
ConstantInt::get(Type::getInt32Ty(VMContext), PropertyAttributes),
Ty
};
- return DIObjCProperty(MDNode::get(VMContext, Elts));
+ DIObjCProperty P(MDNode::get(VMContext, Elts));
+ assert(P.Verify() && "The Objective-C property should be valid");
+ return P;
}
/// createTemplateTypeParameter - Create debugging information for template
@@ -458,7 +507,9 @@
ConstantInt::get(Type::getInt32Ty(VMContext), LineNo),
ConstantInt::get(Type::getInt32Ty(VMContext), ColumnNo)
};
- return DITemplateTypeParameter(MDNode::get(VMContext, Elts));
+ DITemplateTypeParameter P(MDNode::get(VMContext, Elts));
+ assert(P.Verify() && "The template type parameter should be valid");
+ return P;
}
/// createTemplateValueParameter - Create debugging information for template
@@ -478,7 +529,9 @@
ConstantInt::get(Type::getInt32Ty(VMContext), LineNo),
ConstantInt::get(Type::getInt32Ty(VMContext), ColumnNo)
};
- return DITemplateValueParameter(MDNode::get(VMContext, Elts));
+ DITemplateValueParameter P(MDNode::get(VMContext, Elts));
+ assert(P.Verify() && "The template value parameter should be valid");
+ return P;
}
/// createClassType - Create debugging information entry for a class.
@@ -497,6 +550,7 @@
Value *Elts[] = {
GetTagConstant(VMContext, dwarf::DW_TAG_class_type),
File.getFileNode(),
+ NULL, // Imported modules
getNonCompileUnitScope(Context),
MDString::get(VMContext, Name),
ConstantInt::get(Type::getInt32Ty(VMContext), LineNumber),
@@ -529,6 +583,7 @@
Value *Elts[] = {
GetTagConstant(VMContext, dwarf::DW_TAG_structure_type),
File.getFileNode(),
+ NULL, // Imported modules
getNonCompileUnitScope(Context),
MDString::get(VMContext, Name),
ConstantInt::get(Type::getInt32Ty(VMContext), LineNumber),
@@ -556,6 +611,7 @@
Value *Elts[] = {
GetTagConstant(VMContext, dwarf::DW_TAG_union_type),
File.getFileNode(),
+ NULL, // Imported modules
getNonCompileUnitScope(Scope),
MDString::get(VMContext, Name),
ConstantInt::get(Type::getInt32Ty(VMContext), LineNumber),
@@ -568,7 +624,9 @@
ConstantInt::get(Type::getInt32Ty(VMContext), RunTimeLang),
Constant::getNullValue(Type::getInt32Ty(VMContext))
};
- return DICompositeType(MDNode::get(VMContext, Elts));
+ DICompositeType T(MDNode::get(VMContext, Elts));
+ assert(T.Verify() && "The union type should be valid");
+ return T;
}
/// createSubroutineType - Create subroutine type.
@@ -578,6 +636,7 @@
Value *Elts[] = {
GetTagConstant(VMContext, dwarf::DW_TAG_subroutine_type),
Constant::getNullValue(Type::getInt32Ty(VMContext)),
+ Constant::getNullValue(Type::getInt32Ty(VMContext)), // Imported modules
Constant::getNullValue(Type::getInt32Ty(VMContext)),
MDString::get(VMContext, ""),
ConstantInt::get(Type::getInt32Ty(VMContext), 0),
@@ -590,7 +649,9 @@
ConstantInt::get(Type::getInt32Ty(VMContext), 0),
Constant::getNullValue(Type::getInt32Ty(VMContext))
};
- return DICompositeType(MDNode::get(VMContext, Elts));
+ DICompositeType T(MDNode::get(VMContext, Elts));
+ assert(T.Verify() && "The subroutine type should be valid");
+ return T;
}
/// createEnumerationType - Create debugging information entry for an
@@ -603,6 +664,7 @@
Value *Elts[] = {
GetTagConstant(VMContext, dwarf::DW_TAG_enumeration_type),
File.getFileNode(),
+ NULL, // Imported modules
getNonCompileUnitScope(Scope),
MDString::get(VMContext, Name),
ConstantInt::get(Type::getInt32Ty(VMContext), LineNumber),
@@ -617,7 +679,9 @@
};
MDNode *Node = MDNode::get(VMContext, Elts);
AllEnumTypes.push_back(Node);
- return DICompositeType(Node);
+ DICompositeType T(Node);
+ assert(T.Verify() && "The enumeration type should be valid");
+ return T;
}
/// createArrayType - Create debugging information entry for an array.
@@ -627,6 +691,7 @@
Value *Elts[] = {
GetTagConstant(VMContext, dwarf::DW_TAG_array_type),
NULL, // Filename/Directory,
+ Constant::getNullValue(Type::getInt32Ty(VMContext)), // Imported modules
NULL, //TheCU,
MDString::get(VMContext, ""),
ConstantInt::get(Type::getInt32Ty(VMContext), 0),
@@ -639,7 +704,9 @@
ConstantInt::get(Type::getInt32Ty(VMContext), 0),
Constant::getNullValue(Type::getInt32Ty(VMContext))
};
- return DICompositeType(MDNode::get(VMContext, Elts));
+ DICompositeType T(MDNode::get(VMContext, Elts));
+ assert(T.Verify() && "The array type should be valid");
+ return T;
}
/// createVectorType - Create debugging information entry for a vector.
@@ -650,6 +717,7 @@
Value *Elts[] = {
GetTagConstant(VMContext, dwarf::DW_TAG_array_type),
NULL, // Filename/Directory,
+ Constant::getNullValue(Type::getInt32Ty(VMContext)), // Imported modules
NULL, //TheCU,
MDString::get(VMContext, ""),
ConstantInt::get(Type::getInt32Ty(VMContext), 0),
@@ -662,7 +730,9 @@
ConstantInt::get(Type::getInt32Ty(VMContext), 0),
Constant::getNullValue(Type::getInt32Ty(VMContext))
};
- return DIType(MDNode::get(VMContext, Elts));
+ DIType T(MDNode::get(VMContext, Elts));
+ assert(T.Verify() && "The vector type should be valid");
+ return T;
}
/// createArtificialType - Create a new DIType with "artificial" flag set.
@@ -684,9 +754,11 @@
CurFlags = CurFlags | DIType::FlagArtificial;
// Flags are stored at this slot.
- Elts[8] = ConstantInt::get(Type::getInt32Ty(VMContext), CurFlags);
+ Elts[9] = ConstantInt::get(Type::getInt32Ty(VMContext), CurFlags);
- return DIType(MDNode::get(VMContext, Elts));
+ DIType T(MDNode::get(VMContext, Elts));
+ assert(T.Verify() && "The artificial type should be valid");
+ return T;
}
/// createObjectPointerType - Create a new type with both the object pointer
@@ -709,9 +781,11 @@
CurFlags = CurFlags | (DIType::FlagObjectPointer | DIType::FlagArtificial);
// Flags are stored at this slot.
- Elts[8] = ConstantInt::get(Type::getInt32Ty(VMContext), CurFlags);
+ Elts[9] = ConstantInt::get(Type::getInt32Ty(VMContext), CurFlags);
- return DIType(MDNode::get(VMContext, Elts));
+ DIType T(MDNode::get(VMContext, Elts));
+ assert(T.Verify() && "The object pointer type should be valid");
+ return T;
}
/// retainType - Retain DIType in a module even if it is not referenced
@@ -740,6 +814,7 @@
Value *Elts[] = {
GetTagConstant(VMContext, Tag),
F.getFileNode(),
+ NULL, // Imported modules
getNonCompileUnitScope(Scope),
MDString::get(VMContext, Name),
ConstantInt::get(Type::getInt32Ty(VMContext), Line),
@@ -911,6 +986,7 @@
Value *Elts[] = {
GetTagConstant(VMContext, dwarf::DW_TAG_subprogram),
File.getFileNode(),
+ NULL, // Imported modules
getNonCompileUnitScope(Context),
MDString::get(VMContext, Name),
MDString::get(VMContext, Name),
@@ -958,6 +1034,7 @@
Value *Elts[] = {
GetTagConstant(VMContext, dwarf::DW_TAG_subprogram),
F.getFileNode(),
+ NULL, // Imported modules
getNonCompileUnitScope(Context),
MDString::get(VMContext, Name),
MDString::get(VMContext, Name),
@@ -993,6 +1070,7 @@
Value *Elts[] = {
GetTagConstant(VMContext, dwarf::DW_TAG_namespace),
File.getFileNode(),
+ NULL, // Imported modules
getNonCompileUnitScope(Scope),
MDString::get(VMContext, Name),
ConstantInt::get(Type::getInt32Ty(VMContext), LineNo)
@@ -1010,6 +1088,7 @@
Value *Elts[] = {
GetTagConstant(VMContext, dwarf::DW_TAG_lexical_block),
File.getFileNode(),
+ NULL, // Imported modules
Scope
};
DILexicalBlockFile R(MDNode::get(VMContext, Elts));
@@ -1026,6 +1105,7 @@
Value *Elts[] = {
GetTagConstant(VMContext, dwarf::DW_TAG_lexical_block),
File.getFileNode(),
+ NULL, // Imported modules
getNonCompileUnitScope(Scope),
ConstantInt::get(Type::getInt32Ty(VMContext), Line),
ConstantInt::get(Type::getInt32Ty(VMContext), Col),