Fixed a block regression caused by trying to use

an existing ir for load of a bock variable. This cannot be
done across basic blocks.
Fixes radar 8064140.


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@105549 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Fariborz Jahanian 2010-06-07 19:39:39 +00:00
Родитель 43859f66cd
Коммит 19739ae839
3 изменённых файлов: 37 добавлений и 7 удалений

Просмотреть файл

@ -612,9 +612,6 @@ void CodeGenFunction::AllocateBlockDecl(const BlockDeclRefExpr *E) {
llvm::Value *CodeGenFunction::GetAddrOfBlockDecl(const ValueDecl *VD,
bool IsByRef) {
llvm::Value *&VE = BlockDeclsValue[VD];
if (VE)
return VE;
CharUnits offset = BlockDecls[VD];
assert(!offset.isZero() && "getting address of unallocated decl");
@ -648,7 +645,6 @@ llvm::Value *CodeGenFunction::GetAddrOfBlockDecl(const ValueDecl *VD,
if (VD->getType()->isReferenceType())
V = Builder.CreateLoad(V, "ref.tmp");
}
VE = V;
return V;
}

Просмотреть файл

@ -181,9 +181,6 @@ public:
/// BlockDecls - Offsets for all Decls in BlockDeclRefExprs.
llvm::DenseMap<const Decl*, CharUnits> BlockDecls;
/// BlockDeclsValue - llvm::Value for all Decls in BlockDeclRefExprs.
llvm::DenseMap<const Decl*, llvm::Value *> BlockDeclsValue;
/// BlockCXXThisOffset - The offset of the C++ 'this' value within
/// the block structure.
CharUnits BlockCXXThisOffset;

Просмотреть файл

@ -0,0 +1,37 @@
// RUN: %clang_cc1 -triple x86_64-apple-darwin9 -emit-llvm -fblocks -o %t %s
// rdar: // 8064140
@interface IDEWorkspaceDocument
{
id _defaultEditorStateTree;
}
- (void)enumerateKeysAndObjectsUsingBlock:(void (^)(id key, id obj, unsigned char *stop))block ;
@end
int foo();
extern void DVT (volatile const void * object, volatile const void * selector, const char * functionName);
@implementation IDEWorkspaceDocument
- (void)stateSavingDefaultEditorStatesForURLs {
[_defaultEditorStateTree enumerateKeysAndObjectsUsingBlock:^(id identifier, id urlsToEditorStates, unsigned char *stop) {
do{
if (foo() )
DVT(&self,&_cmd,__PRETTY_FUNCTION__);
}while(0);
do{
DVT(&self,&_cmd,__PRETTY_FUNCTION__);
}while(0);
}];
}
- (void)enumerateKeysAndObjectsUsingBlock:(void (^)(id key, id obj, unsigned char *stop))block {}
@end