本文整理汇总了C++中DISubprogram::isDefinition方法的典型用法代码示例。如果您正苦于以下问题:C++ DISubprogram::isDefinition方法的具体用法?C++ DISubprogram::isDefinition怎么用?C++ DISubprogram::isDefinition使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类DISubprogram
的用法示例。
在下文中一共展示了DISubprogram::isDefinition方法的1个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: CreateSubprogramFromFnDecl
/// CreateSubprogramFromFnDecl - Constructs the debug code for
/// entering a function - "llvm.dbg.func.start."
DISubprogram DebugInfo::CreateSubprogramFromFnDecl(tree FnDecl) {
DISubprogram SPDecl;
bool SPDeclIsSet = false;
// True if we're currently generating LLVM for this function.
bool definition = llvm_set_decl_p(FnDecl);
DIType FNType = getOrCreateType(TREE_TYPE(FnDecl));
std::map<tree_node *, WeakVH >::iterator I = SPCache.find(FnDecl);
if (I != SPCache.end()) {
SPDecl = DISubprogram(cast<MDNode>(I->second));
SPDeclIsSet = true;
// If we've already created the defining instance, OR this
// invocation won't create the defining instance, return what we
// already have.
if (SPDecl.isDefinition() || !definition)
return SPDecl;
}
bool ArtificialFnWithAbstractOrigin = false;
// If this artificial function has abstract origin then put this function
// at module scope. The abstract copy will be placed in appropriate region.
if (DECL_ARTIFICIAL (FnDecl)
&& DECL_ABSTRACT_ORIGIN (FnDecl)
&& DECL_ABSTRACT_ORIGIN (FnDecl) != FnDecl)
ArtificialFnWithAbstractOrigin = true;
DIDescriptor SPContext = ArtificialFnWithAbstractOrigin ?
getOrCreateFile(main_input_filename) :
findRegion (DECL_CONTEXT(FnDecl));
// Declare block_invoke functions at file scope for GDB.
if (BLOCK_SYNTHESIZED_FUNC(FnDecl))
SPContext = findRegion(NULL_TREE);
// Creating context may have triggered creation of this SP descriptor. So
// check the cache again.
if (!SPDeclIsSet) {
I = SPCache.find(FnDecl);
if (I != SPCache.end()) {
SPDecl = DISubprogram(cast<MDNode>(I->second));
DISubprogram SP =
DebugFactory.CreateSubprogramDefinition(SPDecl);
SPDecl.getNode()->replaceAllUsesWith(SP.getNode());
// Push function on region stack.
RegionStack.push_back(WeakVH(SP.getNode()));
RegionMap[FnDecl] = WeakVH(SP.getNode());
return SP;
}
}
// Gather location information.
expanded_location Loc = GetNodeLocation(FnDecl, false);
// If the name isn't public, omit the linkage name. Adding a
// linkage name to a class method can confuse GDB.
StringRef LinkageName = TREE_PUBLIC(FnDecl) ?
getLinkageName(FnDecl) : StringRef();
unsigned lineno = LOCATION_LINE(Loc);
if (isCopyOrDestroyHelper(FnDecl))
lineno = 0;
unsigned Virtuality = 0;
unsigned VIndex = 0;
DIType ContainingType;
if (DECL_VINDEX (FnDecl)) {
if (host_integerp (DECL_VINDEX (FnDecl), 0))
VIndex = tree_low_cst (DECL_VINDEX (FnDecl), 0);
Virtuality = dwarf::DW_VIRTUALITY_virtual;
ContainingType = getOrCreateType(DECL_CONTEXT (FnDecl));
}
StringRef FnName = getFunctionName(FnDecl);
// If the Function * hasn't been created yet, use a bogus value for
// the debug internal linkage bit.
bool hasInternalLinkage = true;
Function *Fn = 0;
if (GET_DECL_LLVM_INDEX(FnDecl)) {
Fn = cast<Function>DECL_LLVM(FnDecl);
if (Fn)
hasInternalLinkage = Fn->hasInternalLinkage();
}
DISubprogram SP =
DebugFactory.CreateSubprogram(SPContext,
FnName, FnName,
LinkageName,
getOrCreateFile(Loc.file), lineno,
FNType,
hasInternalLinkage,
definition,
Virtuality, VIndex, ContainingType,
DECL_ARTIFICIAL (FnDecl), optimize,
Fn);
SPCache[FnDecl] = WeakVH(SP.getNode());
RegionMap[FnDecl] = WeakVH(SP.getNode());
if (SPDeclIsSet && SPDecl.getNode() != SP.getNode())
SPDecl.getNode()->replaceAllUsesWith(SP.getNode());
return SP;
//.........这里部分代码省略.........