diff options
author | Adrian Prantl <aprantl@apple.com> | 2013-03-29 19:20:35 +0000 |
---|---|---|
committer | Adrian Prantl <aprantl@apple.com> | 2013-03-29 19:20:35 +0000 |
commit | 9b97adfb770c3b55c1a45049d53b624bbc6f62e1 (patch) | |
tree | fbe268b381ff1b0df3b304df84d19c01f11fbd6c /lib/CodeGen/CGBlocks.cpp | |
parent | e86fcc46f560b8e0e13e13a7a1854658b231b2ea (diff) |
Bugfix/Followup for r177086.
* Store the .block_descriptor (instead of self) in the alloca so we
can guarantee that all captured variables are available at -O0.
* Add the missing OpDeref for the alloca.
rdar://problem/12767564
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@178361 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/CGBlocks.cpp')
-rw-r--r-- | lib/CodeGen/CGBlocks.cpp | 29 |
1 files changed, 14 insertions, 15 deletions
diff --git a/lib/CodeGen/CGBlocks.cpp b/lib/CodeGen/CGBlocks.cpp index 77e29bd119..d702b856cd 100644 --- a/lib/CodeGen/CGBlocks.cpp +++ b/lib/CodeGen/CGBlocks.cpp @@ -1138,6 +1138,18 @@ CodeGenFunction::GenerateBlockFunction(GlobalDecl GD, BlockPointer = Builder.CreateBitCast(blockAddr, blockInfo.StructureType->getPointerTo(), "block"); + // At -O0 we generate an explicit alloca for the BlockPointer, so the RA + // won't delete the dbg.declare intrinsics for captured variables. + llvm::Value *BlockPointerDbgLoc = BlockPointer; + if (CGM.getCodeGenOpts().OptimizationLevel == 0) { + // Allocate a stack slot for it, so we can point the debugger to it + llvm::AllocaInst *Alloca = CreateTempAlloca(BlockPointer->getType(), + "block.addr"); + unsigned Align = getContext().getDeclAlign(&selfDecl).getQuantity(); + Alloca->setAlignment(Align); + Builder.CreateAlignedStore(BlockPointer, Alloca, Align); + BlockPointerDbgLoc = Alloca; + } // If we have a C++ 'this' reference, go ahead and force it into // existence now. @@ -1161,20 +1173,7 @@ CodeGenFunction::GenerateBlockFunction(GlobalDecl GD, llvm::Value *selfAddr = Builder.CreateStructGEP(BlockPointer, capture.getIndex(), "block.captured-self"); - - // At -O0 we generate an explicit alloca for self to facilitate debugging. - if (CGM.getCodeGenOpts().OptimizationLevel == 0) { - llvm::Value *load = Builder.CreateLoad(selfAddr); - - // Allocate a stack slot for it, so we can generate debug info for it - llvm::AllocaInst *alloca = CreateTempAlloca(load->getType(), - "block.captured-self.addr"); - unsigned align = getContext().getDeclAlign(self).getQuantity(); - alloca->setAlignment(align); - Builder.CreateAlignedStore(load, alloca, align); - LocalDeclMap[self] = alloca; - } else - LocalDeclMap[self] = selfAddr; + LocalDeclMap[self] = selfAddr; } } @@ -1230,7 +1229,7 @@ CodeGenFunction::GenerateBlockFunction(GlobalDecl GD, continue; } - DI->EmitDeclareOfBlockDeclRefVariable(variable, BlockPointer, + DI->EmitDeclareOfBlockDeclRefVariable(variable, BlockPointerDbgLoc, Builder, blockInfo); } } |