diff options
| author | Devang Patel <dpatel@apple.com> | 2011-01-11 00:30:27 +0000 |
|---|---|---|
| committer | Devang Patel <dpatel@apple.com> | 2011-01-11 00:30:27 +0000 |
| commit | bc474989730ba2183e4e2c974e15d605d61c370b (patch) | |
| tree | 94723daa1d3020485a2bfbf9c864d93a7f73d583 /clang | |
| parent | 8008ba75a56dedf56e4aa2e307dd43ce38b7a845 (diff) | |
| download | bcm5719-llvm-bc474989730ba2183e4e2c974e15d605d61c370b.tar.gz bcm5719-llvm-bc474989730ba2183e4e2c974e15d605d61c370b.zip | |
Fix debug info for __block variable referenced outside of block.
llvm-svn: 123199
Diffstat (limited to 'clang')
| -rw-r--r-- | clang/lib/CodeGen/CGDebugInfo.cpp | 31 |
1 files changed, 30 insertions, 1 deletions
diff --git a/clang/lib/CodeGen/CGDebugInfo.cpp b/clang/lib/CodeGen/CGDebugInfo.cpp index 37a88efcc4e..ff07f758eda 100644 --- a/clang/lib/CodeGen/CGDebugInfo.cpp +++ b/clang/lib/CodeGen/CGDebugInfo.cpp @@ -1740,7 +1740,36 @@ void CGDebugInfo::EmitDeclare(const VarDecl *VD, unsigned Tag, llvm::StringRef Name = VD->getName(); if (!Name.empty()) { - // Create the descriptor for the variable. + if (VD->hasAttr<BlocksAttr>()) { + CharUnits offset = CharUnits::fromQuantity(32); + llvm::SmallVector<llvm::Value *, 9> addr; + const llvm::Type *Int64Ty = llvm::Type::getInt64Ty(CGM.getLLVMContext()); + addr.push_back(llvm::ConstantInt::get(Int64Ty, llvm::DIFactory::OpPlus)); + // offset of __forwarding field + offset = + CharUnits::fromQuantity(CGM.getContext().Target.getPointerWidth(0)/8); + addr.push_back(llvm::ConstantInt::get(Int64Ty, offset.getQuantity())); + addr.push_back(llvm::ConstantInt::get(Int64Ty, llvm::DIFactory::OpDeref)); + addr.push_back(llvm::ConstantInt::get(Int64Ty, llvm::DIFactory::OpPlus)); + // offset of x field + offset = CharUnits::fromQuantity(XOffset/8); + addr.push_back(llvm::ConstantInt::get(Int64Ty, offset.getQuantity())); + + // Create the descriptor for the variable. + llvm::DIVariable D = + DBuilder.CreateComplexVariable(Tag, + llvm::DIDescriptor(RegionStack.back()), + VD->getName(), Unit, Line, Ty, + addr.data(), addr.size()); + + // Insert an llvm.dbg.declare into the current block. + llvm::Instruction *Call = + DBuilder.InsertDeclare(Storage, D, Builder.GetInsertBlock()); + + Call->setDebugLoc(llvm::DebugLoc::get(Line, Column, Scope)); + return; + } + // Create the descriptor for the variable. llvm::DIVariable D = DBuilder.CreateLocalVariable(Tag, llvm::DIDescriptor(Scope), Name, Unit, Line, Ty, |

