diff options
author | Gor Nishanov <GorNishanov@gmail.com> | 2016-09-30 19:05:06 +0000 |
---|---|---|
committer | Gor Nishanov <GorNishanov@gmail.com> | 2016-09-30 19:05:06 +0000 |
commit | c16219486a30076752d6803c68ab6f883b5fd4a4 (patch) | |
tree | 01aa200a43996c6c770c7fead05e9dd26cdec1df /llvm/lib/Transforms/Coroutines | |
parent | f9c622adfc4d18319320d7fa27c62a202033dfb6 (diff) | |
download | bcm5719-llvm-c16219486a30076752d6803c68ab6f883b5fd4a4.tar.gz bcm5719-llvm-c16219486a30076752d6803c68ab6f883b5fd4a4.zip |
[Coroutines] Part15b: Fix dbg information handling in coro-split.
Summary:
Without the fix, if there was a function inlined into the coroutine with debug information, CloneFunctionInto(NewF, &F, VMap, /*ModuleLevelChanges=*/true, Returns); would duplicate all of the debug information including the DICompileUnit.
We know use VMap to indicate that debug metadata for a File, Unit and FunctionType should not be duplicated when we creating clones that will become f.resume, f.destroy and f.cleanup.
Reviewers: majnemer
Subscribers: mehdi_amini, llvm-commits
Differential Revision: https://reviews.llvm.org/D24417
llvm-svn: 282899
Diffstat (limited to 'llvm/lib/Transforms/Coroutines')
-rw-r--r-- | llvm/lib/Transforms/Coroutines/CoroFrame.cpp | 5 | ||||
-rw-r--r-- | llvm/lib/Transforms/Coroutines/CoroSplit.cpp | 14 |
2 files changed, 13 insertions, 6 deletions
diff --git a/llvm/lib/Transforms/Coroutines/CoroFrame.cpp b/llvm/lib/Transforms/Coroutines/CoroFrame.cpp index f6e0499a501..2b4e725fd0e 100644 --- a/llvm/lib/Transforms/Coroutines/CoroFrame.cpp +++ b/llvm/lib/Transforms/Coroutines/CoroFrame.cpp @@ -27,6 +27,7 @@ #include "llvm/Support/MathExtras.h" #include "llvm/Support/circular_raw_ostream.h" #include "llvm/Transforms/Utils/BasicBlockUtils.h" +#include "llvm/Transforms/Utils/Local.h" using namespace llvm; @@ -637,6 +638,10 @@ static void splitAround(Instruction *I, const Twine &Name) { } void coro::buildCoroutineFrame(Function &F, Shape &Shape) { + // Lower coro.dbg.declare to coro.dbg.value, since we are going to rewrite + // access to local variables. + LowerDbgDeclare(F); + Shape.PromiseAlloca = Shape.CoroBegin->getId()->getPromise(); if (Shape.PromiseAlloca) { Shape.CoroBegin->getId()->clearPromise(); diff --git a/llvm/lib/Transforms/Coroutines/CoroSplit.cpp b/llvm/lib/Transforms/Coroutines/CoroSplit.cpp index 7233e5301b1..77c4be88a4e 100644 --- a/llvm/lib/Transforms/Coroutines/CoroSplit.cpp +++ b/llvm/lib/Transforms/Coroutines/CoroSplit.cpp @@ -200,14 +200,16 @@ static Function *createClone(Function &F, Twine Suffix, coro::Shape &Shape, SmallVector<ReturnInst *, 4> Returns; + if (DISubprogram *SP = F.getSubprogram()) { + // If we have debug info, add mapping for the metadata nodes that should not + // be cloned by CloneFunctionInfo. + auto &MD = VMap.MD(); + MD[SP->getUnit()].reset(SP->getUnit()); + MD[SP->getType()].reset(SP->getType()); + MD[SP->getFile()].reset(SP->getFile()); + } CloneFunctionInto(NewF, &F, VMap, /*ModuleLevelChanges=*/true, Returns); - // If we have debug info, update it. ModuleLevelChanges = true above, does - // the heavy lifting, we just need to repoint subprogram at the same - // DICompileUnit as the original function F. - if (DISubprogram *SP = F.getSubprogram()) - NewF->getSubprogram()->replaceUnit(SP->getUnit()); - // Remove old returns. for (ReturnInst *Return : Returns) changeToUnreachable(Return, /*UseLLVMTrap=*/false); |