mirror of
https://github.com/RPCS3/llvm.git
synced 2025-03-05 17:18:55 +00:00
DebugInfo: Gut DISubprogram and DILexicalBlock*
Gut the `DIDescriptor` wrappers around `MDLocalScope` subclasses. Note that `DILexicalBlock` wraps `MDLexicalBlockBase`, not `MDLexicalBlock`. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@234850 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
89d640a824
commit
125e3d3959
@ -425,98 +425,43 @@ public:
|
||||
unsigned getEmissionKind() const { return get()->getEmissionKind(); }
|
||||
};
|
||||
|
||||
/// \brief This is a wrapper for a subprogram (e.g. a function).
|
||||
class DISubprogram : public DIScope {
|
||||
class DISubprogram {
|
||||
MDSubprogram *N;
|
||||
|
||||
public:
|
||||
DISubprogram() = default;
|
||||
DISubprogram(const MDSubprogram *N) : DIScope(N) {}
|
||||
DISubprogram(const MDSubprogram *N = nullptr)
|
||||
: N(const_cast<MDSubprogram *>(N)) {}
|
||||
|
||||
MDSubprogram *get() const {
|
||||
return cast_or_null<MDSubprogram>(DIDescriptor::get());
|
||||
}
|
||||
operator MDSubprogram *() const { return get(); }
|
||||
MDSubprogram *operator->() const { return get(); }
|
||||
MDSubprogram &operator*() const { return *get(); }
|
||||
|
||||
StringRef getName() const { return get()->getName(); }
|
||||
StringRef getDisplayName() const { return get()->getDisplayName(); }
|
||||
StringRef getLinkageName() const { return get()->getLinkageName(); }
|
||||
unsigned getLineNumber() const { return get()->getLine(); }
|
||||
|
||||
/// \brief Check if this is local (like 'static' in C).
|
||||
unsigned isLocalToUnit() const { return get()->isLocalToUnit(); }
|
||||
unsigned isDefinition() const { return get()->isDefinition(); }
|
||||
|
||||
unsigned getVirtuality() const { return get()->getVirtuality(); }
|
||||
unsigned getVirtualIndex() const { return get()->getVirtualIndex(); }
|
||||
|
||||
unsigned getFlags() const { return get()->getFlags(); }
|
||||
|
||||
unsigned isOptimized() const { return get()->isOptimized(); }
|
||||
|
||||
/// \brief Get the beginning of the scope of the function (not the name).
|
||||
unsigned getScopeLineNumber() const { return get()->getScopeLine(); }
|
||||
|
||||
DIScopeRef getContext() const { return get()->getScope(); }
|
||||
DISubroutineType getType() const { return get()->getType(); }
|
||||
|
||||
DITypeRef getContainingType() const { return get()->getContainingType(); }
|
||||
|
||||
/// \brief Check if this provides debugging information for the function F.
|
||||
bool describes(const Function *F) const { return get()->describes(F); }
|
||||
|
||||
Function *getFunction() const { return get()->getFunction(); }
|
||||
|
||||
void replaceFunction(Function *F) { get()->replaceFunction(F); }
|
||||
DIArray getTemplateParams() const { return get()->getTemplateParams(); }
|
||||
DISubprogram getFunctionDeclaration() const {
|
||||
return get()->getDeclaration();
|
||||
}
|
||||
DIArray getVariables() const { return DIArray(get()->getVariables()); }
|
||||
|
||||
unsigned isArtificial() const { return get()->isArtificial(); }
|
||||
bool isPrivate() const { return get()->isPrivate(); }
|
||||
bool isProtected() const { return get()->isProtected(); }
|
||||
bool isPublic() const { return get()->isPublic(); }
|
||||
bool isExplicit() const { return get()->isExplicit(); }
|
||||
bool isPrototyped() const { return get()->isPrototyped(); }
|
||||
unsigned isLValueReference() const { return get()->isLValueReference(); }
|
||||
unsigned isRValueReference() const { return get()->isRValueReference(); }
|
||||
operator DIDescriptor() const { return N; }
|
||||
operator MDSubprogram *() const { return N; }
|
||||
MDSubprogram *operator->() const { return N; }
|
||||
MDSubprogram &operator*() const { return *N; }
|
||||
};
|
||||
|
||||
/// \brief This is a wrapper for a lexical block.
|
||||
class DILexicalBlock : public DIScope {
|
||||
class DILexicalBlock {
|
||||
MDLexicalBlockBase *N;
|
||||
|
||||
public:
|
||||
DILexicalBlock() = default;
|
||||
DILexicalBlock(const MDLexicalBlockBase *N) : DIScope(N) {}
|
||||
DILexicalBlock(const MDLexicalBlockBase *N = nullptr)
|
||||
: N(const_cast<MDLexicalBlockBase *>(N)) {}
|
||||
|
||||
MDLexicalBlockBase *get() const {
|
||||
return cast_or_null<MDLexicalBlockBase>(DIDescriptor::get());
|
||||
}
|
||||
operator MDLexicalBlockBase *() const { return get(); }
|
||||
MDLexicalBlockBase *operator->() const { return get(); }
|
||||
MDLexicalBlockBase &operator*() const { return *get(); }
|
||||
|
||||
DIScope getContext() const { return get()->getScope(); }
|
||||
unsigned getLineNumber() const { return get()->getLine(); }
|
||||
unsigned getColumnNumber() const { return get()->getColumn(); }
|
||||
operator DIDescriptor() const { return N; }
|
||||
operator MDLexicalBlockBase *() const { return N; }
|
||||
MDLexicalBlockBase *operator->() const { return N; }
|
||||
MDLexicalBlockBase &operator*() const { return *N; }
|
||||
};
|
||||
|
||||
/// \brief This is a wrapper for a lexical block with a filename change.
|
||||
class DILexicalBlockFile : public DIScope {
|
||||
class DILexicalBlockFile {
|
||||
MDLexicalBlockFile *N;
|
||||
|
||||
public:
|
||||
DILexicalBlockFile() = default;
|
||||
DILexicalBlockFile(const MDLexicalBlockFile *N) : DIScope(N) {}
|
||||
DILexicalBlockFile(const MDLexicalBlockFile *N = nullptr)
|
||||
: N(const_cast<MDLexicalBlockFile *>(N)) {}
|
||||
|
||||
MDLexicalBlockFile *get() const {
|
||||
return cast_or_null<MDLexicalBlockFile>(DIDescriptor::get());
|
||||
}
|
||||
operator MDLexicalBlockFile *() const { return get(); }
|
||||
MDLexicalBlockFile *operator->() const { return get(); }
|
||||
MDLexicalBlockFile &operator*() const { return *get(); }
|
||||
|
||||
DIScope getContext() const { return get()->getScope(); }
|
||||
unsigned getDiscriminator() const { return get()->getDiscriminator(); }
|
||||
operator DIDescriptor() const { return N; }
|
||||
operator MDLexicalBlockFile *() const { return N; }
|
||||
MDLexicalBlockFile *operator->() const { return N; }
|
||||
MDLexicalBlockFile &operator*() const { return *N; }
|
||||
};
|
||||
|
||||
class DINameSpace {
|
||||
|
@ -82,11 +82,11 @@ void ModuleDebugInfoPrinter::print(raw_ostream &O, const Module *M) const {
|
||||
O << '\n';
|
||||
}
|
||||
|
||||
for (DISubprogram S : Finder.subprograms()) {
|
||||
O << "Subprogram: " << S.getName();
|
||||
printFile(O, S.getFilename(), S.getDirectory(), S.getLineNumber());
|
||||
if (!S.getLinkageName().empty())
|
||||
O << " ('" << S.getLinkageName() << "')";
|
||||
for (MDSubprogram *S : Finder.subprograms()) {
|
||||
O << "Subprogram: " << S->getName();
|
||||
printFile(O, S->getFilename(), S->getDirectory(), S->getLine());
|
||||
if (!S->getLinkageName().empty())
|
||||
O << " ('" << S->getLinkageName() << "')";
|
||||
O << '\n';
|
||||
}
|
||||
|
||||
|
@ -671,8 +671,8 @@ static bool emitDebugValueComment(const MachineInstr *MI, AsmPrinter &AP) {
|
||||
OS << "DEBUG_VALUE: ";
|
||||
|
||||
DIVariable V = MI->getDebugVariable();
|
||||
if (DISubprogram SP = dyn_cast<MDSubprogram>(V->getScope())) {
|
||||
StringRef Name = SP.getDisplayName();
|
||||
if (auto *SP = dyn_cast<MDSubprogram>(V->getScope())) {
|
||||
StringRef Name = SP->getDisplayName();
|
||||
if (!Name.empty())
|
||||
OS << Name << ":";
|
||||
}
|
||||
|
@ -568,7 +568,7 @@ void DwarfCompileUnit::constructSubprogramScopeDIE(LexicalScope *Scope) {
|
||||
DIE &ScopeDIE = updateSubprogramScopeDIE(Sub);
|
||||
|
||||
// If this is a variadic function, add an unspecified parameter.
|
||||
DITypeArray FnArgs = Sub.getType().getTypeArray();
|
||||
DITypeArray FnArgs = Sub->getType()->getTypeArray();
|
||||
|
||||
// Collect lexical scope children first.
|
||||
// ObjectPointer might be a local (non-argument) local variable if it's a
|
||||
@ -613,11 +613,11 @@ DwarfCompileUnit::constructAbstractSubprogramScopeDIE(LexicalScope *Scope) {
|
||||
// the important distinction that the DIDescriptor is not associated with the
|
||||
// DIE (since the DIDescriptor will be associated with the concrete DIE, if
|
||||
// any). It could be refactored to some common utility function.
|
||||
else if (DISubprogram SPDecl = SP.getFunctionDeclaration()) {
|
||||
else if (auto *SPDecl = SP->getDeclaration()) {
|
||||
ContextDIE = &getUnitDie();
|
||||
getOrCreateSubprogramDIE(SPDecl);
|
||||
} else
|
||||
ContextDIE = getOrCreateContextDIE(resolve(SP.getContext()));
|
||||
ContextDIE = getOrCreateContextDIE(resolve(SP->getScope()));
|
||||
|
||||
// Passing null as the associated DIDescriptor because the abstract definition
|
||||
// shouldn't be found by lookup.
|
||||
@ -677,7 +677,7 @@ void DwarfCompileUnit::finishSubprogramDefinition(DISubprogram SP) {
|
||||
}
|
||||
void DwarfCompileUnit::collectDeadVariables(DISubprogram SP) {
|
||||
assert(SP && "CU's subprogram list contains a non-subprogram");
|
||||
assert(SP.isDefinition() &&
|
||||
assert(SP->isDefinition() &&
|
||||
"CU's subprogram list contains a subprogram declaration");
|
||||
auto Variables = SP->getVariables();
|
||||
if (Variables.size() == 0)
|
||||
@ -807,10 +807,10 @@ void DwarfCompileUnit::addExpr(DIELoc &Die, dwarf::Form Form,
|
||||
|
||||
void DwarfCompileUnit::applySubprogramAttributesToDefinition(DISubprogram SP,
|
||||
DIE &SPDie) {
|
||||
DISubprogram SPDecl = SP.getFunctionDeclaration();
|
||||
DIScope Context = resolve(SPDecl ? SPDecl.getContext() : SP.getContext());
|
||||
auto *SPDecl = SP->getDeclaration();
|
||||
DIScope Context = resolve(SPDecl ? SPDecl->getScope() : SP->getScope());
|
||||
applySubprogramAttributes(SP, SPDie, includeMinimalInlineScopes());
|
||||
addGlobalName(SP.getName(), SPDie, Context);
|
||||
addGlobalName(SP->getName(), SPDie, Context);
|
||||
}
|
||||
|
||||
bool DwarfCompileUnit::isDwoUnit() const {
|
||||
|
@ -277,25 +277,25 @@ static StringRef getObjCMethodName(StringRef In) {
|
||||
// that do not have a DW_AT_name or DW_AT_linkage_name field - this
|
||||
// is only slightly different than the lookup of non-standard ObjC names.
|
||||
void DwarfDebug::addSubprogramNames(DISubprogram SP, DIE &Die) {
|
||||
if (!SP.isDefinition())
|
||||
if (!SP->isDefinition())
|
||||
return;
|
||||
addAccelName(SP.getName(), Die);
|
||||
addAccelName(SP->getName(), Die);
|
||||
|
||||
// If the linkage name is different than the name, go ahead and output
|
||||
// that as well into the name table.
|
||||
if (SP.getLinkageName() != "" && SP.getName() != SP.getLinkageName())
|
||||
addAccelName(SP.getLinkageName(), Die);
|
||||
if (SP->getLinkageName() != "" && SP->getName() != SP->getLinkageName())
|
||||
addAccelName(SP->getLinkageName(), Die);
|
||||
|
||||
// If this is an Objective-C selector name add it to the ObjC accelerator
|
||||
// too.
|
||||
if (isObjCClass(SP.getName())) {
|
||||
if (isObjCClass(SP->getName())) {
|
||||
StringRef Class, Category;
|
||||
getObjCClassCategory(SP.getName(), Class, Category);
|
||||
getObjCClassCategory(SP->getName(), Class, Category);
|
||||
addAccelObjC(Class, Die);
|
||||
if (Category != "")
|
||||
addAccelObjC(Category, Die);
|
||||
// Also add the base method name to the name table.
|
||||
addAccelName(getObjCMethodName(SP.getName()), Die);
|
||||
addAccelName(getObjCMethodName(SP->getName()), Die);
|
||||
}
|
||||
}
|
||||
|
||||
@ -1129,7 +1129,7 @@ void DwarfDebug::beginFunction(const MachineFunction *MF) {
|
||||
// label, so arguments are visible when breaking at function entry.
|
||||
DIVariable DIVar = Ranges.front().first->getDebugVariable();
|
||||
if (DIVar->getTag() == dwarf::DW_TAG_arg_variable &&
|
||||
getDISubprogram(DIVar->getScope()).describes(MF->getFunction())) {
|
||||
getDISubprogram(DIVar->getScope())->describes(MF->getFunction())) {
|
||||
LabelsBeforeInsn[Ranges.front().first] = Asm->getFunctionBegin();
|
||||
if (Ranges.front().first->getDebugExpression()->isBitPiece()) {
|
||||
// Mark all non-overlapping initial pieces.
|
||||
@ -1255,8 +1255,8 @@ void DwarfDebug::recordSourceLine(unsigned Line, unsigned Col, const MDNode *S,
|
||||
if (DIScope Scope = cast_or_null<MDScope>(S)) {
|
||||
Fn = Scope.getFilename();
|
||||
Dir = Scope.getDirectory();
|
||||
if (DILexicalBlockFile LBF = dyn_cast<MDLexicalBlockFile>(Scope))
|
||||
Discriminator = LBF.getDiscriminator();
|
||||
if (auto *LBF = dyn_cast<MDLexicalBlockFile>(Scope))
|
||||
Discriminator = LBF->getDiscriminator();
|
||||
|
||||
unsigned CUID = Asm->OutStreamer.getContext().getDwarfCompileUnitID();
|
||||
Src = static_cast<DwarfCompileUnit &>(*InfoHolder.getUnits()[CUID])
|
||||
|
@ -416,7 +416,7 @@ void DwarfUnit::addSourceLine(DIE &Die, DIGlobalVariable G) {
|
||||
void DwarfUnit::addSourceLine(DIE &Die, DISubprogram SP) {
|
||||
assert(SP);
|
||||
|
||||
addSourceLine(Die, SP.getLineNumber(), SP.getFilename(), SP.getDirectory());
|
||||
addSourceLine(Die, SP->getLine(), SP->getFilename(), SP->getDirectory());
|
||||
}
|
||||
|
||||
/// addSourceLine - Add location information to specified debug information
|
||||
@ -1213,12 +1213,12 @@ DIE *DwarfUnit::getOrCreateSubprogramDIE(DISubprogram SP, bool Minimal) {
|
||||
// such construction creates the DIE (as is the case for member function
|
||||
// declarations).
|
||||
DIE *ContextDIE =
|
||||
Minimal ? &getUnitDie() : getOrCreateContextDIE(resolve(SP.getContext()));
|
||||
Minimal ? &getUnitDie() : getOrCreateContextDIE(resolve(SP->getScope()));
|
||||
|
||||
if (DIE *SPDie = getDIE(SP))
|
||||
return SPDie;
|
||||
|
||||
if (DISubprogram SPDecl = SP.getFunctionDeclaration()) {
|
||||
if (auto *SPDecl = SP->getDeclaration()) {
|
||||
if (!Minimal) {
|
||||
// Add subprogram definitions to the CU die directly.
|
||||
ContextDIE = &getUnitDie();
|
||||
@ -1232,7 +1232,7 @@ DIE *DwarfUnit::getOrCreateSubprogramDIE(DISubprogram SP, bool Minimal) {
|
||||
|
||||
// Stop here and fill this in later, depending on whether or not this
|
||||
// subprogram turns out to have inlined instances or not.
|
||||
if (SP.isDefinition())
|
||||
if (SP->isDefinition())
|
||||
return &SPDie;
|
||||
|
||||
applySubprogramAttributes(SP, SPDie);
|
||||
@ -1243,19 +1243,19 @@ bool DwarfUnit::applySubprogramDefinitionAttributes(DISubprogram SP,
|
||||
DIE &SPDie) {
|
||||
DIE *DeclDie = nullptr;
|
||||
StringRef DeclLinkageName;
|
||||
if (DISubprogram SPDecl = SP.getFunctionDeclaration()) {
|
||||
if (auto *SPDecl = SP->getDeclaration()) {
|
||||
DeclDie = getDIE(SPDecl);
|
||||
assert(DeclDie && "This DIE should've already been constructed when the "
|
||||
"definition DIE was created in "
|
||||
"getOrCreateSubprogramDIE");
|
||||
DeclLinkageName = SPDecl.getLinkageName();
|
||||
DeclLinkageName = SPDecl->getLinkageName();
|
||||
}
|
||||
|
||||
// Add function template parameters.
|
||||
addTemplateParams(SPDie, SP.getTemplateParams());
|
||||
addTemplateParams(SPDie, SP->getTemplateParams());
|
||||
|
||||
// Add the linkage name if we have one and it isn't in the Decl.
|
||||
StringRef LinkageName = SP.getLinkageName();
|
||||
StringRef LinkageName = SP->getLinkageName();
|
||||
assert(((LinkageName.empty() || DeclLinkageName.empty()) ||
|
||||
LinkageName == DeclLinkageName) &&
|
||||
"decl has a linkage name and it is different");
|
||||
@ -1278,8 +1278,8 @@ void DwarfUnit::applySubprogramAttributes(DISubprogram SP, DIE &SPDie,
|
||||
return;
|
||||
|
||||
// Constructors and operators for anonymous aggregates do not have names.
|
||||
if (!SP.getName().empty())
|
||||
addString(SPDie, dwarf::DW_AT_name, SP.getName());
|
||||
if (!SP->getName().empty())
|
||||
addString(SPDie, dwarf::DW_AT_name, SP->getName());
|
||||
|
||||
// Skip the rest of the attributes under -gmlt to save space.
|
||||
if (Minimal)
|
||||
@ -1290,12 +1290,12 @@ void DwarfUnit::applySubprogramAttributes(DISubprogram SP, DIE &SPDie,
|
||||
// Add the prototype if we have a prototype and we have a C like
|
||||
// language.
|
||||
uint16_t Language = getLanguage();
|
||||
if (SP.isPrototyped() &&
|
||||
if (SP->isPrototyped() &&
|
||||
(Language == dwarf::DW_LANG_C89 || Language == dwarf::DW_LANG_C99 ||
|
||||
Language == dwarf::DW_LANG_ObjC))
|
||||
addFlag(SPDie, dwarf::DW_AT_prototyped);
|
||||
|
||||
DISubroutineType SPTy = SP.getType();
|
||||
DISubroutineType SPTy = SP->getType();
|
||||
assert(SPTy.getTag() == dwarf::DW_TAG_subroutine_type &&
|
||||
"the type of a subprogram should be a subroutine");
|
||||
|
||||
@ -1306,18 +1306,18 @@ void DwarfUnit::applySubprogramAttributes(DISubprogram SP, DIE &SPDie,
|
||||
if (auto Ty = resolve(Args[0]))
|
||||
addType(SPDie, Ty);
|
||||
|
||||
unsigned VK = SP.getVirtuality();
|
||||
unsigned VK = SP->getVirtuality();
|
||||
if (VK) {
|
||||
addUInt(SPDie, dwarf::DW_AT_virtuality, dwarf::DW_FORM_data1, VK);
|
||||
DIELoc *Block = getDIELoc();
|
||||
addUInt(*Block, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
|
||||
addUInt(*Block, dwarf::DW_FORM_udata, SP.getVirtualIndex());
|
||||
addUInt(*Block, dwarf::DW_FORM_udata, SP->getVirtualIndex());
|
||||
addBlock(SPDie, dwarf::DW_AT_vtable_elem_location, Block);
|
||||
ContainingTypeMap.insert(
|
||||
std::make_pair(&SPDie, resolve(SP.getContainingType())));
|
||||
std::make_pair(&SPDie, resolve(SP->getContainingType())));
|
||||
}
|
||||
|
||||
if (!SP.isDefinition()) {
|
||||
if (!SP->isDefinition()) {
|
||||
addFlag(SPDie, dwarf::DW_AT_declaration);
|
||||
|
||||
// Add arguments. Do not add arguments for subprogram definition. They will
|
||||
@ -1325,35 +1325,35 @@ void DwarfUnit::applySubprogramAttributes(DISubprogram SP, DIE &SPDie,
|
||||
constructSubprogramArguments(SPDie, Args);
|
||||
}
|
||||
|
||||
if (SP.isArtificial())
|
||||
if (SP->isArtificial())
|
||||
addFlag(SPDie, dwarf::DW_AT_artificial);
|
||||
|
||||
if (!SP.isLocalToUnit())
|
||||
if (!SP->isLocalToUnit())
|
||||
addFlag(SPDie, dwarf::DW_AT_external);
|
||||
|
||||
if (SP.isOptimized())
|
||||
if (SP->isOptimized())
|
||||
addFlag(SPDie, dwarf::DW_AT_APPLE_optimized);
|
||||
|
||||
if (unsigned isa = Asm->getISAEncoding())
|
||||
addUInt(SPDie, dwarf::DW_AT_APPLE_isa, dwarf::DW_FORM_flag, isa);
|
||||
|
||||
if (SP.isLValueReference())
|
||||
if (SP->isLValueReference())
|
||||
addFlag(SPDie, dwarf::DW_AT_reference);
|
||||
|
||||
if (SP.isRValueReference())
|
||||
if (SP->isRValueReference())
|
||||
addFlag(SPDie, dwarf::DW_AT_rvalue_reference);
|
||||
|
||||
if (SP.isProtected())
|
||||
if (SP->isProtected())
|
||||
addUInt(SPDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
|
||||
dwarf::DW_ACCESS_protected);
|
||||
else if (SP.isPrivate())
|
||||
else if (SP->isPrivate())
|
||||
addUInt(SPDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
|
||||
dwarf::DW_ACCESS_private);
|
||||
else if (SP.isPublic())
|
||||
else if (SP->isPublic())
|
||||
addUInt(SPDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
|
||||
dwarf::DW_ACCESS_public);
|
||||
|
||||
if (SP.isExplicit())
|
||||
if (SP->isExplicit())
|
||||
addFlag(SPDie, dwarf::DW_AT_explicit);
|
||||
}
|
||||
|
||||
|
@ -192,7 +192,7 @@ void WinCodeViewLineTables::emitDebugInfoForFunction(const Function *GV) {
|
||||
StringRef GVName = GV->getName();
|
||||
StringRef FuncName;
|
||||
if (DISubprogram SP = getDISubprogram(GV))
|
||||
FuncName = SP.getDisplayName();
|
||||
FuncName = SP->getDisplayName();
|
||||
|
||||
// FIXME Clang currently sets DisplayName to "bar" for a C++
|
||||
// "namespace_foo::bar" function, see PR21528. Luckily, dbghelp.dll is trying
|
||||
|
@ -157,8 +157,7 @@ LexicalScopes::getOrCreateRegularScope(const MDLocalScope *Scope) {
|
||||
false)).first;
|
||||
|
||||
if (!Parent) {
|
||||
assert(
|
||||
DISubprogram(cast<MDSubprogram>(Scope)).describes(MF->getFunction()));
|
||||
assert(cast<MDSubprogram>(Scope)->describes(MF->getFunction()));
|
||||
assert(!CurrentFnLexicalScope);
|
||||
CurrentFnLexicalScope = &I->second;
|
||||
}
|
||||
|
@ -93,7 +93,7 @@ void DIBuilder::finalize() {
|
||||
TempSubprograms->replaceAllUsesWith(SPs.get());
|
||||
for (unsigned i = 0, e = SPs.size(); i != e; ++i) {
|
||||
DISubprogram SP = cast<MDSubprogram>(SPs[i]);
|
||||
if (MDTuple *Temp = SP.getVariables().get()) {
|
||||
if (MDTuple *Temp = SP->getVariables().get()) {
|
||||
const auto &PV = PreservedVariables.lookup(SP);
|
||||
SmallVector<Metadata *, 4> Variables(PV.begin(), PV.end());
|
||||
DIArray AV = getOrCreateArray(Variables);
|
||||
|
@ -74,7 +74,7 @@ DISubprogram llvm::getDISubprogram(const Function *F) {
|
||||
DebugLoc DLoc = Inst->getDebugLoc();
|
||||
const MDNode *Scope = DLoc.getInlinedAtScope();
|
||||
DISubprogram Subprogram = getDISubprogram(Scope);
|
||||
return Subprogram.describes(F) ? Subprogram : DISubprogram();
|
||||
return Subprogram->describes(F) ? Subprogram : DISubprogram();
|
||||
}
|
||||
|
||||
return DISubprogram();
|
||||
@ -222,8 +222,8 @@ void DebugInfoFinder::processScope(DIScope Scope) {
|
||||
}
|
||||
if (!addScope(Scope))
|
||||
return;
|
||||
if (DILexicalBlock LB = dyn_cast<MDLexicalBlockBase>(Scope)) {
|
||||
processScope(LB.getContext());
|
||||
if (auto *LB = dyn_cast<MDLexicalBlockBase>(Scope)) {
|
||||
processScope(LB->getScope());
|
||||
} else if (auto *NS = dyn_cast<MDNamespace>(Scope)) {
|
||||
processScope(NS->getScope());
|
||||
}
|
||||
@ -232,9 +232,9 @@ void DebugInfoFinder::processScope(DIScope Scope) {
|
||||
void DebugInfoFinder::processSubprogram(DISubprogram SP) {
|
||||
if (!addSubprogram(SP))
|
||||
return;
|
||||
processScope(SP.getContext().resolve(TypeIdentifierMap));
|
||||
processType(SP.getType());
|
||||
for (auto *Element : SP.getTemplateParams()) {
|
||||
processScope(SP->getScope().resolve(TypeIdentifierMap));
|
||||
processType(SP->getType());
|
||||
for (auto *Element : SP->getTemplateParams()) {
|
||||
if (auto *TType = dyn_cast<MDTemplateTypeParameter>(Element)) {
|
||||
processType(TType->getType().resolve(TypeIdentifierMap));
|
||||
} else if (auto *TVal = dyn_cast<MDTemplateValueParameter>(Element)) {
|
||||
@ -434,7 +434,7 @@ llvm::makeSubprogramMap(const Module &M) {
|
||||
for (MDNode *N : CU_Nodes->operands()) {
|
||||
DICompileUnit CUNode = cast<MDCompileUnit>(N);
|
||||
for (DISubprogram SP : CUNode->getSubprograms()) {
|
||||
if (Function *F = SP.getFunction())
|
||||
if (Function *F = SP->getFunction())
|
||||
R.insert(std::make_pair(F, SP));
|
||||
}
|
||||
}
|
||||
|
@ -51,7 +51,7 @@ DebugLoc DebugLoc::getFnDebugLoc() const {
|
||||
// FIXME: Add a method on \a MDLocation that does this work.
|
||||
const MDNode *Scope = getInlinedAtScope();
|
||||
if (DISubprogram SP = getDISubprogram(Scope))
|
||||
return DebugLoc::get(SP.getScopeLineNumber(), 0, SP);
|
||||
return DebugLoc::get(SP->getScopeLine(), 0, SP);
|
||||
|
||||
return DebugLoc();
|
||||
}
|
||||
|
@ -991,7 +991,7 @@ void Verifier::visitMDSubprogram(const MDSubprogram &N) {
|
||||
continue;
|
||||
|
||||
// FIXME: Once N is canonical, check "SP == &N".
|
||||
Assert(DISubprogram(SP).describes(F),
|
||||
Assert(SP->describes(F),
|
||||
"!dbg attachment points at wrong subprogram for function", &N, F,
|
||||
&I, DL, Scope, SP);
|
||||
}
|
||||
|
@ -1272,12 +1272,8 @@ void ModuleLinker::stripReplacedSubprograms() {
|
||||
DICompileUnit CU = cast<MDCompileUnit>(CompileUnits->getOperand(I));
|
||||
assert(CU && "Expected valid compile unit");
|
||||
|
||||
MDSubprogramArray SPs(CU.getSubprograms());
|
||||
assert(SPs && "Expected valid subprogram array");
|
||||
|
||||
for (unsigned S = 0, SE = SPs.size(); S != SE; ++S) {
|
||||
DISubprogram SP = SPs[S];
|
||||
if (!SP || !SP.getFunction() || !Functions.count(SP.getFunction()))
|
||||
for (MDSubprogram *SP : CU->getSubprograms()) {
|
||||
if (!SP || !SP->getFunction() || !Functions.count(SP->getFunction()))
|
||||
continue;
|
||||
|
||||
// Prevent DebugInfoFinder from tagging this as the canonical subprogram,
|
||||
|
@ -788,9 +788,9 @@ void NVPTXAsmPrinter::recordAndEmitFilenames(Module &M) {
|
||||
++i;
|
||||
}
|
||||
|
||||
for (DISubprogram SP : DbgFinder.subprograms()) {
|
||||
StringRef Filename(SP.getFilename());
|
||||
StringRef Dirname(SP.getDirectory());
|
||||
for (MDSubprogram *SP : DbgFinder.subprograms()) {
|
||||
StringRef Filename = SP->getFilename();
|
||||
StringRef Dirname = SP->getDirectory();
|
||||
SmallString<128> FullPathName = Dirname;
|
||||
if (!Dirname.empty() && !sys::path::is_absolute(Filename)) {
|
||||
sys::path::append(FullPathName, Filename);
|
||||
|
@ -706,7 +706,7 @@ CallGraphNode *ArgPromotion::DoPromotion(Function *F,
|
||||
auto DI = FunctionDIs.find(F);
|
||||
if (DI != FunctionDIs.end()) {
|
||||
DISubprogram SP = DI->second;
|
||||
SP.replaceFunction(NF);
|
||||
SP->replaceFunction(NF);
|
||||
// Ensure the map is updated so it can be reused on subsequent argument
|
||||
// promotions of the same function.
|
||||
FunctionDIs.erase(DI);
|
||||
|
@ -304,7 +304,7 @@ bool DAE::DeleteDeadVarargs(Function &Fn) {
|
||||
auto DI = FunctionDIs.find(&Fn);
|
||||
if (DI != FunctionDIs.end()) {
|
||||
DISubprogram SP = DI->second;
|
||||
SP.replaceFunction(NF);
|
||||
SP->replaceFunction(NF);
|
||||
// Ensure the map is updated so it can be reused on non-varargs argument
|
||||
// eliminations of the same function.
|
||||
FunctionDIs.erase(DI);
|
||||
@ -1092,7 +1092,7 @@ bool DAE::RemoveDeadStuffFromFunction(Function *F) {
|
||||
// Patch the pointer to LLVM function in debug info descriptor.
|
||||
auto DI = FunctionDIs.find(F);
|
||||
if (DI != FunctionDIs.end())
|
||||
DI->second.replaceFunction(NF);
|
||||
DI->second->replaceFunction(NF);
|
||||
|
||||
// Now that the old function is dead, delete it.
|
||||
F->eraseFromParent();
|
||||
|
@ -317,7 +317,7 @@ bool StripDeadDebugInfo::runOnModule(Module &M) {
|
||||
continue;
|
||||
|
||||
// If the function referenced by DISP is not null, the function is live.
|
||||
if (DISP.getFunction())
|
||||
if (DISP->getFunction())
|
||||
LiveSubprograms.push_back(DISP);
|
||||
else
|
||||
SubprogramChange = true;
|
||||
|
@ -753,7 +753,7 @@ bool DataFlowSanitizer::runOnModule(Module &M) {
|
||||
// Patch the pointer to LLVM function in debug info descriptor.
|
||||
auto DI = FunctionDIs.find(&F);
|
||||
if (DI != FunctionDIs.end())
|
||||
DI->second.replaceFunction(&F);
|
||||
DI->second->replaceFunction(&F);
|
||||
|
||||
UnwrappedFnMap[WrappedFnCst] = &F;
|
||||
*i = NewF;
|
||||
|
@ -149,10 +149,10 @@ ModulePass *llvm::createGCOVProfilerPass(const GCOVOptions &Options) {
|
||||
return new GCOVProfiler(Options);
|
||||
}
|
||||
|
||||
static StringRef getFunctionName(DISubprogram SP) {
|
||||
if (!SP.getLinkageName().empty())
|
||||
return SP.getLinkageName();
|
||||
return SP.getName();
|
||||
static StringRef getFunctionName(MDSubprogram *SP) {
|
||||
if (!SP->getLinkageName().empty())
|
||||
return SP->getLinkageName();
|
||||
return SP->getName();
|
||||
}
|
||||
|
||||
namespace {
|
||||
@ -315,7 +315,7 @@ namespace {
|
||||
ReturnBlock(1, os) {
|
||||
this->os = os;
|
||||
|
||||
Function *F = SP.getFunction();
|
||||
Function *F = SP->getFunction();
|
||||
DEBUG(dbgs() << "Function: " << getFunctionName(SP) << "\n");
|
||||
|
||||
uint32_t i = 0;
|
||||
@ -330,7 +330,7 @@ namespace {
|
||||
|
||||
std::string FunctionNameAndLine;
|
||||
raw_string_ostream FNLOS(FunctionNameAndLine);
|
||||
FNLOS << getFunctionName(SP) << SP.getLineNumber();
|
||||
FNLOS << getFunctionName(SP) << SP->getLine();
|
||||
FNLOS.flush();
|
||||
FuncChecksum = hash_value(FunctionNameAndLine);
|
||||
}
|
||||
@ -366,7 +366,7 @@ namespace {
|
||||
void writeOut() {
|
||||
writeBytes(FunctionTag, 4);
|
||||
uint32_t BlockLen = 1 + 1 + 1 + lengthOfGCOVString(getFunctionName(SP)) +
|
||||
1 + lengthOfGCOVString(SP.getFilename()) + 1;
|
||||
1 + lengthOfGCOVString(SP->getFilename()) + 1;
|
||||
if (UseCfgChecksum)
|
||||
++BlockLen;
|
||||
write(BlockLen);
|
||||
@ -375,8 +375,8 @@ namespace {
|
||||
if (UseCfgChecksum)
|
||||
write(CfgChecksum);
|
||||
writeGCOVString(getFunctionName(SP));
|
||||
writeGCOVString(SP.getFilename());
|
||||
write(SP.getLineNumber());
|
||||
writeGCOVString(SP->getFilename());
|
||||
write(SP->getLine());
|
||||
|
||||
// Emit count of blocks.
|
||||
writeBytes(BlockTag, 4);
|
||||
@ -493,8 +493,8 @@ void GCOVProfiler::emitProfileNotes() {
|
||||
std::string EdgeDestinations;
|
||||
|
||||
unsigned FunctionIdent = 0;
|
||||
for (DISubprogram SP : CU->getSubprograms()) {
|
||||
Function *F = SP.getFunction();
|
||||
for (auto *SP : CU->getSubprograms()) {
|
||||
Function *F = SP->getFunction();
|
||||
if (!F) continue;
|
||||
if (!functionHasLines(F)) continue;
|
||||
|
||||
@ -541,7 +541,7 @@ void GCOVProfiler::emitProfileNotes() {
|
||||
if (SP != getDISubprogram(Loc.getScope()))
|
||||
continue;
|
||||
|
||||
GCOVLines &Lines = Block.getFile(SP.getFilename());
|
||||
GCOVLines &Lines = Block.getFile(SP->getFilename());
|
||||
Lines.addLine(Loc.getLine());
|
||||
}
|
||||
}
|
||||
@ -572,8 +572,8 @@ bool GCOVProfiler::emitProfileArcs() {
|
||||
for (unsigned i = 0, e = CU_Nodes->getNumOperands(); i != e; ++i) {
|
||||
DICompileUnit CU = cast<MDCompileUnit>(CU_Nodes->getOperand(i));
|
||||
SmallVector<std::pair<GlobalVariable *, MDNode *>, 8> CountersBySP;
|
||||
for (DISubprogram SP : CU->getSubprograms()) {
|
||||
Function *F = SP.getFunction();
|
||||
for (auto *SP : CU->getSubprograms()) {
|
||||
Function *F = SP->getFunction();
|
||||
if (!F) continue;
|
||||
if (!functionHasLines(F)) continue;
|
||||
if (!Result) Result = true;
|
||||
@ -593,7 +593,7 @@ bool GCOVProfiler::emitProfileArcs() {
|
||||
GlobalValue::InternalLinkage,
|
||||
Constant::getNullValue(CounterTy),
|
||||
"__llvm_gcov_ctr");
|
||||
CountersBySP.push_back(std::make_pair(Counters, (MDNode*)SP));
|
||||
CountersBySP.push_back(std::make_pair(Counters, SP));
|
||||
|
||||
UniqueVector<BasicBlock *> ComplexEdgePreds;
|
||||
UniqueVector<BasicBlock *> ComplexEdgeSuccs;
|
||||
@ -854,7 +854,7 @@ Function *GCOVProfiler::insertCounterWriteout(
|
||||
Builder.CreateGlobalStringPtr(ReversedVersion),
|
||||
Builder.getInt32(CfgChecksum));
|
||||
for (unsigned j = 0, e = CountersBySP.size(); j != e; ++j) {
|
||||
DISubprogram SP = cast_or_null<MDSubprogram>(CountersBySP[j].second);
|
||||
auto *SP = cast_or_null<MDSubprogram>(CountersBySP[j].second);
|
||||
uint32_t FuncChecksum = Funcs.empty() ? 0 : Funcs[j]->getFuncChecksum();
|
||||
Builder.CreateCall5(
|
||||
EmitFunction, Builder.getInt32(j),
|
||||
|
@ -642,8 +642,8 @@ void SampleProfileLoader::propagateWeights(Function &F) {
|
||||
/// \returns the line number where \p F is defined. If it returns 0,
|
||||
/// it means that there is no debug information available for \p F.
|
||||
unsigned SampleProfileLoader::getFunctionLoc(Function &F) {
|
||||
if (DISubprogram S = getDISubprogram(&F))
|
||||
return S.getLineNumber();
|
||||
if (MDSubprogram *S = getDISubprogram(&F))
|
||||
return S->getLine();
|
||||
|
||||
// If could not find the start of \p F, emit a diagnostic to inform the user
|
||||
// about the missed opportunity.
|
||||
|
@ -157,7 +157,8 @@ void llvm::CloneFunctionInto(Function *NewFunc, const Function *OldFunc,
|
||||
// Find the MDNode which corresponds to the DISubprogram data that described F.
|
||||
static MDNode* FindSubprogram(const Function *F, DebugInfoFinder &Finder) {
|
||||
for (DISubprogram Subprogram : Finder.subprograms()) {
|
||||
if (Subprogram.describes(F)) return Subprogram;
|
||||
if (Subprogram->describes(F))
|
||||
return Subprogram;
|
||||
}
|
||||
return nullptr;
|
||||
}
|
||||
|
@ -53,11 +53,11 @@ struct BreakpointPrinter : public ModulePass {
|
||||
if (NamedMDNode *NMD = M.getNamedMetadata("llvm.dbg.sp"))
|
||||
for (unsigned i = 0, e = NMD->getNumOperands(); i != e; ++i) {
|
||||
std::string Name;
|
||||
DISubprogram SP = cast_or_null<MDSubprogram>(NMD->getOperand(i));
|
||||
auto *SP = cast_or_null<MDSubprogram>(NMD->getOperand(i));
|
||||
if (!SP)
|
||||
continue;
|
||||
getContextName(SP.getContext().resolve(TypeIdentifierMap), Name);
|
||||
Name = Name + SP.getDisplayName().str();
|
||||
getContextName(SP->getScope().resolve(TypeIdentifierMap), Name);
|
||||
Name = Name + SP->getDisplayName().str();
|
||||
if (!Name.empty() && Processed.insert(Name).second) {
|
||||
Out << Name << "\n";
|
||||
}
|
||||
|
@ -304,8 +304,9 @@ TEST_F(CloneFunc, Subprogram) {
|
||||
Iter++;
|
||||
DISubprogram Sub2 = cast<MDSubprogram>(*Iter);
|
||||
|
||||
EXPECT_TRUE((Sub1.getFunction() == OldFunc && Sub2.getFunction() == NewFunc)
|
||||
|| (Sub1.getFunction() == NewFunc && Sub2.getFunction() == OldFunc));
|
||||
EXPECT_TRUE(
|
||||
(Sub1->getFunction() == OldFunc && Sub2->getFunction() == NewFunc) ||
|
||||
(Sub1->getFunction() == NewFunc && Sub2->getFunction() == OldFunc));
|
||||
}
|
||||
|
||||
// Test that the new subprogram entry was not added to the CU which doesn't
|
||||
@ -347,10 +348,10 @@ TEST_F(CloneFunc, InstructionOwnership) {
|
||||
EXPECT_EQ(OldDL.getCol(), NewDL.getCol());
|
||||
|
||||
// But that they belong to different functions
|
||||
DISubprogram OldSubprogram = cast<MDSubprogram>(OldDL.getScope());
|
||||
DISubprogram NewSubprogram = cast<MDSubprogram>(NewDL.getScope());
|
||||
EXPECT_EQ(OldFunc, OldSubprogram.getFunction());
|
||||
EXPECT_EQ(NewFunc, NewSubprogram.getFunction());
|
||||
auto *OldSubprogram = cast<MDSubprogram>(OldDL.getScope());
|
||||
auto *NewSubprogram = cast<MDSubprogram>(NewDL.getScope());
|
||||
EXPECT_EQ(OldFunc, OldSubprogram->getFunction());
|
||||
EXPECT_EQ(NewFunc, NewSubprogram->getFunction());
|
||||
}
|
||||
|
||||
++OldIter;
|
||||
@ -384,25 +385,25 @@ TEST_F(CloneFunc, DebugIntrinsics) {
|
||||
getParent()->getParent());
|
||||
|
||||
// Old variable must belong to the old function
|
||||
EXPECT_EQ(OldFunc, DISubprogram(cast<MDSubprogram>(
|
||||
OldIntrin->getVariable()->getScope()))
|
||||
.getFunction());
|
||||
EXPECT_EQ(OldFunc,
|
||||
cast<MDSubprogram>(OldIntrin->getVariable()->getScope())
|
||||
->getFunction());
|
||||
// New variable must belong to the New function
|
||||
EXPECT_EQ(NewFunc, DISubprogram(cast<MDSubprogram>(
|
||||
NewIntrin->getVariable()->getScope()))
|
||||
.getFunction());
|
||||
EXPECT_EQ(NewFunc,
|
||||
cast<MDSubprogram>(NewIntrin->getVariable()->getScope())
|
||||
->getFunction());
|
||||
} else if (DbgValueInst* OldIntrin = dyn_cast<DbgValueInst>(&OldI)) {
|
||||
DbgValueInst* NewIntrin = dyn_cast<DbgValueInst>(&NewI);
|
||||
EXPECT_TRUE(NewIntrin);
|
||||
|
||||
// Old variable must belong to the old function
|
||||
EXPECT_EQ(OldFunc, DISubprogram(cast<MDSubprogram>(
|
||||
OldIntrin->getVariable()->getScope()))
|
||||
.getFunction());
|
||||
EXPECT_EQ(OldFunc,
|
||||
cast<MDSubprogram>(OldIntrin->getVariable()->getScope())
|
||||
->getFunction());
|
||||
// New variable must belong to the New function
|
||||
EXPECT_EQ(NewFunc, DISubprogram(cast<MDSubprogram>(
|
||||
NewIntrin->getVariable()->getScope()))
|
||||
.getFunction());
|
||||
EXPECT_EQ(NewFunc,
|
||||
cast<MDSubprogram>(NewIntrin->getVariable()->getScope())
|
||||
->getFunction());
|
||||
}
|
||||
|
||||
++OldIter;
|
||||
|
Loading…
x
Reference in New Issue
Block a user