[llvm] r219215 - DebugInfo: Ensure that all debug location scope chains from instructions within a function, lead to the function itself.

David Blaikie dblaikie at gmail.com
Fri Oct 10 11:28:41 PDT 2014


On Fri, Oct 10, 2014 at 11:07 AM, Adam Nemet <anemet at apple.com> wrote:

>
> On Oct 7, 2014, at 9:56 AM, David Blaikie <dblaikie at gmail.com> wrote:
>
> > Author: dblaikie
> > Date: Tue Oct  7 11:56:20 2014
> > New Revision: 219215
> >
> > URL: http://llvm.org/viewvc/llvm-project?rev=219215&view=rev
> > Log:
> > DebugInfo: Ensure that all debug location scope chains from instructions
> within a function, lead to the function itself.
> >
> > Let me tell you a tale...
> >
> > Originally committed in r211723 after discovering a nasty case of weird
> > scoping due to inlining, this was reverted in r211724 after it fired in
> > ASan/compiler-rt.
> >
> > (minor diversion where I accidentally committed/reverted again in
> > r211871/r211873)
> >
> > After further testing and fixing bugs in ArgumentPromotion (r211872) and
> > Inlining (r212065) it was recommitted in r212085. Reverted in r212089
> > after the sanitizer buildbots still showed problems.
> >
> > Fixed another bug in ArgumentPromotion (r212128) found by this
> > assertion.
> >
> > Recommitted in r212205, reverted in r212226 after it crashed some more
> > on sanitizer buildbots.
> >
> > Fix clang some more in r212761.
> >
> > Recommitted in r212776, reverted in r212793. ASan failures.
> > Recommitted in r213391, reverted in r213432, trying to reproduce flakey
> > ASan build failure.
> >
> > Fixed bugs in r213805 (ArgPromo + DebugInfo), r213952
> > (LiveDebugVariables strips dbg_value intrinsics in functions not
> > described by debug info).
> >
> > Recommitted in r214761, reverted in r214999, flakey failure on Windows
> > buildbot.
> >
> > Fixed DeadArgElimination + DebugInfo bug in r219210.
> >
> > Recommitting and hoping that's the last of it.
> >
> > [That one burned down, fell over, then sank into the swamp.]
>
> Hi David,
>
> Unfortunately, this may not be the end of the tale yet...  We’re seeing
> the new assert triggered with test-suite/SingleSource/UnitTests/ObjC++/
> property-reference-object.mm using -O0 -g on x86_64:
>
> /org/llvm/build$ ./Debug+Asserts/bin/clang++
> /org/test-suite/SingleSource/UnitTests/ObjC++/property-reference-object.mm
> -O0 -g -arch x86_64 -m64 -fomit-frame-pointer -mdynamic-no-pic -c
> Assertion failed: (DISubprogram(Scope).describes(MF->getFunction())),
> function getOrCreateRegularScope, file
> /Users/anemet/proj/org/llvm/lib/CodeGen/LexicalScopes.cpp, line 179.
> 0  clang                    0x000000010b8ee19e
> llvm::sys::PrintStackTrace(__sFILE*) + 46
> 1  clang                    0x000000010b8ee4ab
> PrintStackTraceSignalHandler(void*) + 27
> 2  clang                    0x000000010b8ee8c1 SignalHandler(int) + 561
> 3  libsystem_platform.dylib 0x00007fff8a7da5aa _sigtramp + 26
> 4  clang                    0x000000010be8fc0c
> std::__1::piecewise_construct + 0
> 5  clang                    0x000000010b8ee4db raise + 27
> 6  clang                    0x000000010b8ee592 abort + 18
> 7  clang                    0x000000010b8ee571 __assert_rtn + 129
> 8  clang                    0x000000010ac4b9e6
> llvm::LexicalScopes::getOrCreateRegularScope(llvm::MDNode*) + 2854
> 9  clang                    0x000000010ac48f9c
> llvm::LexicalScopes::getOrCreateLexicalScope(llvm::DebugLoc) + 188
> 10 clang                    0x000000010ac489df
> llvm::LexicalScopes::extractLexicalScopes(llvm::SmallVectorImpl<std::__1::pair<llvm::MachineInstr
> const*, llvm::MachineInstr const*> >&, llvm::DenseMap<llvm::MachineInstr
> const*, llvm::LexicalScope*, llvm::DenseMapInfo<llvm::MachineInstr const*>
> >&) + 607
> 11 clang                    0x000000010ac486f6
> llvm::LexicalScopes::initialize(llvm::MachineFunction const&) + 118
> 12 clang                    0x000000010ab2b7dc
> llvm::DwarfDebug::beginFunction(llvm::MachineFunction const*) + 252
> 13 clang                    0x000000010aadff16
> llvm::AsmPrinter::EmitFunctionHeader() + 1302
> 14 clang                    0x000000010a697a46
> llvm::X86AsmPrinter::runOnMachineFunction(llvm::MachineFunction&) + 262
> 15 clang                    0x000000010ad00a2e
> llvm::MachineFunctionPass::runOnFunction(llvm::Function&) + 110
> 16 clang                    0x000000010b80891f
> llvm::FPPassManager::runOnFunction(llvm::Function&) + 431
> 17 clang                    0x000000010b808c08
> llvm::FPPassManager::runOnModule(llvm::Module&) + 104
> 18 clang                    0x000000010b8095d6 (anonymous
> namespace)::MPPassManager::runOnModule(llvm::Module&) + 1350
> 19 clang                    0x000000010b808ebe
> llvm::legacy::PassManagerImpl::run(llvm::Module&) + 302
> 20 clang                    0x000000010b809d21
> llvm::legacy::PassManager::run(llvm::Module&) + 33
> 21 clang                    0x0000000107ceef51 (anonymous
> namespace)::EmitAssemblyHelper::EmitAssembly(clang::BackendAction,
> llvm::raw_ostream*) + 1601
> 22 clang                    0x0000000107cee702
> clang::EmitBackendOutput(clang::DiagnosticsEngine&, clang::CodeGenOptions
> const&, clang::TargetOptions const&, clang::LangOptions const&,
> llvm::StringRef, llvm::Module*, clang::BackendAction, llvm::raw_ostream*) +
> 114
> 23 clang                    0x0000000107ee2d65
> clang::BackendConsumer::HandleTranslationUnit(clang::ASTContext&) + 1733
> 24 clang                    0x00000001080327b4
> clang::ParseAST(clang::Sema&, bool, bool) + 1268
> 25 clang                    0x0000000107a1d98a
> clang::ASTFrontendAction::ExecuteAction() + 522
> 26 clang                    0x0000000107ee0d09
> clang::CodeGenAction::ExecuteAction() + 3785
> 27 clang                    0x0000000107a1cef8
> clang::FrontendAction::Execute() + 120
> 28 clang                    0x00000001079b136f
> clang::CompilerInstance::ExecuteAction(clang::FrontendAction&) + 1007
> 29 clang                    0x00000001078d8ec0
> clang::ExecuteCompilerInvocation(clang::CompilerInstance*) + 3136
> 30 clang                    0x00000001078ba79b
> cc1_main(llvm::ArrayRef<char const*>, char const*, void*) + 2395
> 31 clang                    0x00000001078ceea6
> ExecuteCC1Tool(llvm::ArrayRef<char const*>, llvm::StringRef) + 198
> 32 clang                    0x00000001078ce4a8 main + 1288
> 33 libdyld.dylib            0x00007fff8ffe95fd start + 1
>
> As expected reverting the commit fixes the assert.  Can you please take a
> look?
>

