diff options
author | Anders Carlsson <andersca@mac.com> | 2009-09-10 01:32:12 +0000 |
---|---|---|
committer | Anders Carlsson <andersca@mac.com> | 2009-09-10 01:32:12 +0000 |
commit | 3604386e1eacbe9da4ab13a2648a44ca581057d3 (patch) | |
tree | 511dfa2c3e89c4eccf893a1c2619b9b4eb9415c1 /lib/CodeGen/CGDecl.cpp | |
parent | e2fd66418eca3d70cf6b62087d745d0c5181db69 (diff) |
Make the forwarding member of block byref structs be a pointer to the block byref struct itself.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@81423 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/CGDecl.cpp')
-rw-r--r-- | lib/CodeGen/CGDecl.cpp | 17 |
1 files changed, 13 insertions, 4 deletions
diff --git a/lib/CodeGen/CGDecl.cpp b/lib/CodeGen/CGDecl.cpp index ec8f626df5..5abe31e252 100644 --- a/lib/CodeGen/CGDecl.cpp +++ b/lib/CodeGen/CGDecl.cpp @@ -223,8 +223,11 @@ const llvm::Type *CodeGenFunction::BuildByRefType(const ValueDecl *D) { std::vector<const llvm::Type *> Types(needsCopyDispose*2+5); const llvm::PointerType *PtrToInt8Ty = llvm::PointerType::getUnqual(llvm::Type::getInt8Ty(VMContext)); + + llvm::PATypeHolder ByRefTypeHolder = llvm::OpaqueType::get(VMContext); + Types[0] = PtrToInt8Ty; - Types[1] = PtrToInt8Ty; + Types[1] = llvm::PointerType::getUnqual(ByRefTypeHolder); Types[2] = llvm::Type::getInt32Ty(VMContext); Types[3] = llvm::Type::getInt32Ty(VMContext); if (needsCopyDispose) { @@ -235,7 +238,14 @@ const llvm::Type *CodeGenFunction::BuildByRefType(const ValueDecl *D) { assert((Align <= unsigned(Target.getPointerAlign(0))/8) && "Can't align more than pointer yet"); Types[needsCopyDispose*2 + 4] = LTy; - return llvm::StructType::get(VMContext, Types, false); + + const llvm::Type *T = llvm::StructType::get(VMContext, Types, false); + + cast<llvm::OpaqueType>(ByRefTypeHolder.get())->refineAbstractTypeTo(T); + CGM.getModule().addTypeName("struct.__block_byref_" + D->getNameAsString(), + ByRefTypeHolder.get()); + + return ByRefTypeHolder.get(); } /// EmitLocalBlockVarDecl - Emit code and set up an entry in LocalDeclMap for a @@ -413,8 +423,7 @@ void CodeGenFunction::EmitLocalBlockVarDecl(const VarDecl &D) { V = Builder.CreateIntToPtr(V, PtrToInt8Ty, "isa"); Builder.CreateStore(V, isa_field); - V = Builder.CreateBitCast(DeclPtr, PtrToInt8Ty, "forwarding"); - Builder.CreateStore(V, forwarding_field); + Builder.CreateStore(DeclPtr, forwarding_field); V = llvm::ConstantInt::get(llvm::Type::getInt32Ty(VMContext), flags); Builder.CreateStore(V, flags_field); |