DITypeRef Ty, bool isLocalToUnit, llvm::Value *Val,
MDNode *Decl = nullptr);
+ /// createTempStaticVariableFwdDecl - Identical to createStaticVariable
+ /// except that the resulting DbgNode is temporary and meant to be RAUWed.
+ DIGlobalVariable
+ createTempStaticVariableFwdDecl(DIDescriptor Context, StringRef Name,
+ StringRef LinkageName, DIFile File,
+ unsigned LineNo, DITypeRef Ty,
+ bool isLocalToUnit, llvm::Value *Val,
+ MDNode *Decl = nullptr);
+
/// createLocalVariable - Create a new descriptor for the specified
/// local variable.
MDNode *TParam = nullptr,
MDNode *Decl = nullptr);
+ /// createTempFunctionFwdDecl - Identical to createFunction,
+ /// except that the resulting DbgNode is meant to be RAUWed.
+ DISubprogram createTempFunctionFwdDecl(DIDescriptor Scope, StringRef Name,
+ StringRef LinkageName,
+ DIFile File, unsigned LineNo,
+ DICompositeType Ty, bool isLocalToUnit,
+ bool isDefinition,
+ unsigned ScopeLine,
+ unsigned Flags = 0,
+ bool isOptimized = false,
+ Function *Fn = nullptr,
+ MDNode *TParam = nullptr,
+ MDNode *Decl = nullptr);
+
+
/// FIXME: this is added for dragonegg. Once we update dragonegg
/// to call resolve function, this will be removed.
DISubprogram createFunction(DIScopeRef Scope, StringRef Name,
Instruction *insertDbgValueIntrinsic(llvm::Value *Val, uint64_t Offset,
DIVariable VarInfo,
Instruction *InsertBefore);
-
};
} // end namespace llvm
Val);
}
-/// createStaticVariable - Create a new descriptor for the specified static
-/// variable.
-DIGlobalVariable DIBuilder::createStaticVariable(DIDescriptor Context,
- StringRef Name,
- StringRef LinkageName,
- DIFile F, unsigned LineNumber,
- DITypeRef Ty,
- bool isLocalToUnit,
- Value *Val, MDNode *Decl) {
+static DIGlobalVariable
+createStaticVariableHelper(LLVMContext &VMContext, DIDescriptor Context,
+ StringRef Name, StringRef LinkageName, DIFile F,
+ unsigned LineNumber, DITypeRef Ty, bool isLocalToUnit,
+ Value *Val, MDNode *Decl, bool isDefinition,
+ std::function<MDNode *(ArrayRef<Value *>)> CreateFunc) {
Value *Elts[] = {
GetTagConstant(VMContext, dwarf::DW_TAG_variable),
Constant::getNullValue(Type::getInt32Ty(VMContext)),
ConstantInt::get(Type::getInt32Ty(VMContext), LineNumber),
Ty,
ConstantInt::get(Type::getInt32Ty(VMContext), isLocalToUnit),
- ConstantInt::get(Type::getInt32Ty(VMContext), 1), /* isDefinition*/
+ ConstantInt::get(Type::getInt32Ty(VMContext), isDefinition),
Val,
DIDescriptor(Decl)
};
- MDNode *Node = MDNode::get(VMContext, Elts);
- AllGVs.push_back(Node);
- return DIGlobalVariable(Node);
+
+ return DIGlobalVariable(CreateFunc(Elts));
+}
+
+/// createStaticVariable - Create a new descriptor for the specified
+/// variable.
+DIGlobalVariable DIBuilder::createStaticVariable(DIDescriptor Context,
+ StringRef Name,
+ StringRef LinkageName,
+ DIFile F, unsigned LineNumber,
+ DITypeRef Ty,
+ bool isLocalToUnit,
+ Value *Val, MDNode *Decl) {
+ return createStaticVariableHelper(VMContext, Context, Name, LinkageName, F,
+ LineNumber, Ty, isLocalToUnit, Val, Decl, true,
+ [&] (ArrayRef<Value *> Elts) -> MDNode * {
+ MDNode *Node = MDNode::get(VMContext, Elts);
+ AllGVs.push_back(Node);
+ return Node;
+ });
+}
+
+/// createTempStaticVariableFwdDecl - Create a new temporary descriptor for the
+/// specified variable declarartion.
+DIGlobalVariable
+DIBuilder::createTempStaticVariableFwdDecl(DIDescriptor Context,
+ StringRef Name,
+ StringRef LinkageName,
+ DIFile F, unsigned LineNumber,
+ DITypeRef Ty,
+ bool isLocalToUnit,
+ Value *Val, MDNode *Decl) {
+ return createStaticVariableHelper(VMContext, Context, Name, LinkageName, F,
+ LineNumber, Ty, isLocalToUnit, Val, Decl, false,
+ [&] (ArrayRef<Value *> Elts) {
+ return MDNode::getTemporary(VMContext, Elts);
+ });
}
/// createVariable - Create a new descriptor for the specified variable.
Flags, isOptimized, Fn, TParams, Decl);
}
-/// createFunction - Create a new descriptor for the specified function.
-DISubprogram DIBuilder::createFunction(DIDescriptor Context, StringRef Name,
- StringRef LinkageName, DIFile File,
- unsigned LineNo, DICompositeType Ty,
- bool isLocalToUnit, bool isDefinition,
- unsigned ScopeLine, unsigned Flags,
- bool isOptimized, Function *Fn,
- MDNode *TParams, MDNode *Decl) {
+static DISubprogram
+createFunctionHelper(LLVMContext &VMContext, DIDescriptor Context, StringRef Name,
+ StringRef LinkageName, DIFile File, unsigned LineNo,
+ DICompositeType Ty, bool isLocalToUnit, bool isDefinition,
+ unsigned ScopeLine, unsigned Flags, bool isOptimized,
+ Function *Fn, MDNode *TParams, MDNode *Decl,
+ std::function<MDNode *(ArrayRef<Value *>)> CreateFunc) {
assert(Ty.getTag() == dwarf::DW_TAG_subroutine_type &&
"function types should be subroutines");
Value *TElts[] = { GetTagConstant(VMContext, DW_TAG_base_type) };
MDNode::getTemporary(VMContext, TElts),
ConstantInt::get(Type::getInt32Ty(VMContext), ScopeLine)
};
- MDNode *Node = MDNode::get(VMContext, Elts);
- // Create a named metadata so that we do not lose this mdnode.
- if (isDefinition)
- AllSubprograms.push_back(Node);
- DISubprogram S(Node);
+ DISubprogram S(CreateFunc(Elts));
assert(S.isSubprogram() &&
"createFunction should return a valid DISubprogram");
return S;
}
+
+/// createFunction - Create a new descriptor for the specified function.
+DISubprogram DIBuilder::createFunction(DIDescriptor Context, StringRef Name,
+ StringRef LinkageName, DIFile File,
+ unsigned LineNo, DICompositeType Ty,
+ bool isLocalToUnit, bool isDefinition,
+ unsigned ScopeLine, unsigned Flags,
+ bool isOptimized, Function *Fn,
+ MDNode *TParams, MDNode *Decl) {
+ return createFunctionHelper(VMContext, Context, Name, LinkageName, File,
+ LineNo, Ty, isLocalToUnit, isDefinition, ScopeLine,
+ Flags, isOptimized, Fn, TParams, Decl,
+ [&] (ArrayRef<Value *> Elts) -> MDNode *{
+ MDNode *Node = MDNode::get(VMContext, Elts);
+ // Create a named metadata so that we
+ // do not lose this mdnode.
+ if (isDefinition)
+ AllSubprograms.push_back(Node);
+ return Node;
+ });
+}
+
+/// createTempFunctionFwdDecl - Create a new temporary descriptor for
+/// the specified function declaration.
+DISubprogram
+DIBuilder::createTempFunctionFwdDecl(DIDescriptor Context, StringRef Name,
+ StringRef LinkageName, DIFile File,
+ unsigned LineNo, DICompositeType Ty,
+ bool isLocalToUnit, bool isDefinition,
+ unsigned ScopeLine, unsigned Flags,
+ bool isOptimized, Function *Fn,
+ MDNode *TParams, MDNode *Decl) {
+ return createFunctionHelper(VMContext, Context, Name, LinkageName, File,
+ LineNo, Ty, isLocalToUnit, isDefinition, ScopeLine,
+ Flags, isOptimized, Fn, TParams, Decl,
+ [&] (ArrayRef<Value *> Elts) {
+ return MDNode::getTemporary(VMContext, Elts);
+ });
+}
+
/// createMethod - Create a new descriptor for the specified C++ method.
DISubprogram DIBuilder::createMethod(DIDescriptor Context, StringRef Name,
StringRef LinkageName, DIFile F,