Skip to content

Commit

Permalink
Add DIBuilder functions to build RAUWable DIVariables and DIFunctions.
Browse files Browse the repository at this point in the history
Summary: These will be used to implement support for useful forward declarartions.

Reviewers: echristo, dblaikie, aprantl

Subscribers: llvm-commits

Differential Revision: http://reviews.llvm.org/D5328

llvm-svn: 217949
  • Loading branch information
fredriss committed Sep 17, 2014
1 parent 559b47d commit 5e6bc9e
Show file tree
Hide file tree
Showing 2 changed files with 116 additions and 27 deletions.
25 changes: 24 additions & 1 deletion llvm/include/llvm/IR/DIBuilder.h
Expand Up @@ -521,6 +521,15 @@ namespace llvm {
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.
Expand Down Expand Up @@ -599,6 +608,21 @@ namespace llvm {
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,
Expand Down Expand Up @@ -731,7 +755,6 @@ namespace llvm {
Instruction *insertDbgValueIntrinsic(llvm::Value *Val, uint64_t Offset,
DIVariable VarInfo,
Instruction *InsertBefore);

};
} // end namespace llvm

Expand Down
118 changes: 92 additions & 26 deletions llvm/lib/IR/DIBuilder.cpp
Expand Up @@ -1012,15 +1012,12 @@ DIGlobalVariable DIBuilder::createGlobalVariable(StringRef Name, DIFile F,
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)),
Expand All @@ -1032,13 +1029,47 @@ DIGlobalVariable DIBuilder::createStaticVariable(DIDescriptor Context,
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.
Expand Down Expand Up @@ -1139,14 +1170,13 @@ DISubprogram DIBuilder::createFunction(DIScopeRef Context, StringRef Name,
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) };
Expand All @@ -1172,17 +1202,53 @@ DISubprogram DIBuilder::createFunction(DIDescriptor Context, StringRef Name,
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,
Expand Down

0 comments on commit 5e6bc9e

Please sign in to comment.