X-Git-Url: http://plrg.eecs.uci.edu/git/?a=blobdiff_plain;f=lib%2FIR%2FDebugInfo.cpp;h=f396721efec045617d36d33b5ac65a9dfbf08cd7;hb=ed0e117ff38559aba99eb7a02187e3bf07e55488;hp=70a6722568591129b69b732595f2ea3baa994c3a;hpb=8d8c981a1f20a5454a4abeffa64942aa0e94d0c5;p=oota-llvm.git diff --git a/lib/IR/DebugInfo.cpp b/lib/IR/DebugInfo.cpp index 70a67225685..f396721efec 100644 --- a/lib/IR/DebugInfo.cpp +++ b/lib/IR/DebugInfo.cpp @@ -33,162 +33,8 @@ using namespace llvm; using namespace llvm::dwarf; -/// \brief Return the size reported by the variable's type. -unsigned DIVariable::getSizeInBits(const DITypeIdentifierMap &Map) { - DIType Ty = getType().resolve(Map); - // Follow derived types until we reach a type that - // reports back a size. - while (isa(Ty) && !Ty.getSizeInBits()) { - DIDerivedType DT = cast(Ty); - Ty = DT.getTypeDerivedFrom().resolve(Map); - } - assert(Ty.getSizeInBits() && "type with size 0"); - return Ty.getSizeInBits(); -} - -//===----------------------------------------------------------------------===// -// Simple Descriptor Constructors and other Methods -//===----------------------------------------------------------------------===// - -void DIDescriptor::replaceAllUsesWith(LLVMContext &, DIDescriptor D) { - assert(DbgNode && "Trying to replace an unverified type!"); - assert(DbgNode->isTemporary() && "Expected temporary node"); - TempMDNode Temp(get()); - - // Since we use a TrackingVH for the node, its easy for clients to manufacture - // legitimate situations where they want to replaceAllUsesWith() on something - // which, due to uniquing, has merged with the source. We shield clients from - // this detail by allowing a value to be replaced with replaceAllUsesWith() - // itself. - if (Temp.get() == D.get()) { - DbgNode = MDNode::replaceWithUniqued(std::move(Temp)); - return; - } - - Temp->replaceAllUsesWith(D.get()); - DbgNode = D.get(); -} - -void DIDescriptor::replaceAllUsesWith(MDNode *D) { - assert(DbgNode && "Trying to replace an unverified type!"); - assert(DbgNode != D && "This replacement should always happen"); - assert(DbgNode->isTemporary() && "Expected temporary node"); - TempMDNode Node(get()); - Node->replaceAllUsesWith(D); -} - DIScopeRef DIScope::getRef() const { return MDScopeRef::get(get()); } -bool DIVariable::isInlinedFnArgument(const Function *CurFn) { - assert(CurFn && "Invalid function"); - DISubprogram SP = dyn_cast(getContext()); - if (!SP) - return false; - // This variable is not inlined function argument if its scope - // does not describe current function. - return !SP.describes(CurFn); -} - -Function *DISubprogram::getFunction() const { - if (auto *N = get()) - if (auto *C = dyn_cast_or_null(N->getFunction())) - return dyn_cast(C->getValue()); - return nullptr; -} - -bool DISubprogram::describes(const Function *F) { - assert(F && "Invalid function"); - if (F == getFunction()) - return true; - StringRef Name = getLinkageName(); - if (Name.empty()) - Name = getName(); - if (F->getName() == Name) - return true; - return false; -} - -GlobalVariable *DIGlobalVariable::getGlobal() const { - return dyn_cast_or_null(getConstant()); -} - -DIScopeRef DIScope::getContext() const { - if (DIType T = dyn_cast(*this)) - return T.getContext(); - - if (DISubprogram SP = dyn_cast(*this)) - return MDScopeRef(SP.getContext()); - - if (DILexicalBlock LB = dyn_cast(*this)) - return MDScopeRef(LB.getContext()); - - if (DINameSpace NS = dyn_cast(*this)) - return MDScopeRef(NS.getContext()); - - assert((isa(*this) || isa(*this)) && - "Unhandled type of scope."); - return MDScopeRef(); -} - -StringRef DIScope::getName() const { - if (DIType T = dyn_cast(*this)) - return T.getName(); - if (DISubprogram SP = dyn_cast(*this)) - return SP.getName(); - if (DINameSpace NS = dyn_cast(*this)) - return NS.getName(); - assert((isa(*this) || isa(*this) || - isa(*this)) && - "Unhandled type of scope."); - return StringRef(); -} - -StringRef DIScope::getFilename() const { - if (auto *N = get()) - if (auto *F = N->getFile()) - return F->getFilename(); - return ""; -} - -StringRef DIScope::getDirectory() const { - if (auto *N = get()) - if (auto *F = N->getFile()) - return F->getDirectory(); - return ""; -} - -void DICompileUnit::replaceSubprograms(DIArray Subprograms) { - get()->replaceSubprograms(MDSubprogramArray(Subprograms)); -} - -void DICompileUnit::replaceGlobalVariables(DIArray GlobalVariables) { - get()->replaceGlobalVariables(MDGlobalVariableArray(GlobalVariables)); -} - -DILocation DILocation::copyWithNewScope(LLVMContext &Ctx, - DILexicalBlockFile NewScope) { - assert(NewScope && "Expected valid scope"); - - const auto *Old = cast(DbgNode); - return DILocation(MDLocation::get(Ctx, Old->getLine(), Old->getColumn(), - NewScope, Old->getInlinedAt())); -} - -unsigned DILocation::computeNewDiscriminator(LLVMContext &Ctx) { - std::pair Key(getFilename().data(), getLineNumber()); - return ++Ctx.pImpl->DiscriminatorTable[Key]; -} - -DIVariable llvm::createInlinedVariable(MDNode *DV, MDNode *InlinedScope, - LLVMContext &VMContext) { - return cast(DV) - ->withInline(cast_or_null(InlinedScope)); -} - -DIVariable llvm::cleanseInlinedVariable(MDNode *DV, LLVMContext &VMContext) { - return cast(DV)->withoutInline(); -} - DISubprogram llvm::getDISubprogram(const MDNode *Scope) { if (auto *LocalScope = dyn_cast_or_null(Scope)) return LocalScope->getSubprogram(); @@ -206,7 +52,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(); @@ -232,8 +78,8 @@ DITypeIdentifierMap llvm::generateDITypeIdentifierMap(const NamedMDNode *CU_Nodes) { DITypeIdentifierMap Map; for (unsigned CUi = 0, CUe = CU_Nodes->getNumOperands(); CUi != CUe; ++CUi) { - DICompileUnit CU = cast(CU_Nodes->getOperand(CUi)); - DIArray Retain = CU.getRetainedTypes(); + auto *CU = cast(CU_Nodes->getOperand(CUi)); + DIArray Retain = CU->getRetainedTypes(); for (unsigned Ti = 0, Te = Retain.size(); Ti != Te; ++Ti) { if (!isa(Retain[Ti])) continue; @@ -284,8 +130,8 @@ void DebugInfoFinder::processModule(const Module &M) { addCompileUnit(CU); for (DIGlobalVariable DIG : CU->getGlobalVariables()) { if (addGlobalVariable(DIG)) { - processScope(DIG.getContext()); - processType(DIG.getType().resolve(TypeIdentifierMap)); + processScope(DIG->getScope()); + processType(DIG->getType().resolve(TypeIdentifierMap)); } } for (auto *SP : CU->getSubprograms()) @@ -295,7 +141,7 @@ void DebugInfoFinder::processModule(const Module &M) { for (auto *RT : CU->getRetainedTypes()) processType(RT); for (DIImportedEntity Import : CU->getImportedEntities()) { - DIDescriptor Entity = Import.getEntity().resolve(TypeIdentifierMap); + auto *Entity = Import->getEntity().resolve(TypeIdentifierMap); if (auto *T = dyn_cast(Entity)) processType(T); else if (auto *SP = dyn_cast(Entity)) @@ -311,8 +157,8 @@ void DebugInfoFinder::processLocation(const Module &M, DILocation Loc) { if (!Loc) return; InitializeTypeMap(M); - processScope(Loc.getScope()); - processLocation(M, Loc.getOrigLocation()); + processScope(Loc->getScope()); + processLocation(M, Loc->getInlinedAt()); } void DebugInfoFinder::processType(DIType DT) { @@ -326,7 +172,7 @@ void DebugInfoFinder::processType(DIType DT) { processType(Ref.resolve(TypeIdentifierMap)); return; } - for (Metadata *D : DCT->getElements()->operands()) { + for (Metadata *D : DCT->getElements()) { if (DIType T = dyn_cast(D)) processType(T); else if (DISubprogram SP = dyn_cast(D)) @@ -354,25 +200,23 @@ void DebugInfoFinder::processScope(DIScope Scope) { } if (!addScope(Scope)) return; - if (DILexicalBlock LB = dyn_cast(Scope)) { - processScope(LB.getContext()); - } else if (DINameSpace NS = dyn_cast(Scope)) { - processScope(NS.getContext()); + if (auto *LB = dyn_cast(Scope)) { + processScope(LB->getScope()); + } else if (auto *NS = dyn_cast(Scope)) { + processScope(NS->getScope()); } } void DebugInfoFinder::processSubprogram(DISubprogram SP) { if (!addSubprogram(SP)) return; - processScope(SP.getContext().resolve(TypeIdentifierMap)); - processType(SP.getType()); - for (auto *Element : SP.getTemplateParams()) { - if (DITemplateTypeParameter TType = - dyn_cast(Element)) { - processType(TType.getType().resolve(TypeIdentifierMap)); - } else if (DITemplateValueParameter TVal = - dyn_cast(Element)) { - processType(TVal.getType().resolve(TypeIdentifierMap)); + processScope(SP->getScope().resolve(TypeIdentifierMap)); + processType(SP->getType()); + for (auto *Element : SP->getTemplateParams()) { + if (auto *TType = dyn_cast(Element)) { + processType(TType->getType().resolve(TypeIdentifierMap)); + } else if (auto *TVal = dyn_cast(Element)) { + processType(TVal->getType().resolve(TypeIdentifierMap)); } } } @@ -390,8 +234,8 @@ void DebugInfoFinder::processDeclare(const Module &M, if (!NodesSeen.insert(DV).second) return; - processScope(DV.getContext()); - processType(DV.getType().resolve(TypeIdentifierMap)); + processScope(DV->getScope()); + processType(DV->getType().resolve(TypeIdentifierMap)); } void DebugInfoFinder::processValue(const Module &M, const DbgValueInst *DVI) { @@ -406,8 +250,8 @@ void DebugInfoFinder::processValue(const Module &M, const DbgValueInst *DVI) { if (!NodesSeen.insert(DV).second) return; - processScope(DV.getContext()); - processType(DV.getType().resolve(TypeIdentifierMap)); + processScope(DV->getScope()); + processType(DV->getType().resolve(TypeIdentifierMap)); } bool DebugInfoFinder::addType(DIType DT) { @@ -481,41 +325,6 @@ void DIDescriptor::print(raw_ostream &OS) const { get()->print(OS); } -static void printDebugLoc(DebugLoc DL, raw_ostream &CommentOS, - const LLVMContext &Ctx) { - if (!DL) - return; - - DIScope Scope = cast(DL.getScope()); - // Omit the directory, because it's likely to be long and uninteresting. - CommentOS << Scope.getFilename(); - CommentOS << ':' << DL.getLine(); - if (DL.getCol() != 0) - CommentOS << ':' << DL.getCol(); - - DebugLoc InlinedAtDL = DL.getInlinedAt(); - if (!InlinedAtDL) - return; - - CommentOS << " @[ "; - printDebugLoc(InlinedAtDL, CommentOS, Ctx); - CommentOS << " ]"; -} - -void DIVariable::printExtendedName(raw_ostream &OS) const { - const LLVMContext &Ctx = DbgNode->getContext(); - StringRef Res = getName(); - if (!Res.empty()) - OS << Res << "," << getLineNumber(); - if (auto *InlinedAt = get()->getInlinedAt()) { - if (DebugLoc InlinedAtDL = InlinedAt) { - OS << " @["; - printDebugLoc(InlinedAtDL, OS, Ctx); - OS << "]"; - } - } -} - template <> DIDescriptor DIRef::resolve(const DITypeIdentifierMap &Map) const { @@ -603,7 +412,7 @@ llvm::makeSubprogramMap(const Module &M) { for (MDNode *N : CU_Nodes->operands()) { DICompileUnit CUNode = cast(N); for (DISubprogram SP : CUNode->getSubprograms()) { - if (Function *F = SP.getFunction()) + if (Function *F = SP->getFunction()) R.insert(std::make_pair(F, SP)); } }