Sure - could you provide the crash results (the crash handler should
specify two temporary files that contain the semi-preprocessed source and
the -cc1 command line in a shell file)?

- David


>
> Thanks,
> Adam
>
>
> >
> > Modified:
> >    llvm/trunk/lib/CodeGen/LexicalScopes.cpp
> >    llvm/trunk/lib/IR/DebugInfo.cpp
> >
> > Modified: llvm/trunk/lib/CodeGen/LexicalScopes.cpp
> > URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/LexicalScopes.cpp?rev=219215&r1=219214&r2=219215&view=diff
> >
> ==============================================================================
> > --- llvm/trunk/lib/CodeGen/LexicalScopes.cpp (original)
> > +++ llvm/trunk/lib/CodeGen/LexicalScopes.cpp Tue Oct  7 11:56:20 2014
> > @@ -137,6 +137,8 @@ LexicalScope *LexicalScopes::findLexical
> > /// getOrCreateLexicalScope - Find lexical scope for the given DebugLoc.
> If
> > /// not available then create new lexical scope.
> > LexicalScope *LexicalScopes::getOrCreateLexicalScope(DebugLoc DL) {
> > +  if (DL.isUnknown())
> > +    return nullptr;
> >   MDNode *Scope = nullptr;
> >   MDNode *InlinedAt = nullptr;
> >   DL.getScopeAndInlinedAt(Scope, InlinedAt,
> MF->getFunction()->getContext());
> > @@ -172,9 +174,12 @@ LexicalScope *LexicalScopes::getOrCreate
> >                               std::make_tuple(Parent,
> DIDescriptor(Scope),
> >                                               nullptr, false)).first;
> >
> > -  if (!Parent && DIDescriptor(Scope).isSubprogram() &&
> > -      DISubprogram(Scope).describes(MF->getFunction()))
> > +  if (!Parent) {
> > +    assert(DIDescriptor(Scope).isSubprogram());
> > +    assert(DISubprogram(Scope).describes(MF->getFunction()));
> > +    assert(!CurrentFnLexicalScope);
> >     CurrentFnLexicalScope = &I->second;
> > +  }
> >
> >   return &I->second;
> > }
> >
> > Modified: llvm/trunk/lib/IR/DebugInfo.cpp
> > URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/DebugInfo.cpp?rev=219215&r1=219214&r2=219215&view=diff
> >
> ==============================================================================
> > --- llvm/trunk/lib/IR/DebugInfo.cpp (original)
> > +++ llvm/trunk/lib/IR/DebugInfo.cpp Tue Oct  7 11:56:20 2014
> > @@ -568,6 +568,34 @@ bool DISubprogram::Verify() const {
> >   if (isLValueReference() && isRValueReference())
> >     return false;
> >
> > +  // If a DISubprogram has an llvm::Function*, then scope chains from
> all
> > +  // instructions within the function should lead to this DISubprogram.
> > +  if (auto *F = getFunction()) {
> > +    LLVMContext &Ctxt = F->getContext();
> > +    for (auto &BB : *F) {
> > +      for (auto &I : BB) {
> > +        DebugLoc DL = I.getDebugLoc();
> > +        if (DL.isUnknown())
> > +          continue;
> > +
> > +        MDNode *Scope = nullptr;
> > +        MDNode *IA = nullptr;
> > +        // walk the inlined-at scopes
> > +        while (DL.getScopeAndInlinedAt(Scope, IA, F->getContext()), IA)
> > +          DL = DebugLoc::getFromDILocation(IA);
> > +        DL.getScopeAndInlinedAt(Scope, IA, Ctxt);
> > +        assert(!IA);
> > +        while (!DIDescriptor(Scope).isSubprogram()) {
> > +          DILexicalBlockFile D(Scope);
> > +          Scope = D.isLexicalBlockFile()
> > +                      ? D.getScope()
> > +                      :
> DebugLoc::getFromDILexicalBlock(Scope).getScope(Ctxt);
> > +        }
> > +        if (!DISubprogram(Scope).describes(F))
> > +          return false;
> > +      }
> > +    }
> > +  }
> >   return DbgNode->getNumOperands() == 9 && getNumHeaderFields() == 12;
> > }
> >
> >
> >
> > _______________________________________________
> > llvm-commits mailing list
> > llvm-commits at cs.uiuc.edu
> > http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20141010/0eadfd9b/attachment.html>


More information about the llvm-commits mailing list