Hack in something so that we emit better debug information about

captured __block variables in the block-literal type.

llvm-svn: 126834
This commit is contained in:
John McCall 2011-03-02 06:57:14 +00:00
parent 1e49a6d9bc
commit 81a325e038
1 changed files with 17 additions and 3 deletions

View File

@ -2049,10 +2049,24 @@ void CGDebugInfo::EmitDeclareOfBlockLiteralArgVariable(const CGBlockInfo &block,
} }
const VarDecl *variable = capture->getVariable(); const VarDecl *variable = capture->getVariable();
QualType type = (capture->isByRef() ? C.VoidPtrTy : variable->getType());
llvm::StringRef name = variable->getName(); llvm::StringRef name = variable->getName();
fields.push_back(createFieldType(name, type, 0, loc, AS_public,
offsetInBits, tunit)); llvm::DIType fieldType;
if (capture->isByRef()) {
std::pair<uint64_t,unsigned> ptrInfo = C.getTypeInfo(C.VoidPtrTy);
// FIXME: this creates a second copy of this type!
uint64_t xoffset;
fieldType = EmitTypeForVarWithBlocksAttr(variable, &xoffset);
fieldType = DBuilder.createPointerType(fieldType, ptrInfo.first);
fieldType = DBuilder.createMemberType(name, tunit, line,
ptrInfo.first, ptrInfo.second,
offsetInBits, 0, fieldType);
} else {
fieldType = createFieldType(name, variable->getType(), 0,
loc, AS_public, offsetInBits, tunit);
}
fields.push_back(fieldType);
} }
llvm::SmallString<36> typeName; llvm::SmallString<36> typeName;