[PATCH] D16209: Teach GlobalOpt not to drop DebugInfo on the floor when it promotes globals to allocas

David Blaikie via llvm-commits llvm-commits at lists.llvm.org
Thu Jan 14 21:12:39 PST 2016


I doubt the debug info metadata schema can cope with what you really want
here - I imagine it's pretty clear about dbg.declare/value things
referencing local variables in the function, not global variables.

Might take some pretty major finagling to make that generalize/allowable.

On Thu, Jan 14, 2016 at 6:10 PM, Jonathan Roelofs via llvm-commits <
llvm-commits at lists.llvm.org> wrote:

> jroelofs created this revision.
> jroelofs added reviewers: aprantl, llvm-commits.
>
> Note this doesn't actually work yet... and I need help fixing it.
>
> With this patch I get:
> Assertion failed:
> (cast<DISubprogram>(Scope)->describes(MF->getFunction())), function
> getOrCreateRegularScope, file
> /Users/jroelofs/workdir/mento/llvm/lib/CodeGen/LexicalScopes.cpp, line 160.
> 0  llc                      0x000000010cd6f6ee
> llvm::sys::PrintStackTrace(llvm::raw_ostream&) + 46
> 1  llc                      0x000000010cd71389
> PrintStackTraceSignalHandler(void*) + 25
> 2  llc                      0x000000010cd6d989
> llvm::sys::RunSignalHandlers() + 425
> 3  llc                      0x000000010cd716c9 SignalHandler(int) + 345
> 4  libsystem_platform.dylib 0x00007fff9585f52a _sigtramp + 26
> 5  llc                      0x000000010de14046
> llvm::initializeUnifyFunctionExitNodesPass(llvm::PassRegistry&)::initialized
> + 84870
> 6  llc                      0x000000010cd713ab raise + 27
> 7  llc                      0x000000010cd71462 abort + 18
> 8  llc                      0x000000010cd71441 __assert_rtn + 129
> 9  llc                      0x000000010bf4a9ca
> llvm::LexicalScopes::getOrCreateRegularScope(llvm::DILocalScope const*) +
> 1930
> 10 llc                      0x000000010bf49212
> llvm::LexicalScopes::getOrCreateLexicalScope(llvm::DILocalScope const*,
> llvm::DILocation const*) + 98
> 11 llc                      0x000000010bf4b3bc
> llvm::LexicalScopes::getOrCreateLexicalScope(llvm::DILocation const*) + 76
> 12 llc                      0x000000010bf4ab0e
> llvm::LexicalScopes::getMachineBasicBlocks(llvm::DILocation const*,
> llvm::SmallPtrSetImpl<llvm::MachineBasicBlock const*>&) + 62
> 13 llc                      0x000000010bf5859a (anonymous
> namespace)::UserValueScopes::dominates(llvm::MachineBasicBlock*) + 106
> 14 llc                      0x000000010bf57744 (anonymous
> namespace)::UserValue::extendDef(llvm::SlotIndex, unsigned int,
> llvm::LiveRange*, llvm::VNInfo const*,
> llvm::SmallVectorImpl<llvm::SlotIndex>*, llvm::LiveIntervals&,
> llvm::MachineDominatorTree&, (anonymous namespace)::UserValueScopes&) + 1300
> 15 llc                      0x000000010bf56a8c (anonymous
> namespace)::UserValue::computeIntervals(llvm::MachineRegisterInfo&,
> llvm::TargetRegisterInfo const&, llvm::LiveIntervals&,
> llvm::MachineDominatorTree&, (anonymous namespace)::UserValueScopes&) + 1404
> 16 llc                      0x000000010bf540a6 (anonymous
> namespace)::LDVImpl::computeIntervals() + 742
> 17 llc                      0x000000010bf525b4 (anonymous
> namespace)::LDVImpl::runOnMachineFunction(llvm::MachineFunction&) + 292
> 18 llc                      0x000000010bf5230b
> llvm::LiveDebugVariables::runOnMachineFunction(llvm::MachineFunction&) + 187
> 19 llc                      0x000000010c02472e
> llvm::MachineFunctionPass::runOnFunction(llvm::Function&) + 110
> 20 llc                      0x000000010c59fdad
> llvm::FPPassManager::runOnFunction(llvm::Function&) + 413
> 21 llc                      0x000000010c5a00e5
> llvm::FPPassManager::runOnModule(llvm::Module&) + 117
> 22 llc                      0x000000010c5a0e3a (anonymous
> namespace)::MPPassManager::runOnModule(llvm::Module&) + 2010
> 23 llc                      0x000000010c5a03cb
> llvm::legacy::PassManagerImpl::run(llvm::Module&) + 347
> 24 llc                      0x000000010c5a1a81
> llvm::legacy::PassManager::run(llvm::Module&) + 33
> 25 llc                      0x000000010a8b9107 compileModule(char**,
> llvm::LLVMContext&) + 19239
> 26 llc                      0x000000010a8b4576 main + 230
> 27 libdyld.dylib            0x00007fff96b215ad start + 1
> 28 libdyld.dylib            0x0000000000000012 start + 1766713958
>
> But I don't know how to get ahold of the DIScope that it wants.
>
>
> Also this feels really awkward... so if there's a better way to do this,
> please let me know.
>
> http://reviews.llvm.org/D16209
>
> Files:
>   tools/llvm-project/llvm/lib/Transforms/IPO/GlobalOpt.cpp
>
> Index: tools/llvm-project/llvm/lib/Transforms/IPO/GlobalOpt.cpp
> ===================================================================
> --- tools/llvm-project/llvm/lib/Transforms/IPO/GlobalOpt.cpp
> +++ tools/llvm-project/llvm/lib/Transforms/IPO/GlobalOpt.cpp
> @@ -28,6 +28,7 @@
>  #include "llvm/IR/Constants.h"
>  #include "llvm/IR/DataLayout.h"
>  #include "llvm/IR/DerivedTypes.h"
> +#include "llvm/IR/DIBuilder.h"
>  #include "llvm/IR/GetElementPtrTypeIterator.h"
>  #include "llvm/IR/Instructions.h"
>  #include "llvm/IR/IntrinsicInst.h"
> @@ -86,6 +87,7 @@
>                                 const GlobalStatus &GS);
>      bool OptimizeEmptyGlobalCXXDtors(Function *CXAAtExitFn);
>
> +    std::unique_ptr<DIBuilder> DIB;
>      TargetLibraryInfo *TLI;
>      SmallSet<const Comdat *, 8> NotDiscardableComdats;
>    };
> @@ -1749,6 +1751,16 @@
>    }
>  }
>
> +static DIGlobalVariable *FindDebugInfo(GlobalVariable *GV) {
> +  DebugInfoFinder F;
> +  F.processModule(*GV->getParent());
> +  for (DICompileUnit *DIC : F.compile_units())
> +    for (DIGlobalVariable *DIG : DIC->getGlobalVariables())
> +      if (DIG->getVariable() == GV)
> +          return DIG;
> +  return nullptr;
> +}
> +
>  /// Analyze the specified global variable and optimize
>  /// it if possible.  If we make a change, return true.
>  bool GlobalOpt::ProcessInternalGlobal(GlobalVariable *GV,
> @@ -1776,11 +1788,26 @@
>      // FIXME: Pass Global's alignment when globals have alignment
>      AllocaInst *Alloca = new AllocaInst(ElemTy, nullptr,
>                                          GV->getName(), &FirstI);
> +    StoreInst *Store = nullptr;
>      if (!isa<UndefValue>(GV->getInitializer()))
> -      new StoreInst(GV->getInitializer(), Alloca, &FirstI);
> +      Store = new StoreInst(GV->getInitializer(), Alloca, &FirstI);
> +
> +    if (DIGlobalVariable *D = FindDebugInfo(GV)) {
> +      if (DIType *T = dyn_cast<DIType>(D->getRawType())) {
> +        DEBUG(dbgs() << "                   ... and transferring its
> DebugInfo\n");
> +        auto *Scope = D->getScope();
> +        auto *Variable = DIB->createAutoVariable(Scope,
> +                                                 D->getLinkageName(),
> +                                                 D->getFile(),
> D->getLine(),
> +                                                 T);
> +        auto *E = DIB->createExpression();
> +        auto *DL = DILocation::get(GV->getContext(), D->getLine(), 0,
> +                                   Scope);
> +        DIB->insertDeclare(Alloca, Variable, E, DL, Store);
> +      }
>
>      makeAllConstantUsesInstructions(GV);
> -
> +
>      GV->replaceAllUsesWith(Alloca);
>      GV->eraseFromParent();
>      ++NumLocalized;
> @@ -3062,6 +3089,7 @@
>  }
>
>  bool GlobalOpt::runOnModule(Module &M) {
> +  DIB = llvm::make_unique<DIBuilder>(M, /*AllowUnresolved=*/ false);
>    bool Changed = false;
>
>    auto &DL = M.getDataLayout();
>
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20160114/d70a0964/attachment.html>


More information about the llvm-commits mailing list