[llvm-branch-commits] [cfe-branch] r81871 - /cfe/branches/Apple/objective-rewrite/tools/clang/Driver/RewriteObjC.cpp
Steve Naroff
snaroff at apple.com
Tue Sep 15 10:32:55 PDT 2009
Author: snaroff
Date: Tue Sep 15 12:32:55 2009
New Revision: 81871
URL: http://llvm.org/viewvc/llvm-project?rev=81871&view=rev
Log:
Fix <rdar://problem/7178933> clang ObjC rewriter: Block copy broken.
This required "upgrading" to the new "block descriptor" based ABI (which was added after the rewriter support for blocks was done).
Modified:
cfe/branches/Apple/objective-rewrite/tools/clang/Driver/RewriteObjC.cpp
Modified: cfe/branches/Apple/objective-rewrite/tools/clang/Driver/RewriteObjC.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/branches/Apple/objective-rewrite/tools/clang/Driver/RewriteObjC.cpp?rev=81871&r1=81870&r2=81871&view=diff
==============================================================================
--- cfe/branches/Apple/objective-rewrite/tools/clang/Driver/RewriteObjC.cpp (original)
+++ cfe/branches/Apple/objective-rewrite/tools/clang/Driver/RewriteObjC.cpp Tue Sep 15 12:32:55 2009
@@ -336,8 +336,11 @@
const char *funcName, std::string Tag);
std::string SynthesizeBlockFunc(BlockExpr *CE, int i,
const char *funcName, std::string Tag);
- std::string SynthesizeBlockImpl(BlockExpr *CE, std::string Tag,
- bool hasCopyDisposeHelpers);
+ std::string SynthesizeBlockImpl(BlockExpr *CE,
+ std::string Tag, std::string Desc);
+ std::string SynthesizeBlockDescriptor(std::string Tag, int i,
+ const char *funcName,
+ unsigned hasCopy);
Stmt *SynthesizeBlockCall(CallExpr *Exp);
void SynthesizeBlockLiterals(SourceLocation FunLocStart,
const char *FunName);
@@ -551,7 +554,7 @@
Preamble += "struct __block_impl {\n";
Preamble += " void *isa;\n";
Preamble += " int Flags;\n";
- Preamble += " int Size;\n";
+ Preamble += " int Reserved;\n";
Preamble += " void *FuncPtr;\n";
Preamble += "};\n";
Preamble += "// Runtime copy/destroy helper functions (from Block_private.h)\n";
@@ -3704,21 +3707,19 @@
return S;
}
-std::string RewriteObjC::SynthesizeBlockImpl(BlockExpr *CE, std::string Tag,
- bool hasCopyDisposeHelpers) {
+std::string RewriteObjC::SynthesizeBlockImpl(BlockExpr *CE, std::string Tag,
+ std::string Desc) {
std::string S = "\nstruct " + Tag;
std::string Constructor = " " + Tag;
S += " {\n struct __block_impl impl;\n";
-
- if (hasCopyDisposeHelpers)
- S += " void *copy;\n void *dispose;\n";
+ S += " struct " + Desc;
+ S += "* Desc;\n";
- Constructor += "(void *fp";
+ Constructor += "(void *fp, "; // Invoke function pointer.
+ Constructor += "struct " + Desc; // Descriptor pointer.
+ Constructor += " *desc";
- if (hasCopyDisposeHelpers)
- Constructor += ", void *copyHelp, void *disposeHelp";
-
if (BlockDeclRefs.size()) {
// Output all "by copy" declarations.
for (llvm::SmallPtrSet<ValueDecl*,8>::iterator I = BlockByCopyDecls.begin(),
@@ -3778,11 +3779,9 @@
Constructor += " impl.isa = &_NSConcreteGlobalBlock;\n";
else
Constructor += " impl.isa = &_NSConcreteStackBlock;\n";
- Constructor += " impl.Size = sizeof(";
- Constructor += Tag + ");\n impl.Flags = flags;\n impl.FuncPtr = fp;\n";
+ Constructor += " impl.Flags = flags;\n impl.FuncPtr = fp;\n";
- if (hasCopyDisposeHelpers)
- Constructor += " copy = copyHelp;\n dispose = disposeHelp;\n";
+ Constructor += " Desc = desc;\n";
// Initialize all "by copy" arguments.
for (llvm::SmallPtrSet<ValueDecl*,8>::iterator I = BlockByCopyDecls.begin(),
@@ -3813,10 +3812,8 @@
Constructor += " impl.isa = &_NSConcreteGlobalBlock;\n";
else
Constructor += " impl.isa = &_NSConcreteStackBlock;\n";
- Constructor += " impl.Size = sizeof(";
- Constructor += Tag + ");\n impl.Flags = flags;\n impl.FuncPtr = fp;\n";
- if (hasCopyDisposeHelpers)
- Constructor += " copy = copyHelp;\n dispose = disposeHelp;\n";
+ Constructor += " impl.Flags = flags;\n impl.FuncPtr = fp;\n";
+ Constructor += " Desc = desc;\n";
}
Constructor += " ";
Constructor += "}\n";
@@ -3825,6 +3822,29 @@
return S;
}
+std::string RewriteObjC::SynthesizeBlockDescriptor(std::string Tag, int i,
+ const char *FunName,
+ unsigned hasCopy) {
+ std::string S = "\nstatic struct " + Tag;
+ std::string Constructor = " " + Tag;
+
+ S += " {\n unsigned long reserved;\n";
+ S += " unsigned long Block_size;\n";
+ if (hasCopy) {
+ S += " void *copy;\n void *dispose;\n";
+ }
+ S += "} ";
+
+ S += Tag + "_DATA = { 0, sizeof(struct ";
+ S += Tag + ")";
+ if (hasCopy) {
+ S += ", __" + std::string(FunName) + "_block_copy_" + utostr(i);
+ S += ", __" + std::string(FunName) + "_block_dispose_" + utostr(i);
+ }
+ S += "};\n";
+ return S;
+}
+
void RewriteObjC::SynthesizeBlockLiterals(SourceLocation FunLocStart,
const char *FunName) {
// Insert closures that were part of the function.
@@ -3833,9 +3853,9 @@
CollectBlockDeclRefInfo(Blocks[i]);
std::string Tag = "__" + std::string(FunName) + "_block_impl_" + utostr(i);
+ std::string Desc = "__" + std::string(FunName) + "_block_desc_" + utostr(i);
- std::string CI = SynthesizeBlockImpl(Blocks[i], Tag,
- ImportedBlockDecls.size() > 0);
+ std::string CI = SynthesizeBlockImpl(Blocks[i], Tag, Desc);
InsertText(FunLocStart, CI.c_str(), CI.size());
@@ -3848,6 +3868,10 @@
InsertText(FunLocStart, HF.c_str(), HF.size());
}
+ std::string BD = SynthesizeBlockDescriptor(Desc, i, FunName,
+ ImportedBlockDecls.size() > 0);
+ InsertText(FunLocStart, BD.c_str(), BD.size());
+
BlockDeclRefs.clear();
BlockByRefDecls.clear();
BlockByCopyDecls.clear();
@@ -4240,21 +4264,21 @@
Context->VoidPtrTy, SourceLocation(), SourceLocation());
InitExprs.push_back(castExpr);
- if (ImportedBlockDecls.size()) {
- std::string Buf = "__" + FuncName + "_block_copy_" + BlockNumber;
- FD = SynthBlockInitFunctionDecl(Buf.c_str());
- Arg = new DeclRefExpr(FD, FD->getType(), SourceLocation());
- castExpr = new CStyleCastExpr(Context->VoidPtrTy, Arg,
- Context->VoidPtrTy, SourceLocation(), SourceLocation());
- InitExprs.push_back(castExpr);
-
- Buf = "__" + FuncName + "_block_dispose_" + BlockNumber;
- FD = SynthBlockInitFunctionDecl(Buf.c_str());
- Arg = new DeclRefExpr(FD, FD->getType(), SourceLocation());
- castExpr = new CStyleCastExpr(Context->VoidPtrTy, Arg,
- Context->VoidPtrTy, SourceLocation(), SourceLocation());
- InitExprs.push_back(castExpr);
- }
+ // Initialize the block descriptor.
+ std::string DescData = "__" + FuncName + "_block_desc_" + BlockNumber + "_DATA";
+
+ VarDecl *NewVD = VarDecl::Create(*Context, TUDecl, SourceLocation(),
+ &Context->Idents.get(DescData.c_str()),
+ Context->VoidPtrTy,
+ VarDecl::Static);
+ UnaryOperator *DescRefExpr = new UnaryOperator(
+ new DeclRefExpr(NewVD, Context->VoidPtrTy,
+ SourceLocation()),
+ UnaryOperator::AddrOf,
+ Context->getPointerType(Context->VoidPtrTy),
+ SourceLocation());
+ InitExprs.push_back(DescRefExpr);
+
// Add initializers for any closure decl refs.
if (BlockDeclRefs.size()) {
Expr *Exp;
More information about the llvm-branch-commits
mailing list