Home | History | Annotate | Download | only in Rewrite
      1 //===--- RewriteObjC.cpp - Playground for the code rewriter ---------------===//
      2 //
      3 //                     The LLVM Compiler Infrastructure
      4 //
      5 // This file is distributed under the University of Illinois Open Source
      6 // License. See LICENSE.TXT for details.
      7 //
      8 //===----------------------------------------------------------------------===//
      9 //
     10 // Hacks and fun related to the code rewriter.
     11 //
     12 //===----------------------------------------------------------------------===//
     13 
     14 #include "clang/Rewrite/ASTConsumers.h"
     15 #include "clang/Rewrite/Rewriter.h"
     16 #include "clang/AST/AST.h"
     17 #include "clang/AST/ASTConsumer.h"
     18 #include "clang/AST/ParentMap.h"
     19 #include "clang/Basic/SourceManager.h"
     20 #include "clang/Basic/IdentifierTable.h"
     21 #include "clang/Basic/Diagnostic.h"
     22 #include "clang/Lex/Lexer.h"
     23 #include "llvm/Support/MemoryBuffer.h"
     24 #include "llvm/Support/raw_ostream.h"
     25 #include "llvm/ADT/StringExtras.h"
     26 #include "llvm/ADT/SmallPtrSet.h"
     27 #include "llvm/ADT/OwningPtr.h"
     28 #include "llvm/ADT/DenseSet.h"
     29 
     30 using namespace clang;
     31 using llvm::utostr;
     32 
     33 namespace {
     34   class RewriteObjC : public ASTConsumer {
     35     enum {
     36       BLOCK_FIELD_IS_OBJECT   =  3,  /* id, NSObject, __attribute__((NSObject)),
     37                                         block, ... */
     38       BLOCK_FIELD_IS_BLOCK    =  7,  /* a block variable */
     39       BLOCK_FIELD_IS_BYREF    =  8,  /* the on stack structure holding the
     40                                         __block variable */
     41       BLOCK_FIELD_IS_WEAK     = 16,  /* declared __weak, only used in byref copy
     42                                         helpers */
     43       BLOCK_BYREF_CALLER      = 128, /* called from __block (byref) copy/dispose
     44                                         support routines */
     45       BLOCK_BYREF_CURRENT_MAX = 256
     46     };
     47 
     48     enum {
     49       BLOCK_NEEDS_FREE =        (1 << 24),
     50       BLOCK_HAS_COPY_DISPOSE =  (1 << 25),
     51       BLOCK_HAS_CXX_OBJ =       (1 << 26),
     52       BLOCK_IS_GC =             (1 << 27),
     53       BLOCK_IS_GLOBAL =         (1 << 28),
     54       BLOCK_HAS_DESCRIPTOR =    (1 << 29)
     55     };
     56 
     57     Rewriter Rewrite;
     58     Diagnostic &Diags;
     59     const LangOptions &LangOpts;
     60     unsigned RewriteFailedDiag;
     61     unsigned TryFinallyContainsReturnDiag;
     62 
     63     ASTContext *Context;
     64     SourceManager *SM;
     65     TranslationUnitDecl *TUDecl;
     66     FileID MainFileID;
     67     const char *MainFileStart, *MainFileEnd;
     68     SourceLocation LastIncLoc;
     69 
     70     llvm::SmallVector<ObjCImplementationDecl *, 8> ClassImplementation;
     71     llvm::SmallVector<ObjCCategoryImplDecl *, 8> CategoryImplementation;
     72     llvm::SmallPtrSet<ObjCInterfaceDecl*, 8> ObjCSynthesizedStructs;
     73     llvm::SmallPtrSet<ObjCProtocolDecl*, 8> ObjCSynthesizedProtocols;
     74     llvm::SmallPtrSet<ObjCInterfaceDecl*, 8> ObjCForwardDecls;
     75     llvm::DenseMap<ObjCMethodDecl*, std::string> MethodInternalNames;
     76     llvm::SmallVector<Stmt *, 32> Stmts;
     77     llvm::SmallVector<int, 8> ObjCBcLabelNo;
     78     // Remember all the @protocol(<expr>) expressions.
     79     llvm::SmallPtrSet<ObjCProtocolDecl *, 32> ProtocolExprDecls;
     80 
     81     llvm::DenseSet<uint64_t> CopyDestroyCache;
     82 
     83     unsigned NumObjCStringLiterals;
     84 
     85     FunctionDecl *MsgSendFunctionDecl;
     86     FunctionDecl *MsgSendSuperFunctionDecl;
     87     FunctionDecl *MsgSendStretFunctionDecl;
     88     FunctionDecl *MsgSendSuperStretFunctionDecl;
     89     FunctionDecl *MsgSendFpretFunctionDecl;
     90     FunctionDecl *GetClassFunctionDecl;
     91     FunctionDecl *GetMetaClassFunctionDecl;
     92     FunctionDecl *GetSuperClassFunctionDecl;
     93     FunctionDecl *SelGetUidFunctionDecl;
     94     FunctionDecl *CFStringFunctionDecl;
     95     FunctionDecl *SuperContructorFunctionDecl;
     96 
     97     // ObjC string constant support.
     98     VarDecl *ConstantStringClassReference;
     99     RecordDecl *NSStringRecord;
    100 
    101     // ObjC foreach break/continue generation support.
    102     int BcLabelCount;
    103 
    104     // Needed for super.
    105     ObjCMethodDecl *CurMethodDef;
    106     RecordDecl *SuperStructDecl;
    107     RecordDecl *ConstantStringDecl;
    108 
    109     TypeDecl *ProtocolTypeDecl;
    110     QualType getProtocolType();
    111 
    112     // Needed for header files being rewritten
    113     bool IsHeader;
    114 
    115     std::string InFileName;
    116     llvm::raw_ostream* OutFile;
    117 
    118     bool SilenceRewriteMacroWarning;
    119     bool objc_impl_method;
    120 
    121     std::string Preamble;
    122 
    123     // Block expressions.
    124     llvm::SmallVector<BlockExpr *, 32> Blocks;
    125     llvm::SmallVector<int, 32> InnerDeclRefsCount;
    126     llvm::SmallVector<BlockDeclRefExpr *, 32> InnerDeclRefs;
    127 
    128     llvm::SmallVector<BlockDeclRefExpr *, 32> BlockDeclRefs;
    129 
    130     // Block related declarations.
    131     llvm::SmallVector<ValueDecl *, 8> BlockByCopyDecls;
    132     llvm::SmallPtrSet<ValueDecl *, 8> BlockByCopyDeclsPtrSet;
    133     llvm::SmallVector<ValueDecl *, 8> BlockByRefDecls;
    134     llvm::SmallPtrSet<ValueDecl *, 8> BlockByRefDeclsPtrSet;
    135     llvm::DenseMap<ValueDecl *, unsigned> BlockByRefDeclNo;
    136     llvm::SmallPtrSet<ValueDecl *, 8> ImportedBlockDecls;
    137     llvm::SmallPtrSet<VarDecl *, 8> ImportedLocalExternalDecls;
    138 
    139     llvm::DenseMap<BlockExpr *, std::string> RewrittenBlockExprs;
    140 
    141     // This maps a property to it's assignment statement.
    142     llvm::DenseMap<Expr *, BinaryOperator *> PropSetters;
    143     // This maps a property to it's synthesied message expression.
    144     // This allows us to rewrite chained getters (e.g. o.a.b.c).
    145     llvm::DenseMap<Expr *, Stmt *> PropGetters;
    146 
    147     // This maps an original source AST to it's rewritten form. This allows
    148     // us to avoid rewriting the same node twice (which is very uncommon).
    149     // This is needed to support some of the exotic property rewriting.
    150     llvm::DenseMap<Stmt *, Stmt *> ReplacedNodes;
    151 
    152     FunctionDecl *CurFunctionDef;
    153     FunctionDecl *CurFunctionDeclToDeclareForBlock;
    154     VarDecl *GlobalVarDecl;
    155 
    156     bool DisableReplaceStmt;
    157 
    158     static const int OBJC_ABI_VERSION = 7;
    159   public:
    160     virtual void Initialize(ASTContext &context);
    161 
    162     // Top Level Driver code.
    163     virtual void HandleTopLevelDecl(DeclGroupRef D) {
    164       for (DeclGroupRef::iterator I = D.begin(), E = D.end(); I != E; ++I)
    165         HandleTopLevelSingleDecl(*I);
    166     }
    167     void HandleTopLevelSingleDecl(Decl *D);
    168     void HandleDeclInMainFile(Decl *D);
    169     RewriteObjC(std::string inFile, llvm::raw_ostream *OS,
    170                 Diagnostic &D, const LangOptions &LOpts,
    171                 bool silenceMacroWarn);
    172 
    173     ~RewriteObjC() {}
    174 
    175     virtual void HandleTranslationUnit(ASTContext &C);
    176 
    177     void ReplaceStmt(Stmt *Old, Stmt *New) {
    178       Stmt *ReplacingStmt = ReplacedNodes[Old];
    179 
    180       if (ReplacingStmt)
    181         return; // We can't rewrite the same node twice.
    182 
    183       if (DisableReplaceStmt)
    184         return; // Used when rewriting the assignment of a property setter.
    185 
    186       // If replacement succeeded or warning disabled return with no warning.
    187       if (!Rewrite.ReplaceStmt(Old, New)) {
    188         ReplacedNodes[Old] = New;
    189         return;
    190       }
    191       if (SilenceRewriteMacroWarning)
    192         return;
    193       Diags.Report(Context->getFullLoc(Old->getLocStart()), RewriteFailedDiag)
    194                    << Old->getSourceRange();
    195     }
    196 
    197     void ReplaceStmtWithRange(Stmt *Old, Stmt *New, SourceRange SrcRange) {
    198       // Measure the old text.
    199       int Size = Rewrite.getRangeSize(SrcRange);
    200       if (Size == -1) {
    201         Diags.Report(Context->getFullLoc(Old->getLocStart()), RewriteFailedDiag)
    202                      << Old->getSourceRange();
    203         return;
    204       }
    205       // Get the new text.
    206       std::string SStr;
    207       llvm::raw_string_ostream S(SStr);
    208       New->printPretty(S, *Context, 0, PrintingPolicy(LangOpts));
    209       const std::string &Str = S.str();
    210 
    211       // If replacement succeeded or warning disabled return with no warning.
    212       if (!Rewrite.ReplaceText(SrcRange.getBegin(), Size, Str)) {
    213         ReplacedNodes[Old] = New;
    214         return;
    215       }
    216       if (SilenceRewriteMacroWarning)
    217         return;
    218       Diags.Report(Context->getFullLoc(Old->getLocStart()), RewriteFailedDiag)
    219                    << Old->getSourceRange();
    220     }
    221 
    222     void InsertText(SourceLocation Loc, llvm::StringRef Str,
    223                     bool InsertAfter = true) {
    224       // If insertion succeeded or warning disabled return with no warning.
    225       if (!Rewrite.InsertText(Loc, Str, InsertAfter) ||
    226           SilenceRewriteMacroWarning)
    227         return;
    228 
    229       Diags.Report(Context->getFullLoc(Loc), RewriteFailedDiag);
    230     }
    231 
    232     void ReplaceText(SourceLocation Start, unsigned OrigLength,
    233                      llvm::StringRef Str) {
    234       // If removal succeeded or warning disabled return with no warning.
    235       if (!Rewrite.ReplaceText(Start, OrigLength, Str) ||
    236           SilenceRewriteMacroWarning)
    237         return;
    238 
    239       Diags.Report(Context->getFullLoc(Start), RewriteFailedDiag);
    240     }
    241 
    242     // Syntactic Rewriting.
    243     void RewriteInclude();
    244     void RewriteForwardClassDecl(ObjCClassDecl *Dcl);
    245     void RewritePropertyImplDecl(ObjCPropertyImplDecl *PID,
    246                                  ObjCImplementationDecl *IMD,
    247                                  ObjCCategoryImplDecl *CID);
    248     void RewriteInterfaceDecl(ObjCInterfaceDecl *Dcl);
    249     void RewriteImplementationDecl(Decl *Dcl);
    250     void RewriteObjCMethodDecl(const ObjCInterfaceDecl *IDecl,
    251                                ObjCMethodDecl *MDecl, std::string &ResultStr);
    252     void RewriteTypeIntoString(QualType T, std::string &ResultStr,
    253                                const FunctionType *&FPRetType);
    254     void RewriteByRefString(std::string &ResultStr, const std::string &Name,
    255                             ValueDecl *VD, bool def=false);
    256     void RewriteCategoryDecl(ObjCCategoryDecl *Dcl);
    257     void RewriteProtocolDecl(ObjCProtocolDecl *Dcl);
    258     void RewriteForwardProtocolDecl(ObjCForwardProtocolDecl *Dcl);
    259     void RewriteMethodDeclaration(ObjCMethodDecl *Method);
    260     void RewriteProperty(ObjCPropertyDecl *prop);
    261     void RewriteFunctionDecl(FunctionDecl *FD);
    262     void RewriteBlockPointerType(std::string& Str, QualType Type);
    263     void RewriteBlockPointerTypeVariable(std::string& Str, ValueDecl *VD);
    264     void RewriteBlockLiteralFunctionDecl(FunctionDecl *FD);
    265     void RewriteObjCQualifiedInterfaceTypes(Decl *Dcl);
    266     void RewriteTypeOfDecl(VarDecl *VD);
    267     void RewriteObjCQualifiedInterfaceTypes(Expr *E);
    268     bool needToScanForQualifiers(QualType T);
    269     QualType getSuperStructType();
    270     QualType getConstantStringStructType();
    271     QualType convertFunctionTypeOfBlocks(const FunctionType *FT);
    272     bool BufferContainsPPDirectives(const char *startBuf, const char *endBuf);
    273 
    274     // Expression Rewriting.
    275     Stmt *RewriteFunctionBodyOrGlobalInitializer(Stmt *S);
    276     void CollectPropertySetters(Stmt *S);
    277 
    278     Stmt *CurrentBody;
    279     ParentMap *PropParentMap; // created lazily.
    280 
    281     Stmt *RewriteAtEncode(ObjCEncodeExpr *Exp);
    282     Stmt *RewriteObjCIvarRefExpr(ObjCIvarRefExpr *IV, SourceLocation OrigStart,
    283                                  bool &replaced);
    284     Stmt *RewriteObjCNestedIvarRefExpr(Stmt *S, bool &replaced);
    285     Stmt *RewritePropertyOrImplicitGetter(Expr *PropOrGetterRefExpr);
    286     Stmt *RewritePropertyOrImplicitSetter(BinaryOperator *BinOp, Expr *newStmt,
    287                                 SourceRange SrcRange);
    288     Stmt *RewriteAtSelector(ObjCSelectorExpr *Exp);
    289     Stmt *RewriteMessageExpr(ObjCMessageExpr *Exp);
    290     Stmt *RewriteObjCStringLiteral(ObjCStringLiteral *Exp);
    291     Stmt *RewriteObjCProtocolExpr(ObjCProtocolExpr *Exp);
    292     void WarnAboutReturnGotoStmts(Stmt *S);
    293     void HasReturnStmts(Stmt *S, bool &hasReturns);
    294     void RewriteTryReturnStmts(Stmt *S);
    295     void RewriteSyncReturnStmts(Stmt *S, std::string buf);
    296     Stmt *RewriteObjCTryStmt(ObjCAtTryStmt *S);
    297     Stmt *RewriteObjCSynchronizedStmt(ObjCAtSynchronizedStmt *S);
    298     Stmt *RewriteObjCThrowStmt(ObjCAtThrowStmt *S);
    299     Stmt *RewriteObjCForCollectionStmt(ObjCForCollectionStmt *S,
    300                                        SourceLocation OrigEnd);
    301     bool IsDeclStmtInForeachHeader(DeclStmt *DS);
    302     CallExpr *SynthesizeCallToFunctionDecl(FunctionDecl *FD,
    303                                       Expr **args, unsigned nargs,
    304                                       SourceLocation StartLoc=SourceLocation(),
    305                                       SourceLocation EndLoc=SourceLocation());
    306     Stmt *SynthMessageExpr(ObjCMessageExpr *Exp,
    307                            SourceLocation StartLoc=SourceLocation(),
    308                            SourceLocation EndLoc=SourceLocation());
    309     Stmt *RewriteBreakStmt(BreakStmt *S);
    310     Stmt *RewriteContinueStmt(ContinueStmt *S);
    311     void SynthCountByEnumWithState(std::string &buf);
    312 
    313     void SynthMsgSendFunctionDecl();
    314     void SynthMsgSendSuperFunctionDecl();
    315     void SynthMsgSendStretFunctionDecl();
    316     void SynthMsgSendFpretFunctionDecl();
    317     void SynthMsgSendSuperStretFunctionDecl();
    318     void SynthGetClassFunctionDecl();
    319     void SynthGetMetaClassFunctionDecl();
    320     void SynthGetSuperClassFunctionDecl();
    321     void SynthSelGetUidFunctionDecl();
    322     void SynthSuperContructorFunctionDecl();
    323 
    324     // Metadata emission.
    325     void RewriteObjCClassMetaData(ObjCImplementationDecl *IDecl,
    326                                   std::string &Result);
    327 
    328     void RewriteObjCCategoryImplDecl(ObjCCategoryImplDecl *CDecl,
    329                                      std::string &Result);
    330 
    331     template<typename MethodIterator>
    332     void RewriteObjCMethodsMetaData(MethodIterator MethodBegin,
    333                                     MethodIterator MethodEnd,
    334                                     bool IsInstanceMethod,
    335                                     llvm::StringRef prefix,
    336                                     llvm::StringRef ClassName,
    337                                     std::string &Result);
    338 
    339     void RewriteObjCProtocolMetaData(ObjCProtocolDecl *Protocol,
    340                                      llvm::StringRef prefix,
    341                                      llvm::StringRef ClassName,
    342                                      std::string &Result);
    343     void RewriteObjCProtocolListMetaData(const ObjCList<ObjCProtocolDecl> &Prots,
    344                                          llvm::StringRef prefix,
    345                                          llvm::StringRef ClassName,
    346                                          std::string &Result);
    347     void SynthesizeObjCInternalStruct(ObjCInterfaceDecl *CDecl,
    348                                       std::string &Result);
    349     void SynthesizeIvarOffsetComputation(ObjCIvarDecl *ivar,
    350                                          std::string &Result);
    351     void RewriteImplementations();
    352     void SynthesizeMetaDataIntoBuffer(std::string &Result);
    353 
    354     // Block rewriting.
    355     void RewriteBlocksInFunctionProtoType(QualType funcType, NamedDecl *D);
    356     void CheckFunctionPointerDecl(QualType dType, NamedDecl *ND);
    357 
    358     void InsertBlockLiteralsWithinFunction(FunctionDecl *FD);
    359     void InsertBlockLiteralsWithinMethod(ObjCMethodDecl *MD);
    360 
    361     // Block specific rewrite rules.
    362     void RewriteBlockPointerDecl(NamedDecl *VD);
    363     void RewriteByRefVar(VarDecl *VD);
    364     std::string SynthesizeByrefCopyDestroyHelper(VarDecl *VD, int flag);
    365     Stmt *RewriteBlockDeclRefExpr(Expr *VD);
    366     Stmt *RewriteLocalVariableExternalStorage(DeclRefExpr *DRE);
    367     void RewriteBlockPointerFunctionArgs(FunctionDecl *FD);
    368 
    369     std::string SynthesizeBlockHelperFuncs(BlockExpr *CE, int i,
    370                                       llvm::StringRef funcName, std::string Tag);
    371     std::string SynthesizeBlockFunc(BlockExpr *CE, int i,
    372                                       llvm::StringRef funcName, std::string Tag);
    373     std::string SynthesizeBlockImpl(BlockExpr *CE,
    374                                     std::string Tag, std::string Desc);
    375     std::string SynthesizeBlockDescriptor(std::string DescTag,
    376                                           std::string ImplTag,
    377                                           int i, llvm::StringRef funcName,
    378                                           unsigned hasCopy);
    379     Stmt *SynthesizeBlockCall(CallExpr *Exp, const Expr* BlockExp);
    380     void SynthesizeBlockLiterals(SourceLocation FunLocStart,
    381                                  llvm::StringRef FunName);
    382     void RewriteRecordBody(RecordDecl *RD);
    383 
    384     void CollectBlockDeclRefInfo(BlockExpr *Exp);
    385     void GetBlockDeclRefExprs(Stmt *S);
    386     void GetInnerBlockDeclRefExprs(Stmt *S,
    387                 llvm::SmallVector<BlockDeclRefExpr *, 8> &InnerBlockDeclRefs,
    388                 llvm::SmallPtrSet<const DeclContext *, 8> &InnerContexts);
    389 
    390     // We avoid calling Type::isBlockPointerType(), since it operates on the
    391     // canonical type. We only care if the top-level type is a closure pointer.
    392     bool isTopLevelBlockPointerType(QualType T) {
    393       return isa<BlockPointerType>(T);
    394     }
    395 
    396     /// convertBlockPointerToFunctionPointer - Converts a block-pointer type
    397     /// to a function pointer type and upon success, returns true; false
    398     /// otherwise.
    399     bool convertBlockPointerToFunctionPointer(QualType &T) {
    400       if (isTopLevelBlockPointerType(T)) {
    401         const BlockPointerType *BPT = T->getAs<BlockPointerType>();
    402         T = Context->getPointerType(BPT->getPointeeType());
    403         return true;
    404       }
    405       return false;
    406     }
    407 
    408     void convertToUnqualifiedObjCType(QualType &T) {
    409       if (T->isObjCQualifiedIdType())
    410         T = Context->getObjCIdType();
    411       else if (T->isObjCQualifiedClassType())
    412         T = Context->getObjCClassType();
    413       else if (T->isObjCObjectPointerType() &&
    414                T->getPointeeType()->isObjCQualifiedInterfaceType())
    415         T = Context->getObjCIdType();
    416     }
    417 
    418     // FIXME: This predicate seems like it would be useful to add to ASTContext.
    419     bool isObjCType(QualType T) {
    420       if (!LangOpts.ObjC1 && !LangOpts.ObjC2)
    421         return false;
    422 
    423       QualType OCT = Context->getCanonicalType(T).getUnqualifiedType();
    424 
    425       if (OCT == Context->getCanonicalType(Context->getObjCIdType()) ||
    426           OCT == Context->getCanonicalType(Context->getObjCClassType()))
    427         return true;
    428 
    429       if (const PointerType *PT = OCT->getAs<PointerType>()) {
    430         if (isa<ObjCInterfaceType>(PT->getPointeeType()) ||
    431             PT->getPointeeType()->isObjCQualifiedIdType())
    432           return true;
    433       }
    434       return false;
    435     }
    436     bool PointerTypeTakesAnyBlockArguments(QualType QT);
    437     bool PointerTypeTakesAnyObjCQualifiedType(QualType QT);
    438     void GetExtentOfArgList(const char *Name, const char *&LParen,
    439                             const char *&RParen);
    440     void RewriteCastExpr(CStyleCastExpr *CE);
    441 
    442     FunctionDecl *SynthBlockInitFunctionDecl(llvm::StringRef name);
    443     Stmt *SynthBlockInitExpr(BlockExpr *Exp,
    444             const llvm::SmallVector<BlockDeclRefExpr *, 8> &InnerBlockDeclRefs);
    445 
    446     void QuoteDoublequotes(std::string &From, std::string &To) {
    447       for (unsigned i = 0; i < From.length(); i++) {
    448         if (From[i] == '"')
    449           To += "\\\"";
    450         else
    451           To += From[i];
    452       }
    453     }
    454 
    455     QualType getSimpleFunctionType(QualType result,
    456                                    const QualType *args,
    457                                    unsigned numArgs,
    458                                    bool variadic = false) {
    459       FunctionProtoType::ExtProtoInfo fpi;
    460       fpi.Variadic = variadic;
    461       return Context->getFunctionType(result, args, numArgs, fpi);
    462     }
    463   };
    464 
    465   // Helper function: create a CStyleCastExpr with trivial type source info.
    466   CStyleCastExpr* NoTypeInfoCStyleCastExpr(ASTContext *Ctx, QualType Ty,
    467                                            CastKind Kind, Expr *E) {
    468     TypeSourceInfo *TInfo = Ctx->getTrivialTypeSourceInfo(Ty, SourceLocation());
    469     return CStyleCastExpr::Create(*Ctx, Ty, VK_RValue, Kind, E, 0, TInfo,
    470                                   SourceLocation(), SourceLocation());
    471   }
    472 }
    473 
    474 void RewriteObjC::RewriteBlocksInFunctionProtoType(QualType funcType,
    475                                                    NamedDecl *D) {
    476   if (const FunctionProtoType *fproto
    477       = dyn_cast<FunctionProtoType>(funcType.IgnoreParens())) {
    478     for (FunctionProtoType::arg_type_iterator I = fproto->arg_type_begin(),
    479          E = fproto->arg_type_end(); I && (I != E); ++I)
    480       if (isTopLevelBlockPointerType(*I)) {
    481         // All the args are checked/rewritten. Don't call twice!
    482         RewriteBlockPointerDecl(D);
    483         break;
    484       }
    485   }
    486 }
    487 
    488 void RewriteObjC::CheckFunctionPointerDecl(QualType funcType, NamedDecl *ND) {
    489   const PointerType *PT = funcType->getAs<PointerType>();
    490   if (PT && PointerTypeTakesAnyBlockArguments(funcType))
    491     RewriteBlocksInFunctionProtoType(PT->getPointeeType(), ND);
    492 }
    493 
    494 static bool IsHeaderFile(const std::string &Filename) {
    495   std::string::size_type DotPos = Filename.rfind('.');
    496 
    497   if (DotPos == std::string::npos) {
    498     // no file extension
    499     return false;
    500   }
    501 
    502   std::string Ext = std::string(Filename.begin()+DotPos+1, Filename.end());
    503   // C header: .h
    504   // C++ header: .hh or .H;
    505   return Ext == "h" || Ext == "hh" || Ext == "H";
    506 }
    507 
    508 RewriteObjC::RewriteObjC(std::string inFile, llvm::raw_ostream* OS,
    509                          Diagnostic &D, const LangOptions &LOpts,
    510                          bool silenceMacroWarn)
    511       : Diags(D), LangOpts(LOpts), InFileName(inFile), OutFile(OS),
    512         SilenceRewriteMacroWarning(silenceMacroWarn) {
    513   IsHeader = IsHeaderFile(inFile);
    514   RewriteFailedDiag = Diags.getCustomDiagID(Diagnostic::Warning,
    515                "rewriting sub-expression within a macro (may not be correct)");
    516   TryFinallyContainsReturnDiag = Diags.getCustomDiagID(Diagnostic::Warning,
    517                "rewriter doesn't support user-specified control flow semantics "
    518                "for @try/@finally (code may not execute properly)");
    519 }
    520 
    521 ASTConsumer *clang::CreateObjCRewriter(const std::string& InFile,
    522                                        llvm::raw_ostream* OS,
    523                                        Diagnostic &Diags,
    524                                        const LangOptions &LOpts,
    525                                        bool SilenceRewriteMacroWarning) {
    526   return new RewriteObjC(InFile, OS, Diags, LOpts, SilenceRewriteMacroWarning);
    527 }
    528 
    529 void RewriteObjC::Initialize(ASTContext &context) {
    530   Context = &context;
    531   SM = &Context->getSourceManager();
    532   TUDecl = Context->getTranslationUnitDecl();
    533   MsgSendFunctionDecl = 0;
    534   MsgSendSuperFunctionDecl = 0;
    535   MsgSendStretFunctionDecl = 0;
    536   MsgSendSuperStretFunctionDecl = 0;
    537   MsgSendFpretFunctionDecl = 0;
    538   GetClassFunctionDecl = 0;
    539   GetMetaClassFunctionDecl = 0;
    540   GetSuperClassFunctionDecl = 0;
    541   SelGetUidFunctionDecl = 0;
    542   CFStringFunctionDecl = 0;
    543   ConstantStringClassReference = 0;
    544   NSStringRecord = 0;
    545   CurMethodDef = 0;
    546   CurFunctionDef = 0;
    547   CurFunctionDeclToDeclareForBlock = 0;
    548   GlobalVarDecl = 0;
    549   SuperStructDecl = 0;
    550   ProtocolTypeDecl = 0;
    551   ConstantStringDecl = 0;
    552   BcLabelCount = 0;
    553   SuperContructorFunctionDecl = 0;
    554   NumObjCStringLiterals = 0;
    555   PropParentMap = 0;
    556   CurrentBody = 0;
    557   DisableReplaceStmt = false;
    558   objc_impl_method = false;
    559 
    560   // Get the ID and start/end of the main file.
    561   MainFileID = SM->getMainFileID();
    562   const llvm::MemoryBuffer *MainBuf = SM->getBuffer(MainFileID);
    563   MainFileStart = MainBuf->getBufferStart();
    564   MainFileEnd = MainBuf->getBufferEnd();
    565 
    566   Rewrite.setSourceMgr(Context->getSourceManager(), Context->getLangOptions());
    567 
    568   // declaring objc_selector outside the parameter list removes a silly
    569   // scope related warning...
    570   if (IsHeader)
    571     Preamble = "#pragma once\n";
    572   Preamble += "struct objc_selector; struct objc_class;\n";
    573   Preamble += "struct __rw_objc_super { struct objc_object *object; ";
    574   Preamble += "struct objc_object *superClass; ";
    575   if (LangOpts.Microsoft) {
    576     // Add a constructor for creating temporary objects.
    577     Preamble += "__rw_objc_super(struct objc_object *o, struct objc_object *s) "
    578                 ": ";
    579     Preamble += "object(o), superClass(s) {} ";
    580   }
    581   Preamble += "};\n";
    582   Preamble += "#ifndef _REWRITER_typedef_Protocol\n";
    583   Preamble += "typedef struct objc_object Protocol;\n";
    584   Preamble += "#define _REWRITER_typedef_Protocol\n";
    585   Preamble += "#endif\n";
    586   if (LangOpts.Microsoft) {
    587     Preamble += "#define __OBJC_RW_DLLIMPORT extern \"C\" __declspec(dllimport)\n";
    588     Preamble += "#define __OBJC_RW_STATICIMPORT extern \"C\"\n";
    589   } else
    590   Preamble += "#define __OBJC_RW_DLLIMPORT extern\n";
    591   Preamble += "__OBJC_RW_DLLIMPORT struct objc_object *objc_msgSend";
    592   Preamble += "(struct objc_object *, struct objc_selector *, ...);\n";
    593   Preamble += "__OBJC_RW_DLLIMPORT struct objc_object *objc_msgSendSuper";
    594   Preamble += "(struct objc_super *, struct objc_selector *, ...);\n";
    595   Preamble += "__OBJC_RW_DLLIMPORT struct objc_object *objc_msgSend_stret";
    596   Preamble += "(struct objc_object *, struct objc_selector *, ...);\n";
    597   Preamble += "__OBJC_RW_DLLIMPORT struct objc_object *objc_msgSendSuper_stret";
    598   Preamble += "(struct objc_super *, struct objc_selector *, ...);\n";
    599   Preamble += "__OBJC_RW_DLLIMPORT double objc_msgSend_fpret";
    600   Preamble += "(struct objc_object *, struct objc_selector *, ...);\n";
    601   Preamble += "__OBJC_RW_DLLIMPORT struct objc_object *objc_getClass";
    602   Preamble += "(const char *);\n";
    603   Preamble += "__OBJC_RW_DLLIMPORT struct objc_class *class_getSuperclass";
    604   Preamble += "(struct objc_class *);\n";
    605   Preamble += "__OBJC_RW_DLLIMPORT struct objc_object *objc_getMetaClass";
    606   Preamble += "(const char *);\n";
    607   Preamble += "__OBJC_RW_DLLIMPORT void objc_exception_throw(struct objc_object *);\n";
    608   Preamble += "__OBJC_RW_DLLIMPORT void objc_exception_try_enter(void *);\n";
    609   Preamble += "__OBJC_RW_DLLIMPORT void objc_exception_try_exit(void *);\n";
    610   Preamble += "__OBJC_RW_DLLIMPORT struct objc_object *objc_exception_extract(void *);\n";
    611   Preamble += "__OBJC_RW_DLLIMPORT int objc_exception_match";
    612   Preamble += "(struct objc_class *, struct objc_object *);\n";
    613   // @synchronized hooks.
    614   Preamble += "__OBJC_RW_DLLIMPORT void objc_sync_enter(struct objc_object *);\n";
    615   Preamble += "__OBJC_RW_DLLIMPORT void objc_sync_exit(struct objc_object *);\n";
    616   Preamble += "__OBJC_RW_DLLIMPORT Protocol *objc_getProtocol(const char *);\n";
    617   Preamble += "#ifndef __FASTENUMERATIONSTATE\n";
    618   Preamble += "struct __objcFastEnumerationState {\n\t";
    619   Preamble += "unsigned long state;\n\t";
    620   Preamble += "void **itemsPtr;\n\t";
    621   Preamble += "unsigned long *mutationsPtr;\n\t";
    622   Preamble += "unsigned long extra[5];\n};\n";
    623   Preamble += "__OBJC_RW_DLLIMPORT void objc_enumerationMutation(struct objc_object *);\n";
    624   Preamble += "#define __FASTENUMERATIONSTATE\n";
    625   Preamble += "#endif\n";
    626   Preamble += "#ifndef __NSCONSTANTSTRINGIMPL\n";
    627   Preamble += "struct __NSConstantStringImpl {\n";
    628   Preamble += "  int *isa;\n";
    629   Preamble += "  int flags;\n";
    630   Preamble += "  char *str;\n";
    631   Preamble += "  long length;\n";
    632   Preamble += "};\n";
    633   Preamble += "#ifdef CF_EXPORT_CONSTANT_STRING\n";
    634   Preamble += "extern \"C\" __declspec(dllexport) int __CFConstantStringClassReference[];\n";
    635   Preamble += "#else\n";
    636   Preamble += "__OBJC_RW_DLLIMPORT int __CFConstantStringClassReference[];\n";
    637   Preamble += "#endif\n";
    638   Preamble += "#define __NSCONSTANTSTRINGIMPL\n";
    639   Preamble += "#endif\n";
    640   // Blocks preamble.
    641   Preamble += "#ifndef BLOCK_IMPL\n";
    642   Preamble += "#define BLOCK_IMPL\n";
    643   Preamble += "struct __block_impl {\n";
    644   Preamble += "  void *isa;\n";
    645   Preamble += "  int Flags;\n";
    646   Preamble += "  int Reserved;\n";
    647   Preamble += "  void *FuncPtr;\n";
    648   Preamble += "};\n";
    649   Preamble += "// Runtime copy/destroy helper functions (from Block_private.h)\n";
    650   Preamble += "#ifdef __OBJC_EXPORT_BLOCKS\n";
    651   Preamble += "extern \"C\" __declspec(dllexport) "
    652               "void _Block_object_assign(void *, const void *, const int);\n";
    653   Preamble += "extern \"C\" __declspec(dllexport) void _Block_object_dispose(const void *, const int);\n";
    654   Preamble += "extern \"C\" __declspec(dllexport) void *_NSConcreteGlobalBlock[32];\n";
    655   Preamble += "extern \"C\" __declspec(dllexport) void *_NSConcreteStackBlock[32];\n";
    656   Preamble += "#else\n";
    657   Preamble += "__OBJC_RW_DLLIMPORT void _Block_object_assign(void *, const void *, const int);\n";
    658   Preamble += "__OBJC_RW_DLLIMPORT void _Block_object_dispose(const void *, const int);\n";
    659   Preamble += "__OBJC_RW_DLLIMPORT void *_NSConcreteGlobalBlock[32];\n";
    660   Preamble += "__OBJC_RW_DLLIMPORT void *_NSConcreteStackBlock[32];\n";
    661   Preamble += "#endif\n";
    662   Preamble += "#endif\n";
    663   if (LangOpts.Microsoft) {
    664     Preamble += "#undef __OBJC_RW_DLLIMPORT\n";
    665     Preamble += "#undef __OBJC_RW_STATICIMPORT\n";
    666     Preamble += "#ifndef KEEP_ATTRIBUTES\n";  // We use this for clang tests.
    667     Preamble += "#define __attribute__(X)\n";
    668     Preamble += "#endif\n";
    669     Preamble += "#define __weak\n";
    670   }
    671   else {
    672     Preamble += "#define __block\n";
    673     Preamble += "#define __weak\n";
    674   }
    675   // NOTE! Windows uses LLP64 for 64bit mode. So, cast pointer to long long
    676   // as this avoids warning in any 64bit/32bit compilation model.
    677   Preamble += "\n#define __OFFSETOFIVAR__(TYPE, MEMBER) ((long long) &((TYPE *)0)->MEMBER)\n";
    678 }
    679 
    680 
    681 //===----------------------------------------------------------------------===//
    682 // Top Level Driver Code
    683 //===----------------------------------------------------------------------===//
    684 
    685 void RewriteObjC::HandleTopLevelSingleDecl(Decl *D) {
    686   if (Diags.hasErrorOccurred())
    687     return;
    688 
    689   // Two cases: either the decl could be in the main file, or it could be in a
    690   // #included file.  If the former, rewrite it now.  If the later, check to see
    691   // if we rewrote the #include/#import.
    692   SourceLocation Loc = D->getLocation();
    693   Loc = SM->getInstantiationLoc(Loc);
    694 
    695   // If this is for a builtin, ignore it.
    696   if (Loc.isInvalid()) return;
    697 
    698   // Look for built-in declarations that we need to refer during the rewrite.
    699   if (FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) {
    700     RewriteFunctionDecl(FD);
    701   } else if (VarDecl *FVD = dyn_cast<VarDecl>(D)) {
    702     // declared in <Foundation/NSString.h>
    703     if (FVD->getName() == "_NSConstantStringClassReference") {
    704       ConstantStringClassReference = FVD;
    705       return;
    706     }
    707   } else if (ObjCInterfaceDecl *MD = dyn_cast<ObjCInterfaceDecl>(D)) {
    708     RewriteInterfaceDecl(MD);
    709   } else if (ObjCCategoryDecl *CD = dyn_cast<ObjCCategoryDecl>(D)) {
    710     RewriteCategoryDecl(CD);
    711   } else if (ObjCProtocolDecl *PD = dyn_cast<ObjCProtocolDecl>(D)) {
    712     RewriteProtocolDecl(PD);
    713   } else if (ObjCForwardProtocolDecl *FP =
    714              dyn_cast<ObjCForwardProtocolDecl>(D)){
    715     RewriteForwardProtocolDecl(FP);
    716   } else if (LinkageSpecDecl *LSD = dyn_cast<LinkageSpecDecl>(D)) {
    717     // Recurse into linkage specifications
    718     for (DeclContext::decl_iterator DI = LSD->decls_begin(),
    719                                  DIEnd = LSD->decls_end();
    720          DI != DIEnd; ++DI)
    721       HandleTopLevelSingleDecl(*DI);
    722   }
    723   // If we have a decl in the main file, see if we should rewrite it.
    724   if (SM->isFromMainFile(Loc))
    725     return HandleDeclInMainFile(D);
    726 }
    727 
    728 //===----------------------------------------------------------------------===//
    729 // Syntactic (non-AST) Rewriting Code
    730 //===----------------------------------------------------------------------===//
    731 
    732 void RewriteObjC::RewriteInclude() {
    733   SourceLocation LocStart = SM->getLocForStartOfFile(MainFileID);
    734   llvm::StringRef MainBuf = SM->getBufferData(MainFileID);
    735   const char *MainBufStart = MainBuf.begin();
    736   const char *MainBufEnd = MainBuf.end();
    737   size_t ImportLen = strlen("import");
    738 
    739   // Loop over the whole file, looking for includes.
    740   for (const char *BufPtr = MainBufStart; BufPtr < MainBufEnd; ++BufPtr) {
    741     if (*BufPtr == '#') {
    742       if (++BufPtr == MainBufEnd)
    743         return;
    744       while (*BufPtr == ' ' || *BufPtr == '\t')
    745         if (++BufPtr == MainBufEnd)
    746           return;
    747       if (!strncmp(BufPtr, "import", ImportLen)) {
    748         // replace import with include
    749         SourceLocation ImportLoc =
    750           LocStart.getFileLocWithOffset(BufPtr-MainBufStart);
    751         ReplaceText(ImportLoc, ImportLen, "include");
    752         BufPtr += ImportLen;
    753       }
    754     }
    755   }
    756 }
    757 
    758 static std::string getIvarAccessString(ObjCIvarDecl *OID) {
    759   const ObjCInterfaceDecl *ClassDecl = OID->getContainingInterface();
    760   std::string S;
    761   S = "((struct ";
    762   S += ClassDecl->getIdentifier()->getName();
    763   S += "_IMPL *)self)->";
    764   S += OID->getName();
    765   return S;
    766 }
    767 
    768 void RewriteObjC::RewritePropertyImplDecl(ObjCPropertyImplDecl *PID,
    769                                           ObjCImplementationDecl *IMD,
    770                                           ObjCCategoryImplDecl *CID) {
    771   static bool objcGetPropertyDefined = false;
    772   static bool objcSetPropertyDefined = false;
    773   SourceLocation startLoc = PID->getLocStart();
    774   InsertText(startLoc, "// ");
    775   const char *startBuf = SM->getCharacterData(startLoc);
    776   assert((*startBuf == '@') && "bogus @synthesize location");
    777   const char *semiBuf = strchr(startBuf, ';');
    778   assert((*semiBuf == ';') && "@synthesize: can't find ';'");
    779   SourceLocation onePastSemiLoc =
    780     startLoc.getFileLocWithOffset(semiBuf-startBuf+1);
    781 
    782   if (PID->getPropertyImplementation() == ObjCPropertyImplDecl::Dynamic)
    783     return; // FIXME: is this correct?
    784 
    785   // Generate the 'getter' function.
    786   ObjCPropertyDecl *PD = PID->getPropertyDecl();
    787   ObjCIvarDecl *OID = PID->getPropertyIvarDecl();
    788 
    789   if (!OID)
    790     return;
    791   unsigned Attributes = PD->getPropertyAttributes();
    792   if (!PD->getGetterMethodDecl()->isDefined()) {
    793     bool GenGetProperty = !(Attributes & ObjCPropertyDecl::OBJC_PR_nonatomic) &&
    794                           (Attributes & (ObjCPropertyDecl::OBJC_PR_retain |
    795                                          ObjCPropertyDecl::OBJC_PR_copy));
    796     std::string Getr;
    797     if (GenGetProperty && !objcGetPropertyDefined) {
    798       objcGetPropertyDefined = true;
    799       // FIXME. Is this attribute correct in all cases?
    800       Getr = "\nextern \"C\" __declspec(dllimport) "
    801             "id objc_getProperty(id, SEL, long, bool);\n";
    802     }
    803     RewriteObjCMethodDecl(OID->getContainingInterface(),
    804                           PD->getGetterMethodDecl(), Getr);
    805     Getr += "{ ";
    806     // Synthesize an explicit cast to gain access to the ivar.
    807     // See objc-act.c:objc_synthesize_new_getter() for details.
    808     if (GenGetProperty) {
    809       // return objc_getProperty(self, _cmd, offsetof(ClassDecl, OID), 1)
    810       Getr += "typedef ";
    811       const FunctionType *FPRetType = 0;
    812       RewriteTypeIntoString(PD->getGetterMethodDecl()->getResultType(), Getr,
    813                             FPRetType);
    814       Getr += " _TYPE";
    815       if (FPRetType) {
    816         Getr += ")"; // close the precedence "scope" for "*".
    817 
    818         // Now, emit the argument types (if any).
    819         if (const FunctionProtoType *FT = dyn_cast<FunctionProtoType>(FPRetType)){
    820           Getr += "(";
    821           for (unsigned i = 0, e = FT->getNumArgs(); i != e; ++i) {
    822             if (i) Getr += ", ";
    823             std::string ParamStr = FT->getArgType(i).getAsString(
    824                                                           Context->PrintingPolicy);
    825             Getr += ParamStr;
    826           }
    827           if (FT->isVariadic()) {
    828             if (FT->getNumArgs()) Getr += ", ";
    829             Getr += "...";
    830           }
    831           Getr += ")";
    832         } else
    833           Getr += "()";
    834       }
    835       Getr += ";\n";
    836       Getr += "return (_TYPE)";
    837       Getr += "objc_getProperty(self, _cmd, ";
    838       SynthesizeIvarOffsetComputation(OID, Getr);
    839       Getr += ", 1)";
    840     }
    841     else
    842       Getr += "return " + getIvarAccessString(OID);
    843     Getr += "; }";
    844     InsertText(onePastSemiLoc, Getr);
    845   }
    846 
    847   if (PD->isReadOnly() || PD->getSetterMethodDecl()->isDefined())
    848     return;
    849 
    850   // Generate the 'setter' function.
    851   std::string Setr;
    852   bool GenSetProperty = Attributes & (ObjCPropertyDecl::OBJC_PR_retain |
    853                                       ObjCPropertyDecl::OBJC_PR_copy);
    854   if (GenSetProperty && !objcSetPropertyDefined) {
    855     objcSetPropertyDefined = true;
    856     // FIXME. Is this attribute correct in all cases?
    857     Setr = "\nextern \"C\" __declspec(dllimport) "
    858     "void objc_setProperty (id, SEL, long, id, bool, bool);\n";
    859   }
    860 
    861   RewriteObjCMethodDecl(OID->getContainingInterface(),
    862                         PD->getSetterMethodDecl(), Setr);
    863   Setr += "{ ";
    864   // Synthesize an explicit cast to initialize the ivar.
    865   // See objc-act.c:objc_synthesize_new_setter() for details.
    866   if (GenSetProperty) {
    867     Setr += "objc_setProperty (self, _cmd, ";
    868     SynthesizeIvarOffsetComputation(OID, Setr);
    869     Setr += ", (id)";
    870     Setr += PD->getName();
    871     Setr += ", ";
    872     if (Attributes & ObjCPropertyDecl::OBJC_PR_nonatomic)
    873       Setr += "0, ";
    874     else
    875       Setr += "1, ";
    876     if (Attributes & ObjCPropertyDecl::OBJC_PR_copy)
    877       Setr += "1)";
    878     else
    879       Setr += "0)";
    880   }
    881   else {
    882     Setr += getIvarAccessString(OID) + " = ";
    883     Setr += PD->getName();
    884   }
    885   Setr += "; }";
    886   InsertText(onePastSemiLoc, Setr);
    887 }
    888 
    889 void RewriteObjC::RewriteForwardClassDecl(ObjCClassDecl *ClassDecl) {
    890   // Get the start location and compute the semi location.
    891   SourceLocation startLoc = ClassDecl->getLocation();
    892   const char *startBuf = SM->getCharacterData(startLoc);
    893   const char *semiPtr = strchr(startBuf, ';');
    894 
    895   // Translate to typedef's that forward reference structs with the same name
    896   // as the class. As a convenience, we include the original declaration
    897   // as a comment.
    898   std::string typedefString;
    899   typedefString += "// @class ";
    900   for (ObjCClassDecl::iterator I = ClassDecl->begin(), E = ClassDecl->end();
    901        I != E; ++I) {
    902     ObjCInterfaceDecl *ForwardDecl = I->getInterface();
    903     typedefString += ForwardDecl->getNameAsString();
    904     if (I+1 != E)
    905       typedefString += ", ";
    906     else
    907       typedefString += ";\n";
    908   }
    909 
    910   for (ObjCClassDecl::iterator I = ClassDecl->begin(), E = ClassDecl->end();
    911        I != E; ++I) {
    912     ObjCInterfaceDecl *ForwardDecl = I->getInterface();
    913     typedefString += "#ifndef _REWRITER_typedef_";
    914     typedefString += ForwardDecl->getNameAsString();
    915     typedefString += "\n";
    916     typedefString += "#define _REWRITER_typedef_";
    917     typedefString += ForwardDecl->getNameAsString();
    918     typedefString += "\n";
    919     typedefString += "typedef struct objc_object ";
    920     typedefString += ForwardDecl->getNameAsString();
    921     typedefString += ";\n#endif\n";
    922   }
    923 
    924   // Replace the @class with typedefs corresponding to the classes.
    925   ReplaceText(startLoc, semiPtr-startBuf+1, typedefString);
    926 }
    927 
    928 void RewriteObjC::RewriteMethodDeclaration(ObjCMethodDecl *Method) {
    929   // When method is a synthesized one, such as a getter/setter there is
    930   // nothing to rewrite.
    931   if (Method->isSynthesized())
    932     return;
    933   SourceLocation LocStart = Method->getLocStart();
    934   SourceLocation LocEnd = Method->getLocEnd();
    935 
    936   if (SM->getInstantiationLineNumber(LocEnd) >
    937       SM->getInstantiationLineNumber(LocStart)) {
    938     InsertText(LocStart, "#if 0\n");
    939     ReplaceText(LocEnd, 1, ";\n#endif\n");
    940   } else {
    941     InsertText(LocStart, "// ");
    942   }
    943 }
    944 
    945 void RewriteObjC::RewriteProperty(ObjCPropertyDecl *prop) {
    946   SourceLocation Loc = prop->getAtLoc();
    947 
    948   ReplaceText(Loc, 0, "// ");
    949   // FIXME: handle properties that are declared across multiple lines.
    950 }
    951 
    952 void RewriteObjC::RewriteCategoryDecl(ObjCCategoryDecl *CatDecl) {
    953   SourceLocation LocStart = CatDecl->getLocStart();
    954 
    955   // FIXME: handle category headers that are declared across multiple lines.
    956   ReplaceText(LocStart, 0, "// ");
    957 
    958   for (ObjCCategoryDecl::prop_iterator I = CatDecl->prop_begin(),
    959        E = CatDecl->prop_end(); I != E; ++I)
    960     RewriteProperty(*I);
    961 
    962   for (ObjCCategoryDecl::instmeth_iterator
    963          I = CatDecl->instmeth_begin(), E = CatDecl->instmeth_end();
    964        I != E; ++I)
    965     RewriteMethodDeclaration(*I);
    966   for (ObjCCategoryDecl::classmeth_iterator
    967          I = CatDecl->classmeth_begin(), E = CatDecl->classmeth_end();
    968        I != E; ++I)
    969     RewriteMethodDeclaration(*I);
    970 
    971   // Lastly, comment out the @end.
    972   ReplaceText(CatDecl->getAtEndRange().getBegin(),
    973               strlen("@end"), "/* @end */");
    974 }
    975 
    976 void RewriteObjC::RewriteProtocolDecl(ObjCProtocolDecl *PDecl) {
    977   SourceLocation LocStart = PDecl->getLocStart();
    978 
    979   // FIXME: handle protocol headers that are declared across multiple lines.
    980   ReplaceText(LocStart, 0, "// ");
    981 
    982   for (ObjCProtocolDecl::instmeth_iterator
    983          I = PDecl->instmeth_begin(), E = PDecl->instmeth_end();
    984        I != E; ++I)
    985     RewriteMethodDeclaration(*I);
    986   for (ObjCProtocolDecl::classmeth_iterator
    987          I = PDecl->classmeth_begin(), E = PDecl->classmeth_end();
    988        I != E; ++I)
    989     RewriteMethodDeclaration(*I);
    990 
    991   for (ObjCInterfaceDecl::prop_iterator I = PDecl->prop_begin(),
    992        E = PDecl->prop_end(); I != E; ++I)
    993     RewriteProperty(*I);
    994 
    995   // Lastly, comment out the @end.
    996   SourceLocation LocEnd = PDecl->getAtEndRange().getBegin();
    997   ReplaceText(LocEnd, strlen("@end"), "/* @end */");
    998 
    999   // Must comment out @optional/@required
   1000   const char *startBuf = SM->getCharacterData(LocStart);
   1001   const char *endBuf = SM->getCharacterData(LocEnd);
   1002   for (const char *p = startBuf; p < endBuf; p++) {
   1003     if (*p == '@' && !strncmp(p+1, "optional", strlen("optional"))) {
   1004       SourceLocation OptionalLoc = LocStart.getFileLocWithOffset(p-startBuf);
   1005       ReplaceText(OptionalLoc, strlen("@optional"), "/* @optional */");
   1006 
   1007     }
   1008     else if (*p == '@' && !strncmp(p+1, "required", strlen("required"))) {
   1009       SourceLocation OptionalLoc = LocStart.getFileLocWithOffset(p-startBuf);
   1010       ReplaceText(OptionalLoc, strlen("@required"), "/* @required */");
   1011 
   1012     }
   1013   }
   1014 }
   1015 
   1016 void RewriteObjC::RewriteForwardProtocolDecl(ObjCForwardProtocolDecl *PDecl) {
   1017   SourceLocation LocStart = PDecl->getLocation();
   1018   if (LocStart.isInvalid())
   1019     assert(false && "Invalid SourceLocation");
   1020   // FIXME: handle forward protocol that are declared across multiple lines.
   1021   ReplaceText(LocStart, 0, "// ");
   1022 }
   1023 
   1024 void RewriteObjC::RewriteTypeIntoString(QualType T, std::string &ResultStr,
   1025                                         const FunctionType *&FPRetType) {
   1026   if (T->isObjCQualifiedIdType())
   1027     ResultStr += "id";
   1028   else if (T->isFunctionPointerType() ||
   1029            T->isBlockPointerType()) {
   1030     // needs special handling, since pointer-to-functions have special
   1031     // syntax (where a decaration models use).
   1032     QualType retType = T;
   1033     QualType PointeeTy;
   1034     if (const PointerType* PT = retType->getAs<PointerType>())
   1035       PointeeTy = PT->getPointeeType();
   1036     else if (const BlockPointerType *BPT = retType->getAs<BlockPointerType>())
   1037       PointeeTy = BPT->getPointeeType();
   1038     if ((FPRetType = PointeeTy->getAs<FunctionType>())) {
   1039       ResultStr += FPRetType->getResultType().getAsString(
   1040         Context->PrintingPolicy);
   1041       ResultStr += "(*";
   1042     }
   1043   } else
   1044     ResultStr += T.getAsString(Context->PrintingPolicy);
   1045 }
   1046 
   1047 void RewriteObjC::RewriteObjCMethodDecl(const ObjCInterfaceDecl *IDecl,
   1048                                         ObjCMethodDecl *OMD,
   1049                                         std::string &ResultStr) {
   1050   //fprintf(stderr,"In RewriteObjCMethodDecl\n");
   1051   const FunctionType *FPRetType = 0;
   1052   ResultStr += "\nstatic ";
   1053   RewriteTypeIntoString(OMD->getResultType(), ResultStr, FPRetType);
   1054   ResultStr += " ";
   1055 
   1056   // Unique method name
   1057   std::string NameStr;
   1058 
   1059   if (OMD->isInstanceMethod())
   1060     NameStr += "_I_";
   1061   else
   1062     NameStr += "_C_";
   1063 
   1064   NameStr += IDecl->getNameAsString();
   1065   NameStr += "_";
   1066 
   1067   if (ObjCCategoryImplDecl *CID =
   1068       dyn_cast<ObjCCategoryImplDecl>(OMD->getDeclContext())) {
   1069     NameStr += CID->getNameAsString();
   1070     NameStr += "_";
   1071   }
   1072   // Append selector names, replacing ':' with '_'
   1073   {
   1074     std::string selString = OMD->getSelector().getAsString();
   1075     int len = selString.size();
   1076     for (int i = 0; i < len; i++)
   1077       if (selString[i] == ':')
   1078         selString[i] = '_';
   1079     NameStr += selString;
   1080   }
   1081   // Remember this name for metadata emission
   1082   MethodInternalNames[OMD] = NameStr;
   1083   ResultStr += NameStr;
   1084 
   1085   // Rewrite arguments
   1086   ResultStr += "(";
   1087 
   1088   // invisible arguments
   1089   if (OMD->isInstanceMethod()) {
   1090     QualType selfTy = Context->getObjCInterfaceType(IDecl);
   1091     selfTy = Context->getPointerType(selfTy);
   1092     if (!LangOpts.Microsoft) {
   1093       if (ObjCSynthesizedStructs.count(const_cast<ObjCInterfaceDecl*>(IDecl)))
   1094         ResultStr += "struct ";
   1095     }
   1096     // When rewriting for Microsoft, explicitly omit the structure name.
   1097     ResultStr += IDecl->getNameAsString();
   1098     ResultStr += " *";
   1099   }
   1100   else
   1101     ResultStr += Context->getObjCClassType().getAsString(
   1102       Context->PrintingPolicy);
   1103 
   1104   ResultStr += " self, ";
   1105   ResultStr += Context->getObjCSelType().getAsString(Context->PrintingPolicy);
   1106   ResultStr += " _cmd";
   1107 
   1108   // Method arguments.
   1109   for (ObjCMethodDecl::param_iterator PI = OMD->param_begin(),
   1110        E = OMD->param_end(); PI != E; ++PI) {
   1111     ParmVarDecl *PDecl = *PI;
   1112     ResultStr += ", ";
   1113     if (PDecl->getType()->isObjCQualifiedIdType()) {
   1114       ResultStr += "id ";
   1115       ResultStr += PDecl->getNameAsString();
   1116     } else {
   1117       std::string Name = PDecl->getNameAsString();
   1118       QualType QT = PDecl->getType();
   1119       // Make sure we convert "t (^)(...)" to "t (*)(...)".
   1120       if (convertBlockPointerToFunctionPointer(QT))
   1121         QT.getAsStringInternal(Name, Context->PrintingPolicy);
   1122       else
   1123         PDecl->getType().getAsStringInternal(Name, Context->PrintingPolicy);
   1124       ResultStr += Name;
   1125     }
   1126   }
   1127   if (OMD->isVariadic())
   1128     ResultStr += ", ...";
   1129   ResultStr += ") ";
   1130 
   1131   if (FPRetType) {
   1132     ResultStr += ")"; // close the precedence "scope" for "*".
   1133 
   1134     // Now, emit the argument types (if any).
   1135     if (const FunctionProtoType *FT = dyn_cast<FunctionProtoType>(FPRetType)) {
   1136       ResultStr += "(";
   1137       for (unsigned i = 0, e = FT->getNumArgs(); i != e; ++i) {
   1138         if (i) ResultStr += ", ";
   1139         std::string ParamStr = FT->getArgType(i).getAsString(
   1140           Context->PrintingPolicy);
   1141         ResultStr += ParamStr;
   1142       }
   1143       if (FT->isVariadic()) {
   1144         if (FT->getNumArgs()) ResultStr += ", ";
   1145         ResultStr += "...";
   1146       }
   1147       ResultStr += ")";
   1148     } else {
   1149       ResultStr += "()";
   1150     }
   1151   }
   1152 }
   1153 void RewriteObjC::RewriteImplementationDecl(Decl *OID) {
   1154   ObjCImplementationDecl *IMD = dyn_cast<ObjCImplementationDecl>(OID);
   1155   ObjCCategoryImplDecl *CID = dyn_cast<ObjCCategoryImplDecl>(OID);
   1156 
   1157   InsertText(IMD ? IMD->getLocStart() : CID->getLocStart(), "// ");
   1158 
   1159   for (ObjCCategoryImplDecl::instmeth_iterator
   1160        I = IMD ? IMD->instmeth_begin() : CID->instmeth_begin(),
   1161        E = IMD ? IMD->instmeth_end() : CID->instmeth_end();
   1162        I != E; ++I) {
   1163     std::string ResultStr;
   1164     ObjCMethodDecl *OMD = *I;
   1165     RewriteObjCMethodDecl(OMD->getClassInterface(), OMD, ResultStr);
   1166     SourceLocation LocStart = OMD->getLocStart();
   1167     SourceLocation LocEnd = OMD->getCompoundBody()->getLocStart();
   1168 
   1169     const char *startBuf = SM->getCharacterData(LocStart);
   1170     const char *endBuf = SM->getCharacterData(LocEnd);
   1171     ReplaceText(LocStart, endBuf-startBuf, ResultStr);
   1172   }
   1173 
   1174   for (ObjCCategoryImplDecl::classmeth_iterator
   1175        I = IMD ? IMD->classmeth_begin() : CID->classmeth_begin(),
   1176        E = IMD ? IMD->classmeth_end() : CID->classmeth_end();
   1177        I != E; ++I) {
   1178     std::string ResultStr;
   1179     ObjCMethodDecl *OMD = *I;
   1180     RewriteObjCMethodDecl(OMD->getClassInterface(), OMD, ResultStr);
   1181     SourceLocation LocStart = OMD->getLocStart();
   1182     SourceLocation LocEnd = OMD->getCompoundBody()->getLocStart();
   1183 
   1184     const char *startBuf = SM->getCharacterData(LocStart);
   1185     const char *endBuf = SM->getCharacterData(LocEnd);
   1186     ReplaceText(LocStart, endBuf-startBuf, ResultStr);
   1187   }
   1188   for (ObjCCategoryImplDecl::propimpl_iterator
   1189        I = IMD ? IMD->propimpl_begin() : CID->propimpl_begin(),
   1190        E = IMD ? IMD->propimpl_end() : CID->propimpl_end();
   1191        I != E; ++I) {
   1192     RewritePropertyImplDecl(*I, IMD, CID);
   1193   }
   1194 
   1195   InsertText(IMD ? IMD->getLocEnd() : CID->getLocEnd(), "// ");
   1196 }
   1197 
   1198 void RewriteObjC::RewriteInterfaceDecl(ObjCInterfaceDecl *ClassDecl) {
   1199   std::string ResultStr;
   1200   if (!ObjCForwardDecls.count(ClassDecl)) {
   1201     // we haven't seen a forward decl - generate a typedef.
   1202     ResultStr = "#ifndef _REWRITER_typedef_";
   1203     ResultStr += ClassDecl->getNameAsString();
   1204     ResultStr += "\n";
   1205     ResultStr += "#define _REWRITER_typedef_";
   1206     ResultStr += ClassDecl->getNameAsString();
   1207     ResultStr += "\n";
   1208     ResultStr += "typedef struct objc_object ";
   1209     ResultStr += ClassDecl->getNameAsString();
   1210     ResultStr += ";\n#endif\n";
   1211     // Mark this typedef as having been generated.
   1212     ObjCForwardDecls.insert(ClassDecl);
   1213   }
   1214   SynthesizeObjCInternalStruct(ClassDecl, ResultStr);
   1215 
   1216   for (ObjCInterfaceDecl::prop_iterator I = ClassDecl->prop_begin(),
   1217          E = ClassDecl->prop_end(); I != E; ++I)
   1218     RewriteProperty(*I);
   1219   for (ObjCInterfaceDecl::instmeth_iterator
   1220          I = ClassDecl->instmeth_begin(), E = ClassDecl->instmeth_end();
   1221        I != E; ++I)
   1222     RewriteMethodDeclaration(*I);
   1223   for (ObjCInterfaceDecl::classmeth_iterator
   1224          I = ClassDecl->classmeth_begin(), E = ClassDecl->classmeth_end();
   1225        I != E; ++I)
   1226     RewriteMethodDeclaration(*I);
   1227 
   1228   // Lastly, comment out the @end.
   1229   ReplaceText(ClassDecl->getAtEndRange().getBegin(), strlen("@end"),
   1230               "/* @end */");
   1231 }
   1232 
   1233 Stmt *RewriteObjC::RewritePropertyOrImplicitSetter(BinaryOperator *BinOp, Expr *newStmt,
   1234                                          SourceRange SrcRange) {
   1235   ObjCMethodDecl *OMD = 0;
   1236   QualType Ty;
   1237   Selector Sel;
   1238   Stmt *Receiver = 0;
   1239   bool Super = false;
   1240   QualType SuperTy;
   1241   SourceLocation SuperLocation;
   1242   SourceLocation SelectorLoc;
   1243   // Synthesize a ObjCMessageExpr from a ObjCPropertyRefExpr or ObjCImplicitSetterGetterRefExpr.
   1244   // This allows us to reuse all the fun and games in SynthMessageExpr().
   1245   if (ObjCPropertyRefExpr *PropRefExpr =
   1246         dyn_cast<ObjCPropertyRefExpr>(BinOp->getLHS())) {
   1247     SelectorLoc = PropRefExpr->getLocation();
   1248     if (PropRefExpr->isExplicitProperty()) {
   1249       ObjCPropertyDecl *PDecl = PropRefExpr->getExplicitProperty();
   1250       OMD = PDecl->getSetterMethodDecl();
   1251       Ty = PDecl->getType();
   1252       Sel = PDecl->getSetterName();
   1253     } else {
   1254       OMD = PropRefExpr->getImplicitPropertySetter();
   1255       Sel = OMD->getSelector();
   1256       Ty = PropRefExpr->getType();
   1257     }
   1258     Super = PropRefExpr->isSuperReceiver();
   1259     if (!Super) {
   1260       Receiver = PropRefExpr->getBase();
   1261     } else {
   1262       SuperTy = PropRefExpr->getSuperReceiverType();
   1263       SuperLocation = PropRefExpr->getReceiverLocation();
   1264     }
   1265   }
   1266 
   1267   assert(OMD && "RewritePropertyOrImplicitSetter - null OMD");
   1268   llvm::SmallVector<Expr *, 1> ExprVec;
   1269   ExprVec.push_back(newStmt);
   1270 
   1271   ObjCMessageExpr *MsgExpr;
   1272   if (Super)
   1273     MsgExpr = ObjCMessageExpr::Create(*Context,
   1274                                       Ty.getNonReferenceType(),
   1275                                       Expr::getValueKindForType(Ty),
   1276                                       /*FIXME?*/SourceLocation(),
   1277                                       SuperLocation,
   1278                                       /*IsInstanceSuper=*/true,
   1279                                       SuperTy,
   1280                                       Sel, SelectorLoc, OMD,
   1281                                       &ExprVec[0], 1,
   1282                                       /*FIXME:*/SourceLocation());
   1283   else {
   1284     // FIXME. Refactor this into common code with that in
   1285     // RewritePropertyOrImplicitGetter
   1286     assert(Receiver && "RewritePropertyOrImplicitSetter - null Receiver");
   1287     if (Expr *Exp = dyn_cast<Expr>(Receiver))
   1288       if (PropGetters[Exp])
   1289         // This allows us to handle chain/nested property/implicit getters.
   1290         Receiver = PropGetters[Exp];
   1291 
   1292     MsgExpr = ObjCMessageExpr::Create(*Context,
   1293                                       Ty.getNonReferenceType(),
   1294                                       Expr::getValueKindForType(Ty),
   1295                                       /*FIXME: */SourceLocation(),
   1296                                       cast<Expr>(Receiver),
   1297                                       Sel, SelectorLoc, OMD,
   1298                                       &ExprVec[0], 1,
   1299                                       /*FIXME:*/SourceLocation());
   1300   }
   1301   Stmt *ReplacingStmt = SynthMessageExpr(MsgExpr);
   1302 
   1303   // Now do the actual rewrite.
   1304   ReplaceStmtWithRange(BinOp, ReplacingStmt, SrcRange);
   1305   //delete BinOp;
   1306   // NOTE: We don't want to call MsgExpr->Destroy(), as it holds references
   1307   // to things that stay around.
   1308   Context->Deallocate(MsgExpr);
   1309   return ReplacingStmt;
   1310 }
   1311 
   1312 Stmt *RewriteObjC::RewritePropertyOrImplicitGetter(Expr *PropOrGetterRefExpr) {
   1313   // Synthesize a ObjCMessageExpr from a ObjCPropertyRefExpr or ImplicitGetter.
   1314   // This allows us to reuse all the fun and games in SynthMessageExpr().
   1315   Stmt *Receiver = 0;
   1316   ObjCMethodDecl *OMD = 0;
   1317   QualType Ty;
   1318   Selector Sel;
   1319   bool Super = false;
   1320   QualType SuperTy;
   1321   SourceLocation SuperLocation;
   1322   SourceLocation SelectorLoc;
   1323   if (ObjCPropertyRefExpr *PropRefExpr =
   1324         dyn_cast<ObjCPropertyRefExpr>(PropOrGetterRefExpr)) {
   1325     SelectorLoc = PropRefExpr->getLocation();
   1326     if (PropRefExpr->isExplicitProperty()) {
   1327       ObjCPropertyDecl *PDecl = PropRefExpr->getExplicitProperty();
   1328       OMD = PDecl->getGetterMethodDecl();
   1329       Ty = PDecl->getType();
   1330       Sel = PDecl->getGetterName();
   1331     } else {
   1332       OMD = PropRefExpr->getImplicitPropertyGetter();
   1333       Sel = OMD->getSelector();
   1334       Ty = PropRefExpr->getType();
   1335     }
   1336     Super = PropRefExpr->isSuperReceiver();
   1337     if (!Super)
   1338       Receiver = PropRefExpr->getBase();
   1339     else {
   1340       SuperTy = PropRefExpr->getSuperReceiverType();
   1341       SuperLocation = PropRefExpr->getReceiverLocation();
   1342     }
   1343   }
   1344 
   1345   assert (OMD && "RewritePropertyOrImplicitGetter - OMD is null");
   1346 
   1347   ObjCMessageExpr *MsgExpr;
   1348   if (Super)
   1349     MsgExpr = ObjCMessageExpr::Create(*Context,
   1350                                       Ty.getNonReferenceType(),
   1351                                       Expr::getValueKindForType(Ty),
   1352                                       PropOrGetterRefExpr->getLocStart(),
   1353                                       SuperLocation,
   1354                                       /*IsInstanceSuper=*/true,
   1355                                       SuperTy,
   1356                                       Sel, SelectorLoc, OMD,
   1357                                       0, 0,
   1358                                       PropOrGetterRefExpr->getLocEnd());
   1359   else {
   1360     assert (Receiver && "RewritePropertyOrImplicitGetter - Receiver is null");
   1361     if (Expr *Exp = dyn_cast<Expr>(Receiver))
   1362       if (PropGetters[Exp])
   1363         // This allows us to handle chain/nested property/implicit getters.
   1364         Receiver = PropGetters[Exp];
   1365     MsgExpr = ObjCMessageExpr::Create(*Context,
   1366                                       Ty.getNonReferenceType(),
   1367                                       Expr::getValueKindForType(Ty),
   1368                                       PropOrGetterRefExpr->getLocStart(),
   1369                                       cast<Expr>(Receiver),
   1370                                       Sel, SelectorLoc, OMD,
   1371                                       0, 0,
   1372                                       PropOrGetterRefExpr->getLocEnd());
   1373   }
   1374 
   1375   Stmt *ReplacingStmt = SynthMessageExpr(MsgExpr, MsgExpr->getLocStart(),
   1376                                          MsgExpr->getLocEnd());
   1377 
   1378   if (!PropParentMap)
   1379     PropParentMap = new ParentMap(CurrentBody);
   1380   bool NestedPropertyRef = false;
   1381   Stmt *Parent = PropParentMap->getParent(PropOrGetterRefExpr);
   1382   ImplicitCastExpr*ICE=0;
   1383   if (Parent)
   1384     if ((ICE = dyn_cast<ImplicitCastExpr>(Parent))) {
   1385       assert((ICE->getCastKind() == CK_GetObjCProperty)
   1386              && "RewritePropertyOrImplicitGetter");
   1387       Parent = PropParentMap->getParent(Parent);
   1388       NestedPropertyRef = (Parent && isa<ObjCPropertyRefExpr>(Parent));
   1389     }
   1390   if (NestedPropertyRef) {
   1391     // We stash away the ReplacingStmt since actually doing the
   1392     // replacement/rewrite won't work for nested getters (e.g. obj.p.i)
   1393     PropGetters[ICE] = ReplacingStmt;
   1394     // NOTE: We don't want to call MsgExpr->Destroy(), as it holds references
   1395     // to things that stay around.
   1396     Context->Deallocate(MsgExpr);
   1397     return PropOrGetterRefExpr; // return the original...
   1398   } else {
   1399     ReplaceStmt(PropOrGetterRefExpr, ReplacingStmt);
   1400     // delete PropRefExpr; elsewhere...
   1401     // NOTE: We don't want to call MsgExpr->Destroy(), as it holds references
   1402     // to things that stay around.
   1403     Context->Deallocate(MsgExpr);
   1404     return ReplacingStmt;
   1405   }
   1406 }
   1407 
   1408 Stmt *RewriteObjC::RewriteObjCIvarRefExpr(ObjCIvarRefExpr *IV,
   1409                                           SourceLocation OrigStart,
   1410                                           bool &replaced) {
   1411   ObjCIvarDecl *D = IV->getDecl();
   1412   const Expr *BaseExpr = IV->getBase();
   1413   if (CurMethodDef) {
   1414     if (BaseExpr->getType()->isObjCObjectPointerType()) {
   1415       const ObjCInterfaceType *iFaceDecl =
   1416         dyn_cast<ObjCInterfaceType>(BaseExpr->getType()->getPointeeType());
   1417       assert(iFaceDecl && "RewriteObjCIvarRefExpr - iFaceDecl is null");
   1418       // lookup which class implements the instance variable.
   1419       ObjCInterfaceDecl *clsDeclared = 0;
   1420       iFaceDecl->getDecl()->lookupInstanceVariable(D->getIdentifier(),
   1421                                                    clsDeclared);
   1422       assert(clsDeclared && "RewriteObjCIvarRefExpr(): Can't find class");
   1423 
   1424       // Synthesize an explicit cast to gain access to the ivar.
   1425       std::string RecName = clsDeclared->getIdentifier()->getName();
   1426       RecName += "_IMPL";
   1427       IdentifierInfo *II = &Context->Idents.get(RecName);
   1428       RecordDecl *RD = RecordDecl::Create(*Context, TTK_Struct, TUDecl,
   1429                                           SourceLocation(), SourceLocation(),
   1430                                           II);
   1431       assert(RD && "RewriteObjCIvarRefExpr(): Can't find RecordDecl");
   1432       QualType castT = Context->getPointerType(Context->getTagDeclType(RD));
   1433       CastExpr *castExpr = NoTypeInfoCStyleCastExpr(Context, castT,
   1434                                                     CK_BitCast,
   1435                                                     IV->getBase());
   1436       // Don't forget the parens to enforce the proper binding.
   1437       ParenExpr *PE = new (Context) ParenExpr(IV->getBase()->getLocStart(),
   1438                                               IV->getBase()->getLocEnd(),
   1439                                               castExpr);
   1440       replaced = true;
   1441       if (IV->isFreeIvar() &&
   1442           CurMethodDef->getClassInterface() == iFaceDecl->getDecl()) {
   1443         MemberExpr *ME = new (Context) MemberExpr(PE, true, D,
   1444                                                   IV->getLocation(),
   1445                                                   D->getType(),
   1446                                                   VK_LValue, OK_Ordinary);
   1447         // delete IV; leak for now, see RewritePropertyOrImplicitSetter() usage for more info.
   1448         return ME;
   1449       }
   1450       // Get the new text
   1451       // Cannot delete IV->getBase(), since PE points to it.
   1452       // Replace the old base with the cast. This is important when doing
   1453       // embedded rewrites. For example, [newInv->_container addObject:0].
   1454       IV->setBase(PE);
   1455       return IV;
   1456     }
   1457   } else { // we are outside a method.
   1458     assert(!IV->isFreeIvar() && "Cannot have a free standing ivar outside a method");
   1459 
   1460     // Explicit ivar refs need to have a cast inserted.
   1461     // FIXME: consider sharing some of this code with the code above.
   1462     if (BaseExpr->getType()->isObjCObjectPointerType()) {
   1463       const ObjCInterfaceType *iFaceDecl =
   1464         dyn_cast<ObjCInterfaceType>(BaseExpr->getType()->getPointeeType());
   1465       // lookup which class implements the instance variable.
   1466       ObjCInterfaceDecl *clsDeclared = 0;
   1467       iFaceDecl->getDecl()->lookupInstanceVariable(D->getIdentifier(),
   1468                                                    clsDeclared);
   1469       assert(clsDeclared && "RewriteObjCIvarRefExpr(): Can't find class");
   1470 
   1471       // Synthesize an explicit cast to gain access to the ivar.
   1472       std::string RecName = clsDeclared->getIdentifier()->getName();
   1473       RecName += "_IMPL";
   1474       IdentifierInfo *II = &Context->Idents.get(RecName);
   1475       RecordDecl *RD = RecordDecl::Create(*Context, TTK_Struct, TUDecl,
   1476                                           SourceLocation(), SourceLocation(),
   1477                                           II);
   1478       assert(RD && "RewriteObjCIvarRefExpr(): Can't find RecordDecl");
   1479       QualType castT = Context->getPointerType(Context->getTagDeclType(RD));
   1480       CastExpr *castExpr = NoTypeInfoCStyleCastExpr(Context, castT,
   1481                                                     CK_BitCast,
   1482                                                     IV->getBase());
   1483       // Don't forget the parens to enforce the proper binding.
   1484       ParenExpr *PE = new (Context) ParenExpr(IV->getBase()->getLocStart(),
   1485                                     IV->getBase()->getLocEnd(), castExpr);
   1486       replaced = true;
   1487       // Cannot delete IV->getBase(), since PE points to it.
   1488       // Replace the old base with the cast. This is important when doing
   1489       // embedded rewrites. For example, [newInv->_container addObject:0].
   1490       IV->setBase(PE);
   1491       return IV;
   1492     }
   1493   }
   1494   return IV;
   1495 }
   1496 
   1497 Stmt *RewriteObjC::RewriteObjCNestedIvarRefExpr(Stmt *S, bool &replaced) {
   1498   for (Stmt::child_range CI = S->children(); CI; ++CI) {
   1499     if (*CI) {
   1500       Stmt *newStmt = RewriteObjCNestedIvarRefExpr(*CI, replaced);
   1501       if (newStmt)
   1502         *CI = newStmt;
   1503     }
   1504   }
   1505   if (ObjCIvarRefExpr *IvarRefExpr = dyn_cast<ObjCIvarRefExpr>(S)) {
   1506     SourceRange OrigStmtRange = S->getSourceRange();
   1507     Stmt *newStmt = RewriteObjCIvarRefExpr(IvarRefExpr, OrigStmtRange.getBegin(),
   1508                                            replaced);
   1509     return newStmt;
   1510   }
   1511   if (ObjCMessageExpr *MsgRefExpr = dyn_cast<ObjCMessageExpr>(S)) {
   1512     Stmt *newStmt = SynthMessageExpr(MsgRefExpr);
   1513     return newStmt;
   1514   }
   1515   return S;
   1516 }
   1517 
   1518 /// SynthCountByEnumWithState - To print:
   1519 /// ((unsigned int (*)
   1520 ///  (id, SEL, struct __objcFastEnumerationState *, id *, unsigned int))
   1521 ///  (void *)objc_msgSend)((id)l_collection,
   1522 ///                        sel_registerName(
   1523 ///                          "countByEnumeratingWithState:objects:count:"),
   1524 ///                        &enumState,
   1525 ///                        (id *)items, (unsigned int)16)
   1526 ///
   1527 void RewriteObjC::SynthCountByEnumWithState(std::string &buf) {
   1528   buf += "((unsigned int (*) (id, SEL, struct __objcFastEnumerationState *, "
   1529   "id *, unsigned int))(void *)objc_msgSend)";
   1530   buf += "\n\t\t";
   1531   buf += "((id)l_collection,\n\t\t";
   1532   buf += "sel_registerName(\"countByEnumeratingWithState:objects:count:\"),";
   1533   buf += "\n\t\t";
   1534   buf += "&enumState, "
   1535          "(id *)items, (unsigned int)16)";
   1536 }
   1537 
   1538 /// RewriteBreakStmt - Rewrite for a break-stmt inside an ObjC2's foreach
   1539 /// statement to exit to its outer synthesized loop.
   1540 ///
   1541 Stmt *RewriteObjC::RewriteBreakStmt(BreakStmt *S) {
   1542   if (Stmts.empty() || !isa<ObjCForCollectionStmt>(Stmts.back()))
   1543     return S;
   1544   // replace break with goto __break_label
   1545   std::string buf;
   1546 
   1547   SourceLocation startLoc = S->getLocStart();
   1548   buf = "goto __break_label_";
   1549   buf += utostr(ObjCBcLabelNo.back());
   1550   ReplaceText(startLoc, strlen("break"), buf);
   1551 
   1552   return 0;
   1553 }
   1554 
   1555 /// RewriteContinueStmt - Rewrite for a continue-stmt inside an ObjC2's foreach
   1556 /// statement to continue with its inner synthesized loop.
   1557 ///
   1558 Stmt *RewriteObjC::RewriteContinueStmt(ContinueStmt *S) {
   1559   if (Stmts.empty() || !isa<ObjCForCollectionStmt>(Stmts.back()))
   1560     return S;
   1561   // replace continue with goto __continue_label
   1562   std::string buf;
   1563 
   1564   SourceLocation startLoc = S->getLocStart();
   1565   buf = "goto __continue_label_";
   1566   buf += utostr(ObjCBcLabelNo.back());
   1567   ReplaceText(startLoc, strlen("continue"), buf);
   1568 
   1569   return 0;
   1570 }
   1571 
   1572 /// RewriteObjCForCollectionStmt - Rewriter for ObjC2's foreach statement.
   1573 ///  It rewrites:
   1574 /// for ( type elem in collection) { stmts; }
   1575 
   1576 /// Into:
   1577 /// {
   1578 ///   type elem;
   1579 ///   struct __objcFastEnumerationState enumState = { 0 };
   1580 ///   id items[16];
   1581 ///   id l_collection = (id)collection;
   1582 ///   unsigned long limit = [l_collection countByEnumeratingWithState:&enumState
   1583 ///                                       objects:items count:16];
   1584 /// if (limit) {
   1585 ///   unsigned long startMutations = *enumState.mutationsPtr;
   1586 ///   do {
   1587 ///        unsigned long counter = 0;
   1588 ///        do {
   1589 ///             if (startMutations != *enumState.mutationsPtr)
   1590 ///               objc_enumerationMutation(l_collection);
   1591 ///             elem = (type)enumState.itemsPtr[counter++];
   1592 ///             stmts;
   1593 ///             __continue_label: ;
   1594 ///        } while (counter < limit);
   1595 ///   } while (limit = [l_collection countByEnumeratingWithState:&enumState
   1596 ///                                  objects:items count:16]);
   1597 ///   elem = nil;
   1598 ///   __break_label: ;
   1599 ///  }
   1600 ///  else
   1601 ///       elem = nil;
   1602 ///  }
   1603 ///
   1604 Stmt *RewriteObjC::RewriteObjCForCollectionStmt(ObjCForCollectionStmt *S,
   1605                                                 SourceLocation OrigEnd) {
   1606   assert(!Stmts.empty() && "ObjCForCollectionStmt - Statement stack empty");
   1607   assert(isa<ObjCForCollectionStmt>(Stmts.back()) &&
   1608          "ObjCForCollectionStmt Statement stack mismatch");
   1609   assert(!ObjCBcLabelNo.empty() &&
   1610          "ObjCForCollectionStmt - Label No stack empty");
   1611 
   1612   SourceLocation startLoc = S->getLocStart();
   1613   const char *startBuf = SM->getCharacterData(startLoc);
   1614   llvm::StringRef elementName;
   1615   std::string elementTypeAsString;
   1616   std::string buf;
   1617   buf = "\n{\n\t";
   1618   if (DeclStmt *DS = dyn_cast<DeclStmt>(S->getElement())) {
   1619     // type elem;
   1620     NamedDecl* D = cast<NamedDecl>(DS->getSingleDecl());
   1621     QualType ElementType = cast<ValueDecl>(D)->getType();
   1622     if (ElementType->isObjCQualifiedIdType() ||
   1623         ElementType->isObjCQualifiedInterfaceType())
   1624       // Simply use 'id' for all qualified types.
   1625       elementTypeAsString = "id";
   1626     else
   1627       elementTypeAsString = ElementType.getAsString(Context->PrintingPolicy);
   1628     buf += elementTypeAsString;
   1629     buf += " ";
   1630     elementName = D->getName();
   1631     buf += elementName;
   1632     buf += ";\n\t";
   1633   }
   1634   else {
   1635     DeclRefExpr *DR = cast<DeclRefExpr>(S->getElement());
   1636     elementName = DR->getDecl()->getName();
   1637     ValueDecl *VD = cast<ValueDecl>(DR->getDecl());
   1638     if (VD->getType()->isObjCQualifiedIdType() ||
   1639         VD->getType()->isObjCQualifiedInterfaceType())
   1640       // Simply use 'id' for all qualified types.
   1641       elementTypeAsString = "id";
   1642     else
   1643       elementTypeAsString = VD->getType().getAsString(Context->PrintingPolicy);
   1644   }
   1645 
   1646   // struct __objcFastEnumerationState enumState = { 0 };
   1647   buf += "struct __objcFastEnumerationState enumState = { 0 };\n\t";
   1648   // id items[16];
   1649   buf += "id items[16];\n\t";
   1650   // id l_collection = (id)
   1651   buf += "id l_collection = (id)";
   1652   // Find start location of 'collection' the hard way!
   1653   const char *startCollectionBuf = startBuf;
   1654   startCollectionBuf += 3;  // skip 'for'
   1655   startCollectionBuf = strchr(startCollectionBuf, '(');
   1656   startCollectionBuf++; // skip '('
   1657   // find 'in' and skip it.
   1658   while (*startCollectionBuf != ' ' ||
   1659          *(startCollectionBuf+1) != 'i' || *(startCollectionBuf+2) != 'n' ||
   1660          (*(startCollectionBuf+3) != ' ' &&
   1661           *(startCollectionBuf+3) != '[' && *(startCollectionBuf+3) != '('))
   1662     startCollectionBuf++;
   1663   startCollectionBuf += 3;
   1664 
   1665   // Replace: "for (type element in" with string constructed thus far.
   1666   ReplaceText(startLoc, startCollectionBuf - startBuf, buf);
   1667   // Replace ')' in for '(' type elem in collection ')' with ';'
   1668   SourceLocation rightParenLoc = S->getRParenLoc();
   1669   const char *rparenBuf = SM->getCharacterData(rightParenLoc);
   1670   SourceLocation lparenLoc = startLoc.getFileLocWithOffset(rparenBuf-startBuf);
   1671   buf = ";\n\t";
   1672 
   1673   // unsigned long limit = [l_collection countByEnumeratingWithState:&enumState
   1674   //                                   objects:items count:16];
   1675   // which is synthesized into:
   1676   // unsigned int limit =
   1677   // ((unsigned int (*)
   1678   //  (id, SEL, struct __objcFastEnumerationState *, id *, unsigned int))
   1679   //  (void *)objc_msgSend)((id)l_collection,
   1680   //                        sel_registerName(
   1681   //                          "countByEnumeratingWithState:objects:count:"),
   1682   //                        (struct __objcFastEnumerationState *)&state,
   1683   //                        (id *)items, (unsigned int)16);
   1684   buf += "unsigned long limit =\n\t\t";
   1685   SynthCountByEnumWithState(buf);
   1686   buf += ";\n\t";
   1687   /// if (limit) {
   1688   ///   unsigned long startMutations = *enumState.mutationsPtr;
   1689   ///   do {
   1690   ///        unsigned long counter = 0;
   1691   ///        do {
   1692   ///             if (startMutations != *enumState.mutationsPtr)
   1693   ///               objc_enumerationMutation(l_collection);
   1694   ///             elem = (type)enumState.itemsPtr[counter++];
   1695   buf += "if (limit) {\n\t";
   1696   buf += "unsigned long startMutations = *enumState.mutationsPtr;\n\t";
   1697   buf += "do {\n\t\t";
   1698   buf += "unsigned long counter = 0;\n\t\t";
   1699   buf += "do {\n\t\t\t";
   1700   buf += "if (startMutations != *enumState.mutationsPtr)\n\t\t\t\t";
   1701   buf += "objc_enumerationMutation(l_collection);\n\t\t\t";
   1702   buf += elementName;
   1703   buf += " = (";
   1704   buf += elementTypeAsString;
   1705   buf += ")enumState.itemsPtr[counter++];";
   1706   // Replace ')' in for '(' type elem in collection ')' with all of these.
   1707   ReplaceText(lparenLoc, 1, buf);
   1708 
   1709   ///            __continue_label: ;
   1710   ///        } while (counter < limit);
   1711   ///   } while (limit = [l_collection countByEnumeratingWithState:&enumState
   1712   ///                                  objects:items count:16]);
   1713   ///   elem = nil;
   1714   ///   __break_label: ;
   1715   ///  }
   1716   ///  else
   1717   ///       elem = nil;
   1718   ///  }
   1719   ///
   1720   buf = ";\n\t";
   1721   buf += "__continue_label_";
   1722   buf += utostr(ObjCBcLabelNo.back());
   1723   buf += ": ;";
   1724   buf += "\n\t\t";
   1725   buf += "} while (counter < limit);\n\t";
   1726   buf += "} while (limit = ";
   1727   SynthCountByEnumWithState(buf);
   1728   buf += ");\n\t";
   1729   buf += elementName;
   1730   buf += " = ((";
   1731   buf += elementTypeAsString;
   1732   buf += ")0);\n\t";
   1733   buf += "__break_label_";
   1734   buf += utostr(ObjCBcLabelNo.back());
   1735   buf += ": ;\n\t";
   1736   buf += "}\n\t";
   1737   buf += "else\n\t\t";
   1738   buf += elementName;
   1739   buf += " = ((";
   1740   buf += elementTypeAsString;
   1741   buf += ")0);\n\t";
   1742   buf += "}\n";
   1743 
   1744   // Insert all these *after* the statement body.
   1745   // FIXME: If this should support Obj-C++, support CXXTryStmt
   1746   if (isa<CompoundStmt>(S->getBody())) {
   1747     SourceLocation endBodyLoc = OrigEnd.getFileLocWithOffset(1);
   1748     InsertText(endBodyLoc, buf);
   1749   } else {
   1750     /* Need to treat single statements specially. For example:
   1751      *
   1752      *     for (A *a in b) if (stuff()) break;
   1753      *     for (A *a in b) xxxyy;
   1754      *
   1755      * The following code simply scans ahead to the semi to find the actual end.
   1756      */
   1757     const char *stmtBuf = SM->getCharacterData(OrigEnd);
   1758     const char *semiBuf = strchr(stmtBuf, ';');
   1759     assert(semiBuf && "Can't find ';'");
   1760     SourceLocation endBodyLoc = OrigEnd.getFileLocWithOffset(semiBuf-stmtBuf+1);
   1761     InsertText(endBodyLoc, buf);
   1762   }
   1763   Stmts.pop_back();
   1764   ObjCBcLabelNo.pop_back();
   1765   return 0;
   1766 }
   1767 
   1768 /// RewriteObjCSynchronizedStmt -
   1769 /// This routine rewrites @synchronized(expr) stmt;
   1770 /// into:
   1771 /// objc_sync_enter(expr);
   1772 /// @try stmt @finally { objc_sync_exit(expr); }
   1773 ///
   1774 Stmt *RewriteObjC::RewriteObjCSynchronizedStmt(ObjCAtSynchronizedStmt *S) {
   1775   // Get the start location and compute the semi location.
   1776   SourceLocation startLoc = S->getLocStart();
   1777   const char *startBuf = SM->getCharacterData(startLoc);
   1778 
   1779   assert((*startBuf == '@') && "bogus @synchronized location");
   1780 
   1781   std::string buf;
   1782   buf = "objc_sync_enter((id)";
   1783   const char *lparenBuf = startBuf;
   1784   while (*lparenBuf != '(') lparenBuf++;
   1785   ReplaceText(startLoc, lparenBuf-startBuf+1, buf);
   1786   // We can't use S->getSynchExpr()->getLocEnd() to find the end location, since
   1787   // the sync expression is typically a message expression that's already
   1788   // been rewritten! (which implies the SourceLocation's are invalid).
   1789   SourceLocation endLoc = S->getSynchBody()->getLocStart();
   1790   const char *endBuf = SM->getCharacterData(endLoc);
   1791   while (*endBuf != ')') endBuf--;
   1792   SourceLocation rparenLoc = startLoc.getFileLocWithOffset(endBuf-startBuf);
   1793   buf = ");\n";
   1794   // declare a new scope with two variables, _stack and _rethrow.
   1795   buf += "/* @try scope begin */ \n{ struct _objc_exception_data {\n";
   1796   buf += "int buf[18/*32-bit i386*/];\n";
   1797   buf += "char *pointers[4];} _stack;\n";
   1798   buf += "id volatile _rethrow = 0;\n";
   1799   buf += "objc_exception_try_enter(&_stack);\n";
   1800   buf += "if (!_setjmp(_stack.buf)) /* @try block continue */\n";
   1801   ReplaceText(rparenLoc, 1, buf);
   1802   startLoc = S->getSynchBody()->getLocEnd();
   1803   startBuf = SM->getCharacterData(startLoc);
   1804 
   1805   assert((*startBuf == '}') && "bogus @synchronized block");
   1806   SourceLocation lastCurlyLoc = startLoc;
   1807   buf = "}\nelse {\n";
   1808   buf += "  _rethrow = objc_exception_extract(&_stack);\n";
   1809   buf += "}\n";
   1810   buf += "{ /* implicit finally clause */\n";
   1811   buf += "  if (!_rethrow) objc_exception_try_exit(&_stack);\n";
   1812 
   1813   std::string syncBuf;
   1814   syncBuf += " objc_sync_exit(";
   1815   Expr *syncExpr = NoTypeInfoCStyleCastExpr(Context, Context->getObjCIdType(),
   1816                                             CK_BitCast,
   1817                                             S->getSynchExpr());
   1818   std::string syncExprBufS;
   1819   llvm::raw_string_ostream syncExprBuf(syncExprBufS);
   1820   syncExpr->printPretty(syncExprBuf, *Context, 0,
   1821                         PrintingPolicy(LangOpts));
   1822   syncBuf += syncExprBuf.str();
   1823   syncBuf += ");";
   1824 
   1825   buf += syncBuf;
   1826   buf += "\n  if (_rethrow) objc_exception_throw(_rethrow);\n";
   1827   buf += "}\n";
   1828   buf += "}";
   1829 
   1830   ReplaceText(lastCurlyLoc, 1, buf);
   1831 
   1832   bool hasReturns = false;
   1833   HasReturnStmts(S->getSynchBody(), hasReturns);
   1834   if (hasReturns)
   1835     RewriteSyncReturnStmts(S->getSynchBody(), syncBuf);
   1836 
   1837   return 0;
   1838 }
   1839 
   1840 void RewriteObjC::WarnAboutReturnGotoStmts(Stmt *S)
   1841 {
   1842   // Perform a bottom up traversal of all children.
   1843   for (Stmt::child_range CI = S->children(); CI; ++CI)
   1844     if (*CI)
   1845       WarnAboutReturnGotoStmts(*CI);
   1846 
   1847   if (isa<ReturnStmt>(S) || isa<GotoStmt>(S)) {
   1848     Diags.Report(Context->getFullLoc(S->getLocStart()),
   1849                  TryFinallyContainsReturnDiag);
   1850   }
   1851   return;
   1852 }
   1853 
   1854 void RewriteObjC::HasReturnStmts(Stmt *S, bool &hasReturns)
   1855 {
   1856   // Perform a bottom up traversal of all children.
   1857   for (Stmt::child_range CI = S->children(); CI; ++CI)
   1858    if (*CI)
   1859      HasReturnStmts(*CI, hasReturns);
   1860 
   1861  if (isa<ReturnStmt>(S))
   1862    hasReturns = true;
   1863  return;
   1864 }
   1865 
   1866 void RewriteObjC::RewriteTryReturnStmts(Stmt *S) {
   1867  // Perform a bottom up traversal of all children.
   1868  for (Stmt::child_range CI = S->children(); CI; ++CI)
   1869    if (*CI) {
   1870      RewriteTryReturnStmts(*CI);
   1871    }
   1872  if (isa<ReturnStmt>(S)) {
   1873    SourceLocation startLoc = S->getLocStart();
   1874    const char *startBuf = SM->getCharacterData(startLoc);
   1875 
   1876    const char *semiBuf = strchr(startBuf, ';');
   1877    assert((*semiBuf == ';') && "RewriteTryReturnStmts: can't find ';'");
   1878    SourceLocation onePastSemiLoc = startLoc.getFileLocWithOffset(semiBuf-startBuf+1);
   1879 
   1880    std::string buf;
   1881    buf = "{ objc_exception_try_exit(&_stack); return";
   1882 
   1883    ReplaceText(startLoc, 6, buf);
   1884    InsertText(onePastSemiLoc, "}");
   1885  }
   1886  return;
   1887 }
   1888 
   1889 void RewriteObjC::RewriteSyncReturnStmts(Stmt *S, std::string syncExitBuf) {
   1890   // Perform a bottom up traversal of all children.
   1891   for (Stmt::child_range CI = S->children(); CI; ++CI)
   1892     if (*CI) {
   1893       RewriteSyncReturnStmts(*CI, syncExitBuf);
   1894     }
   1895   if (isa<ReturnStmt>(S)) {
   1896     SourceLocation startLoc = S->getLocStart();
   1897     const char *startBuf = SM->getCharacterData(startLoc);
   1898 
   1899     const char *semiBuf = strchr(startBuf, ';');
   1900     assert((*semiBuf == ';') && "RewriteSyncReturnStmts: can't find ';'");
   1901     SourceLocation onePastSemiLoc = startLoc.getFileLocWithOffset(semiBuf-startBuf+1);
   1902 
   1903     std::string buf;
   1904     buf = "{ objc_exception_try_exit(&_stack);";
   1905     buf += syncExitBuf;
   1906     buf += " return";
   1907 
   1908     ReplaceText(startLoc, 6, buf);
   1909     InsertText(onePastSemiLoc, "}");
   1910   }
   1911   return;
   1912 }
   1913 
   1914 Stmt *RewriteObjC::RewriteObjCTryStmt(ObjCAtTryStmt *S) {
   1915   // Get the start location and compute the semi location.
   1916   SourceLocation startLoc = S->getLocStart();
   1917   const char *startBuf = SM->getCharacterData(startLoc);
   1918 
   1919   assert((*startBuf == '@') && "bogus @try location");
   1920 
   1921   std::string buf;
   1922   // declare a new scope with two variables, _stack and _rethrow.
   1923   buf = "/* @try scope begin */ { struct _objc_exception_data {\n";
   1924   buf += "int buf[18/*32-bit i386*/];\n";
   1925   buf += "char *pointers[4];} _stack;\n";
   1926   buf += "id volatile _rethrow = 0;\n";
   1927   buf += "objc_exception_try_enter(&_stack);\n";
   1928   buf += "if (!_setjmp(_stack.buf)) /* @try block continue */\n";
   1929 
   1930   ReplaceText(startLoc, 4, buf);
   1931 
   1932   startLoc = S->getTryBody()->getLocEnd();
   1933   startBuf = SM->getCharacterData(startLoc);
   1934 
   1935   assert((*startBuf == '}') && "bogus @try block");
   1936 
   1937   SourceLocation lastCurlyLoc = startLoc;
   1938   if (S->getNumCatchStmts()) {
   1939     startLoc = startLoc.getFileLocWithOffset(1);
   1940     buf = " /* @catch begin */ else {\n";
   1941     buf += " id _caught = objc_exception_extract(&_stack);\n";
   1942     buf += " objc_exception_try_enter (&_stack);\n";
   1943     buf += " if (_setjmp(_stack.buf))\n";
   1944     buf += "   _rethrow = objc_exception_extract(&_stack);\n";
   1945     buf += " else { /* @catch continue */";
   1946 
   1947     InsertText(startLoc, buf);
   1948   } else { /* no catch list */
   1949     buf = "}\nelse {\n";
   1950     buf += "  _rethrow = objc_exception_extract(&_stack);\n";
   1951     buf += "}";
   1952     ReplaceText(lastCurlyLoc, 1, buf);
   1953   }
   1954   Stmt *lastCatchBody = 0;
   1955   for (unsigned I = 0, N = S->getNumCatchStmts(); I != N; ++I) {
   1956     ObjCAtCatchStmt *Catch = S->getCatchStmt(I);
   1957     VarDecl *catchDecl = Catch->getCatchParamDecl();
   1958 
   1959     if (I == 0)
   1960       buf = "if ("; // we are generating code for the first catch clause
   1961     else
   1962       buf = "else if (";
   1963     startLoc = Catch->getLocStart();
   1964     startBuf = SM->getCharacterData(startLoc);
   1965 
   1966     assert((*startBuf == '@') && "bogus @catch location");
   1967 
   1968     const char *lParenLoc = strchr(startBuf, '(');
   1969 
   1970     if (Catch->hasEllipsis()) {
   1971       // Now rewrite the body...
   1972       lastCatchBody = Catch->getCatchBody();
   1973       SourceLocation bodyLoc = lastCatchBody->getLocStart();
   1974       const char *bodyBuf = SM->getCharacterData(bodyLoc);
   1975       assert(*SM->getCharacterData(Catch->getRParenLoc()) == ')' &&
   1976              "bogus @catch paren location");
   1977       assert((*bodyBuf == '{') && "bogus @catch body location");
   1978 
   1979       buf += "1) { id _tmp = _caught;";
   1980       Rewrite.ReplaceText(startLoc, bodyBuf-startBuf+1, buf);
   1981     } else if (catchDecl) {
   1982       QualType t = catchDecl->getType();
   1983       if (t == Context->getObjCIdType()) {
   1984         buf += "1) { ";
   1985         ReplaceText(startLoc, lParenLoc-startBuf+1, buf);
   1986       } else if (const ObjCObjectPointerType *Ptr =
   1987                    t->getAs<ObjCObjectPointerType>()) {
   1988         // Should be a pointer to a class.
   1989         ObjCInterfaceDecl *IDecl = Ptr->getObjectType()->getInterface();
   1990         if (IDecl) {
   1991           buf += "objc_exception_match((struct objc_class *)objc_getClass(\"";
   1992           buf += IDecl->getNameAsString();
   1993           buf += "\"), (struct objc_object *)_caught)) { ";
   1994           ReplaceText(startLoc, lParenLoc-startBuf+1, buf);
   1995         }
   1996       }
   1997       // Now rewrite the body...
   1998       lastCatchBody = Catch->getCatchBody();
   1999       SourceLocation rParenLoc = Catch->getRParenLoc();
   2000       SourceLocation bodyLoc = lastCatchBody->getLocStart();
   2001       const char *bodyBuf = SM->getCharacterData(bodyLoc);
   2002       const char *rParenBuf = SM->getCharacterData(rParenLoc);
   2003       assert((*rParenBuf == ')') && "bogus @catch paren location");
   2004       assert((*bodyBuf == '{') && "bogus @catch body location");
   2005 
   2006       // Here we replace ") {" with "= _caught;" (which initializes and
   2007       // declares the @catch parameter).
   2008       ReplaceText(rParenLoc, bodyBuf-rParenBuf+1, " = _caught;");
   2009     } else {
   2010       assert(false && "@catch rewrite bug");
   2011     }
   2012   }
   2013   // Complete the catch list...
   2014   if (lastCatchBody) {
   2015     SourceLocation bodyLoc = lastCatchBody->getLocEnd();
   2016     assert(*SM->getCharacterData(bodyLoc) == '}' &&
   2017            "bogus @catch body location");
   2018 
   2019     // Insert the last (implicit) else clause *before* the right curly brace.
   2020     bodyLoc = bodyLoc.getFileLocWithOffset(-1);
   2021     buf = "} /* last catch end */\n";
   2022     buf += "else {\n";
   2023     buf += " _rethrow = _caught;\n";
   2024     buf += " objc_exception_try_exit(&_stack);\n";
   2025     buf += "} } /* @catch end */\n";
   2026     if (!S->getFinallyStmt())
   2027       buf += "}\n";
   2028     InsertText(bodyLoc, buf);
   2029 
   2030     // Set lastCurlyLoc
   2031     lastCurlyLoc = lastCatchBody->getLocEnd();
   2032   }
   2033   if (ObjCAtFinallyStmt *finalStmt = S->getFinallyStmt()) {
   2034     startLoc = finalStmt->getLocStart();
   2035     startBuf = SM->getCharacterData(startLoc);
   2036     assert((*startBuf == '@') && "bogus @finally start");
   2037 
   2038     ReplaceText(startLoc, 8, "/* @finally */");
   2039 
   2040     Stmt *body = finalStmt->getFinallyBody();
   2041     SourceLocation startLoc = body->getLocStart();
   2042     SourceLocation endLoc = body->getLocEnd();
   2043     assert(*SM->getCharacterData(startLoc) == '{' &&
   2044            "bogus @finally body location");
   2045     assert(*SM->getCharacterData(endLoc) == '}' &&
   2046            "bogus @finally body location");
   2047 
   2048     startLoc = startLoc.getFileLocWithOffset(1);
   2049     InsertText(startLoc, " if (!_rethrow) objc_exception_try_exit(&_stack);\n");
   2050     endLoc = endLoc.getFileLocWithOffset(-1);
   2051     InsertText(endLoc, " if (_rethrow) objc_exception_throw(_rethrow);\n");
   2052 
   2053     // Set lastCurlyLoc
   2054     lastCurlyLoc = body->getLocEnd();
   2055 
   2056     // Now check for any return/continue/go statements within the @try.
   2057     WarnAboutReturnGotoStmts(S->getTryBody());
   2058   } else { /* no finally clause - make sure we synthesize an implicit one */
   2059     buf = "{ /* implicit finally clause */\n";
   2060     buf += " if (!_rethrow) objc_exception_try_exit(&_stack);\n";
   2061     buf += " if (_rethrow) objc_exception_throw(_rethrow);\n";
   2062     buf += "}";
   2063     ReplaceText(lastCurlyLoc, 1, buf);
   2064 
   2065     // Now check for any return/continue/go statements within the @try.
   2066     // The implicit finally clause won't called if the @try contains any
   2067     // jump statements.
   2068     bool hasReturns = false;
   2069     HasReturnStmts(S->getTryBody(), hasReturns);
   2070     if (hasReturns)
   2071       RewriteTryReturnStmts(S->getTryBody());
   2072   }
   2073   // Now emit the final closing curly brace...
   2074   lastCurlyLoc = lastCurlyLoc.getFileLocWithOffset(1);
   2075   InsertText(lastCurlyLoc, " } /* @try scope end */\n");
   2076   return 0;
   2077 }
   2078 
   2079 // This can't be done with ReplaceStmt(S, ThrowExpr), since
   2080 // the throw expression is typically a message expression that's already
   2081 // been rewritten! (which implies the SourceLocation's are invalid).
   2082 Stmt *RewriteObjC::RewriteObjCThrowStmt(ObjCAtThrowStmt *S) {
   2083   // Get the start location and compute the semi location.
   2084   SourceLocation startLoc = S->getLocStart();
   2085   const char *startBuf = SM->getCharacterData(startLoc);
   2086 
   2087   assert((*startBuf == '@') && "bogus @throw location");
   2088 
   2089   std::string buf;
   2090   /* void objc_exception_throw(id) __attribute__((noreturn)); */
   2091   if (S->getThrowExpr())
   2092     buf = "objc_exception_throw(";
   2093   else // add an implicit argument
   2094     buf = "objc_exception_throw(_caught";
   2095 
   2096   // handle "@  throw" correctly.
   2097   const char *wBuf = strchr(startBuf, 'w');
   2098   assert((*wBuf == 'w') && "@throw: can't find 'w'");
   2099   ReplaceText(startLoc, wBuf-startBuf+1, buf);
   2100 
   2101   const char *semiBuf = strchr(startBuf, ';');
   2102   assert((*semiBuf == ';') && "@throw: can't find ';'");
   2103   SourceLocation semiLoc = startLoc.getFileLocWithOffset(semiBuf-startBuf);
   2104   ReplaceText(semiLoc, 1, ");");
   2105   return 0;
   2106 }
   2107 
   2108 Stmt *RewriteObjC::RewriteAtEncode(ObjCEncodeExpr *Exp) {
   2109   // Create a new string expression.
   2110   QualType StrType = Context->getPointerType(Context->CharTy);
   2111   std::string StrEncoding;
   2112   Context->getObjCEncodingForType(Exp->getEncodedType(), StrEncoding);
   2113   Expr *Replacement = StringLiteral::Create(*Context, StrEncoding,
   2114                                             false, false, StrType,
   2115                                             SourceLocation());
   2116   ReplaceStmt(Exp, Replacement);
   2117 
   2118   // Replace this subexpr in the parent.
   2119   // delete Exp; leak for now, see RewritePropertyOrImplicitSetter() usage for more info.
   2120   return Replacement;
   2121 }
   2122 
   2123 Stmt *RewriteObjC::RewriteAtSelector(ObjCSelectorExpr *Exp) {
   2124   if (!SelGetUidFunctionDecl)
   2125     SynthSelGetUidFunctionDecl();
   2126   assert(SelGetUidFunctionDecl && "Can't find sel_registerName() decl");
   2127   // Create a call to sel_registerName("selName").
   2128   llvm::SmallVector<Expr*, 8> SelExprs;
   2129   QualType argType = Context->getPointerType(Context->CharTy);
   2130   SelExprs.push_back(StringLiteral::Create(*Context,
   2131                                            Exp->getSelector().getAsString(),
   2132                                            false, false, argType,
   2133                                            SourceLocation()));
   2134   CallExpr *SelExp = SynthesizeCallToFunctionDecl(SelGetUidFunctionDecl,
   2135                                                  &SelExprs[0], SelExprs.size());
   2136   ReplaceStmt(Exp, SelExp);
   2137   // delete Exp; leak for now, see RewritePropertyOrImplicitSetter() usage for more info.
   2138   return SelExp;
   2139 }
   2140 
   2141 CallExpr *RewriteObjC::SynthesizeCallToFunctionDecl(
   2142   FunctionDecl *FD, Expr **args, unsigned nargs, SourceLocation StartLoc,
   2143                                                     SourceLocation EndLoc) {
   2144   // Get the type, we will need to reference it in a couple spots.
   2145   QualType msgSendType = FD->getType();
   2146 
   2147   // Create a reference to the objc_msgSend() declaration.
   2148   DeclRefExpr *DRE =
   2149     new (Context) DeclRefExpr(FD, msgSendType, VK_LValue, SourceLocation());
   2150 
   2151   // Now, we cast the reference to a pointer to the objc_msgSend type.
   2152   QualType pToFunc = Context->getPointerType(msgSendType);
   2153   ImplicitCastExpr *ICE =
   2154     ImplicitCastExpr::Create(*Context, pToFunc, CK_FunctionToPointerDecay,
   2155                              DRE, 0, VK_RValue);
   2156 
   2157   const FunctionType *FT = msgSendType->getAs<FunctionType>();
   2158 
   2159   CallExpr *Exp =
   2160     new (Context) CallExpr(*Context, ICE, args, nargs,
   2161                            FT->getCallResultType(*Context),
   2162                            VK_RValue, EndLoc);
   2163   return Exp;
   2164 }
   2165 
   2166 static bool scanForProtocolRefs(const char *startBuf, const char *endBuf,
   2167                                 const char *&startRef, const char *&endRef) {
   2168   while (startBuf < endBuf) {
   2169     if (*startBuf == '<')
   2170       startRef = startBuf; // mark the start.
   2171     if (*startBuf == '>') {
   2172       if (startRef && *startRef == '<') {
   2173         endRef = startBuf; // mark the end.
   2174         return true;
   2175       }
   2176       return false;
   2177     }
   2178     startBuf++;
   2179   }
   2180   return false;
   2181 }
   2182 
   2183 static void scanToNextArgument(const char *&argRef) {
   2184   int angle = 0;
   2185   while (*argRef != ')' && (*argRef != ',' || angle > 0)) {
   2186     if (*argRef == '<')
   2187       angle++;
   2188     else if (*argRef == '>')
   2189       angle--;
   2190     argRef++;
   2191   }
   2192   assert(angle == 0 && "scanToNextArgument - bad protocol type syntax");
   2193 }
   2194 
   2195 bool RewriteObjC::needToScanForQualifiers(QualType T) {
   2196   if (T->isObjCQualifiedIdType())
   2197     return true;
   2198   if (const PointerType *PT = T->getAs<PointerType>()) {
   2199     if (PT->getPointeeType()->isObjCQualifiedIdType())
   2200       return true;
   2201   }
   2202   if (T->isObjCObjectPointerType()) {
   2203     T = T->getPointeeType();
   2204     return T->isObjCQualifiedInterfaceType();
   2205   }
   2206   if (T->isArrayType()) {
   2207     QualType ElemTy = Context->getBaseElementType(T);
   2208     return needToScanForQualifiers(ElemTy);
   2209   }
   2210   return false;
   2211 }
   2212 
   2213 void RewriteObjC::RewriteObjCQualifiedInterfaceTypes(Expr *E) {
   2214   QualType Type = E->getType();
   2215   if (needToScanForQualifiers(Type)) {
   2216     SourceLocation Loc, EndLoc;
   2217 
   2218     if (const CStyleCastExpr *ECE = dyn_cast<CStyleCastExpr>(E)) {
   2219       Loc = ECE->getLParenLoc();
   2220       EndLoc = ECE->getRParenLoc();
   2221     } else {
   2222       Loc = E->getLocStart();
   2223       EndLoc = E->getLocEnd();
   2224     }
   2225     // This will defend against trying to rewrite synthesized expressions.
   2226     if (Loc.isInvalid() || EndLoc.isInvalid())
   2227       return;
   2228 
   2229     const char *startBuf = SM->getCharacterData(Loc);
   2230     const char *endBuf = SM->getCharacterData(EndLoc);
   2231     const char *startRef = 0, *endRef = 0;
   2232     if (scanForProtocolRefs(startBuf, endBuf, startRef, endRef)) {
   2233       // Get the locations of the startRef, endRef.
   2234       SourceLocation LessLoc = Loc.getFileLocWithOffset(startRef-startBuf);
   2235       SourceLocation GreaterLoc = Loc.getFileLocWithOffset(endRef-startBuf+1);
   2236       // Comment out the protocol references.
   2237       InsertText(LessLoc, "/*");
   2238       InsertText(GreaterLoc, "*/");
   2239     }
   2240   }
   2241 }
   2242 
   2243 void RewriteObjC::RewriteObjCQualifiedInterfaceTypes(Decl *Dcl) {
   2244   SourceLocation Loc;
   2245   QualType Type;
   2246   const FunctionProtoType *proto = 0;
   2247   if (VarDecl *VD = dyn_cast<VarDecl>(Dcl)) {
   2248     Loc = VD->getLocation();
   2249     Type = VD->getType();
   2250   }
   2251   else if (FunctionDecl *FD = dyn_cast<FunctionDecl>(Dcl)) {
   2252     Loc = FD->getLocation();
   2253     // Check for ObjC 'id' and class types that have been adorned with protocol
   2254     // information (id<p>, C<p>*). The protocol references need to be rewritten!
   2255     const FunctionType *funcType = FD->getType()->getAs<FunctionType>();
   2256     assert(funcType && "missing function type");
   2257     proto = dyn_cast<FunctionProtoType>(funcType);
   2258     if (!proto)
   2259       return;
   2260     Type = proto->getResultType();
   2261   }
   2262   else if (FieldDecl *FD = dyn_cast<FieldDecl>(Dcl)) {
   2263     Loc = FD->getLocation();
   2264     Type = FD->getType();
   2265   }
   2266   else
   2267     return;
   2268 
   2269   if (needToScanForQualifiers(Type)) {
   2270     // Since types are unique, we need to scan the buffer.
   2271 
   2272     const char *endBuf = SM->getCharacterData(Loc);
   2273     const char *startBuf = endBuf;
   2274     while (*startBuf != ';' && *startBuf != '<' && startBuf != MainFileStart)
   2275       startBuf--; // scan backward (from the decl location) for return type.
   2276     const char *startRef = 0, *endRef = 0;
   2277     if (scanForProtocolRefs(startBuf, endBuf, startRef, endRef)) {
   2278       // Get the locations of the startRef, endRef.
   2279       SourceLocation LessLoc = Loc.getFileLocWithOffset(startRef-endBuf);
   2280       SourceLocation GreaterLoc = Loc.getFileLocWithOffset(endRef-endBuf+1);
   2281       // Comment out the protocol references.
   2282       InsertText(LessLoc, "/*");
   2283       InsertText(GreaterLoc, "*/");
   2284     }
   2285   }
   2286   if (!proto)
   2287       return; // most likely, was a variable
   2288   // Now check arguments.
   2289   const char *startBuf = SM->getCharacterData(Loc);
   2290   const char *startFuncBuf = startBuf;
   2291   for (unsigned i = 0; i < proto->getNumArgs(); i++) {
   2292     if (needToScanForQualifiers(proto->getArgType(i))) {
   2293       // Since types are unique, we need to scan the buffer.
   2294 
   2295       const char *endBuf = startBuf;
   2296       // scan forward (from the decl location) for argument types.
   2297       scanToNextArgument(endBuf);
   2298       const char *startRef = 0, *endRef = 0;
   2299       if (scanForProtocolRefs(startBuf, endBuf, startRef, endRef)) {
   2300         // Get the locations of the startRef, endRef.
   2301         SourceLocation LessLoc =
   2302           Loc.getFileLocWithOffset(startRef-startFuncBuf);
   2303         SourceLocation GreaterLoc =
   2304           Loc.getFileLocWithOffset(endRef-startFuncBuf+1);
   2305         // Comment out the protocol references.
   2306         InsertText(LessLoc, "/*");
   2307         InsertText(GreaterLoc, "*/");
   2308       }
   2309       startBuf = ++endBuf;
   2310     }
   2311     else {
   2312       // If the function name is derived from a macro expansion, then the
   2313       // argument buffer will not follow the name. Need to speak with Chris.
   2314       while (*startBuf && *startBuf != ')' && *startBuf != ',')
   2315         startBuf++; // scan forward (from the decl location) for argument types.
   2316       startBuf++;
   2317     }
   2318   }
   2319 }
   2320 
   2321 void RewriteObjC::RewriteTypeOfDecl(VarDecl *ND) {
   2322   QualType QT = ND->getType();
   2323   const Type* TypePtr = QT->getAs<Type>();
   2324   if (!isa<TypeOfExprType>(TypePtr))
   2325     return;
   2326   while (isa<TypeOfExprType>(TypePtr)) {
   2327     const TypeOfExprType *TypeOfExprTypePtr = cast<TypeOfExprType>(TypePtr);
   2328     QT = TypeOfExprTypePtr->getUnderlyingExpr()->getType();
   2329     TypePtr = QT->getAs<Type>();
   2330   }
   2331   // FIXME. This will not work for multiple declarators; as in:
   2332   // __typeof__(a) b,c,d;
   2333   std::string TypeAsString(QT.getAsString(Context->PrintingPolicy));
   2334   SourceLocation DeclLoc = ND->getTypeSpecStartLoc();
   2335   const char *startBuf = SM->getCharacterData(DeclLoc);
   2336   if (ND->getInit()) {
   2337     std::string Name(ND->getNameAsString());
   2338     TypeAsString += " " + Name + " = ";
   2339     Expr *E = ND->getInit();
   2340     SourceLocation startLoc;
   2341     if (const CStyleCastExpr *ECE = dyn_cast<CStyleCastExpr>(E))
   2342       startLoc = ECE->getLParenLoc();
   2343     else
   2344       startLoc = E->getLocStart();
   2345     startLoc = SM->getInstantiationLoc(startLoc);
   2346     const char *endBuf = SM->getCharacterData(startLoc);
   2347     ReplaceText(DeclLoc, endBuf-startBuf-1, TypeAsString);
   2348   }
   2349   else {
   2350     SourceLocation X = ND->getLocEnd();
   2351     X = SM->getInstantiationLoc(X);
   2352     const char *endBuf = SM->getCharacterData(X);
   2353     ReplaceText(DeclLoc, endBuf-startBuf-1, TypeAsString);
   2354   }
   2355 }
   2356 
   2357 // SynthSelGetUidFunctionDecl - SEL sel_registerName(const char *str);
   2358 void RewriteObjC::SynthSelGetUidFunctionDecl() {
   2359   IdentifierInfo *SelGetUidIdent = &Context->Idents.get("sel_registerName");
   2360   llvm::SmallVector<QualType, 16> ArgTys;
   2361   ArgTys.push_back(Context->getPointerType(Context->CharTy.withConst()));
   2362   QualType getFuncType =
   2363     getSimpleFunctionType(Context->getObjCSelType(), &ArgTys[0], ArgTys.size());
   2364   SelGetUidFunctionDecl = FunctionDecl::Create(*Context, TUDecl,
   2365                                            SourceLocation(),
   2366                                            SourceLocation(),
   2367                                            SelGetUidIdent, getFuncType, 0,
   2368                                            SC_Extern,
   2369                                            SC_None, false);
   2370 }
   2371 
   2372 void RewriteObjC::RewriteFunctionDecl(FunctionDecl *FD) {
   2373   // declared in <objc/objc.h>
   2374   if (FD->getIdentifier() &&
   2375       FD->getName() == "sel_registerName") {
   2376     SelGetUidFunctionDecl = FD;
   2377     return;
   2378   }
   2379   RewriteObjCQualifiedInterfaceTypes(FD);
   2380 }
   2381 
   2382 void RewriteObjC::RewriteBlockPointerType(std::string& Str, QualType Type) {
   2383   std::string TypeString(Type.getAsString(Context->PrintingPolicy));
   2384   const char *argPtr = TypeString.c_str();
   2385   if (!strchr(argPtr, '^')) {
   2386     Str += TypeString;
   2387     return;
   2388   }
   2389   while (*argPtr) {
   2390     Str += (*argPtr == '^' ? '*' : *argPtr);
   2391     argPtr++;
   2392   }
   2393 }
   2394 
   2395 // FIXME. Consolidate this routine with RewriteBlockPointerType.
   2396 void RewriteObjC::RewriteBlockPointerTypeVariable(std::string& Str,
   2397                                                   ValueDecl *VD) {
   2398   QualType Type = VD->getType();
   2399   std::string TypeString(Type.getAsString(Context->PrintingPolicy));
   2400   const char *argPtr = TypeString.c_str();
   2401   int paren = 0;
   2402   while (*argPtr) {
   2403     switch (*argPtr) {
   2404       case '(':
   2405         Str += *argPtr;
   2406         paren++;
   2407         break;
   2408       case ')':
   2409         Str += *argPtr;
   2410         paren--;
   2411         break;
   2412       case '^':
   2413         Str += '*';
   2414         if (paren == 1)
   2415           Str += VD->getNameAsString();
   2416         break;
   2417       default:
   2418         Str += *argPtr;
   2419         break;
   2420     }
   2421     argPtr++;
   2422   }
   2423 }
   2424 
   2425 
   2426 void RewriteObjC::RewriteBlockLiteralFunctionDecl(FunctionDecl *FD) {
   2427   SourceLocation FunLocStart = FD->getTypeSpecStartLoc();
   2428   const FunctionType *funcType = FD->getType()->getAs<FunctionType>();
   2429   const FunctionProtoType *proto = dyn_cast<FunctionProtoType>(funcType);
   2430   if (!proto)
   2431     return;
   2432   QualType Type = proto->getResultType();
   2433   std::string FdStr = Type.getAsString(Context->PrintingPolicy);
   2434   FdStr += " ";
   2435   FdStr += FD->getName();
   2436   FdStr +=  "(";
   2437   unsigned numArgs = proto->getNumArgs();
   2438   for (unsigned i = 0; i < numArgs; i++) {
   2439     QualType ArgType = proto->getArgType(i);
   2440     RewriteBlockPointerType(FdStr, ArgType);
   2441     if (i+1 < numArgs)
   2442       FdStr += ", ";
   2443   }
   2444   FdStr +=  ");\n";
   2445   InsertText(FunLocStart, FdStr);
   2446   CurFunctionDeclToDeclareForBlock = 0;
   2447 }
   2448 
   2449 // SynthSuperContructorFunctionDecl - id objc_super(id obj, id super);
   2450 void RewriteObjC::SynthSuperContructorFunctionDecl() {
   2451   if (SuperContructorFunctionDecl)
   2452     return;
   2453   IdentifierInfo *msgSendIdent = &Context->Idents.get("__rw_objc_super");
   2454   llvm::SmallVector<QualType, 16> ArgTys;
   2455   QualType argT = Context->getObjCIdType();
   2456   assert(!argT.isNull() && "Can't find 'id' type");
   2457   ArgTys.push_back(argT);
   2458   ArgTys.push_back(argT);
   2459   QualType msgSendType = getSimpleFunctionType(Context->getObjCIdType(),
   2460                                                &ArgTys[0], ArgTys.size());
   2461   SuperContructorFunctionDecl = FunctionDecl::Create(*Context, TUDecl,
   2462                                          SourceLocation(),
   2463                                          SourceLocation(),
   2464                                          msgSendIdent, msgSendType, 0,
   2465                                          SC_Extern,
   2466                                          SC_None, false);
   2467 }
   2468 
   2469 // SynthMsgSendFunctionDecl - id objc_msgSend(id self, SEL op, ...);
   2470 void RewriteObjC::SynthMsgSendFunctionDecl() {
   2471   IdentifierInfo *msgSendIdent = &Context->Idents.get("objc_msgSend");
   2472   llvm::SmallVector<QualType, 16> ArgTys;
   2473   QualType argT = Context->getObjCIdType();
   2474   assert(!argT.isNull() && "Can't find 'id' type");
   2475   ArgTys.push_back(argT);
   2476   argT = Context->getObjCSelType();
   2477   assert(!argT.isNull() && "Can't find 'SEL' type");
   2478   ArgTys.push_back(argT);
   2479   QualType msgSendType = getSimpleFunctionType(Context->getObjCIdType(),
   2480                                                &ArgTys[0], ArgTys.size(),
   2481                                                true /*isVariadic*/);
   2482   MsgSendFunctionDecl = FunctionDecl::Create(*Context, TUDecl,
   2483                                          SourceLocation(),
   2484                                          SourceLocation(),
   2485                                          msgSendIdent, msgSendType, 0,
   2486                                          SC_Extern,
   2487                                          SC_None, false);
   2488 }
   2489 
   2490 // SynthMsgSendSuperFunctionDecl - id objc_msgSendSuper(struct objc_super *, SEL op, ...);
   2491 void RewriteObjC::SynthMsgSendSuperFunctionDecl() {
   2492   IdentifierInfo *msgSendIdent = &Context->Idents.get("objc_msgSendSuper");
   2493   llvm::SmallVector<QualType, 16> ArgTys;
   2494   RecordDecl *RD = RecordDecl::Create(*Context, TTK_Struct, TUDecl,
   2495                                       SourceLocation(), SourceLocation(),
   2496                                       &Context->Idents.get("objc_super"));
   2497   QualType argT = Context->getPointerType(Context->getTagDeclType(RD));
   2498   assert(!argT.isNull() && "Can't build 'struct objc_super *' type");
   2499   ArgTys.push_back(argT);
   2500   argT = Context->getObjCSelType();
   2501   assert(!argT.isNull() && "Can't find 'SEL' type");
   2502   ArgTys.push_back(argT);
   2503   QualType msgSendType = getSimpleFunctionType(Context->getObjCIdType(),
   2504                                                &ArgTys[0], ArgTys.size(),
   2505                                                true /*isVariadic*/);
   2506   MsgSendSuperFunctionDecl = FunctionDecl::Create(*Context, TUDecl,
   2507                                               SourceLocation(),
   2508                                               SourceLocation(),
   2509                                               msgSendIdent, msgSendType, 0,
   2510                                               SC_Extern,
   2511                                               SC_None, false);
   2512 }
   2513 
   2514 // SynthMsgSendStretFunctionDecl - id objc_msgSend_stret(id self, SEL op, ...);
   2515 void RewriteObjC::SynthMsgSendStretFunctionDecl() {
   2516   IdentifierInfo *msgSendIdent = &Context->Idents.get("objc_msgSend_stret");
   2517   llvm::SmallVector<QualType, 16> ArgTys;
   2518   QualType argT = Context->getObjCIdType();
   2519   assert(!argT.isNull() && "Can't find 'id' type");
   2520   ArgTys.push_back(argT);
   2521   argT = Context->getObjCSelType();
   2522   assert(!argT.isNull() && "Can't find 'SEL' type");
   2523   ArgTys.push_back(argT);
   2524   QualType msgSendType = getSimpleFunctionType(Context->getObjCIdType(),
   2525                                                &ArgTys[0], ArgTys.size(),
   2526                                                true /*isVariadic*/);
   2527   MsgSendStretFunctionDecl = FunctionDecl::Create(*Context, TUDecl,
   2528                                          SourceLocation(),
   2529                                          SourceLocation(),
   2530                                          msgSendIdent, msgSendType, 0,
   2531                                          SC_Extern,
   2532                                          SC_None, false);
   2533 }
   2534 
   2535 // SynthMsgSendSuperStretFunctionDecl -
   2536 // id objc_msgSendSuper_stret(struct objc_super *, SEL op, ...);
   2537 void RewriteObjC::SynthMsgSendSuperStretFunctionDecl() {
   2538   IdentifierInfo *msgSendIdent =
   2539     &Context->Idents.get("objc_msgSendSuper_stret");
   2540   llvm::SmallVector<QualType, 16> ArgTys;
   2541   RecordDecl *RD = RecordDecl::Create(*Context, TTK_Struct, TUDecl,
   2542                                       SourceLocation(), SourceLocation(),
   2543                                       &Context->Idents.get("objc_super"));
   2544   QualType argT = Context->getPointerType(Context->getTagDeclType(RD));
   2545   assert(!argT.isNull() && "Can't build 'struct objc_super *' type");
   2546   ArgTys.push_back(argT);
   2547   argT = Context->getObjCSelType();
   2548   assert(!argT.isNull() && "Can't find 'SEL' type");
   2549   ArgTys.push_back(argT);
   2550   QualType msgSendType = getSimpleFunctionType(Context->getObjCIdType(),
   2551                                                &ArgTys[0], ArgTys.size(),
   2552                                                true /*isVariadic*/);
   2553   MsgSendSuperStretFunctionDecl = FunctionDecl::Create(*Context, TUDecl,
   2554                                                        SourceLocation(),
   2555                                                        SourceLocation(),
   2556                                               msgSendIdent, msgSendType, 0,
   2557                                               SC_Extern,
   2558                                               SC_None, false);
   2559 }
   2560 
   2561 // SynthMsgSendFpretFunctionDecl - double objc_msgSend_fpret(id self, SEL op, ...);
   2562 void RewriteObjC::SynthMsgSendFpretFunctionDecl() {
   2563   IdentifierInfo *msgSendIdent = &Context->Idents.get("objc_msgSend_fpret");
   2564   llvm::SmallVector<QualType, 16> ArgTys;
   2565   QualType argT = Context->getObjCIdType();
   2566   assert(!argT.isNull() && "Can't find 'id' type");
   2567   ArgTys.push_back(argT);
   2568   argT = Context->getObjCSelType();
   2569   assert(!argT.isNull() && "Can't find 'SEL' type");
   2570   ArgTys.push_back(argT);
   2571   QualType msgSendType = getSimpleFunctionType(Context->DoubleTy,
   2572                                                &ArgTys[0], ArgTys.size(),
   2573                                                true /*isVariadic*/);
   2574   MsgSendFpretFunctionDecl = FunctionDecl::Create(*Context, TUDecl,
   2575                                               SourceLocation(),
   2576                                               SourceLocation(),
   2577                                               msgSendIdent, msgSendType, 0,
   2578                                               SC_Extern,
   2579                                               SC_None, false);
   2580 }
   2581 
   2582 // SynthGetClassFunctionDecl - id objc_getClass(const char *name);
   2583 void RewriteObjC::SynthGetClassFunctionDecl() {
   2584   IdentifierInfo *getClassIdent = &Context->Idents.get("objc_getClass");
   2585   llvm::SmallVector<QualType, 16> ArgTys;
   2586   ArgTys.push_back(Context->getPointerType(Context->CharTy.withConst()));
   2587   QualType getClassType = getSimpleFunctionType(Context->getObjCIdType(),
   2588                                                 &ArgTys[0], ArgTys.size());
   2589   GetClassFunctionDecl = FunctionDecl::Create(*Context, TUDecl,
   2590                                           SourceLocation(),
   2591                                           SourceLocation(),
   2592                                           getClassIdent, getClassType, 0,
   2593                                           SC_Extern,
   2594                                           SC_None, false);
   2595 }
   2596 
   2597 // SynthGetSuperClassFunctionDecl - Class class_getSuperclass(Class cls);
   2598 void RewriteObjC::SynthGetSuperClassFunctionDecl() {
   2599   IdentifierInfo *getSuperClassIdent =
   2600     &Context->Idents.get("class_getSuperclass");
   2601   llvm::SmallVector<QualType, 16> ArgTys;
   2602   ArgTys.push_back(Context->getObjCClassType());
   2603   QualType getClassType = getSimpleFunctionType(Context->getObjCClassType(),
   2604                                                 &ArgTys[0], ArgTys.size());
   2605   GetSuperClassFunctionDecl = FunctionDecl::Create(*Context, TUDecl,
   2606                                                    SourceLocation(),
   2607                                                    SourceLocation(),
   2608                                                    getSuperClassIdent,
   2609                                                    getClassType, 0,
   2610                                                    SC_Extern,
   2611                                                    SC_None,
   2612                                                    false);
   2613 }
   2614 
   2615 // SynthGetMetaClassFunctionDecl - id objc_getClass(const char *name);
   2616 void RewriteObjC::SynthGetMetaClassFunctionDecl() {
   2617   IdentifierInfo *getClassIdent = &Context->Idents.get("objc_getMetaClass");
   2618   llvm::SmallVector<QualType, 16> ArgTys;
   2619   ArgTys.push_back(Context->getPointerType(Context->CharTy.withConst()));
   2620   QualType getClassType = getSimpleFunctionType(Context->getObjCIdType(),
   2621                                                 &ArgTys[0], ArgTys.size());
   2622   GetMetaClassFunctionDecl = FunctionDecl::Create(*Context, TUDecl,
   2623                                               SourceLocation(),
   2624                                               SourceLocation(),
   2625                                               getClassIdent, getClassType, 0,
   2626                                               SC_Extern,
   2627                                               SC_None, false);
   2628 }
   2629 
   2630 Stmt *RewriteObjC::RewriteObjCStringLiteral(ObjCStringLiteral *Exp) {
   2631   QualType strType = getConstantStringStructType();
   2632 
   2633   std::string S = "__NSConstantStringImpl_";
   2634 
   2635   std::string tmpName = InFileName;
   2636   unsigned i;
   2637   for (i=0; i < tmpName.length(); i++) {
   2638     char c = tmpName.at(i);
   2639     // replace any non alphanumeric characters with '_'.
   2640     if (!isalpha(c) && (c < '0' || c > '9'))
   2641       tmpName[i] = '_';
   2642   }
   2643   S += tmpName;
   2644   S += "_";
   2645   S += utostr(NumObjCStringLiterals++);
   2646 
   2647   Preamble += "static __NSConstantStringImpl " + S;
   2648   Preamble += " __attribute__ ((section (\"__DATA, __cfstring\"))) = {__CFConstantStringClassReference,";
   2649   Preamble += "0x000007c8,"; // utf8_str
   2650   // The pretty printer for StringLiteral handles escape characters properly.
   2651   std::string prettyBufS;
   2652   llvm::raw_string_ostream prettyBuf(prettyBufS);
   2653   Exp->getString()->printPretty(prettyBuf, *Context, 0,
   2654                                 PrintingPolicy(LangOpts));
   2655   Preamble += prettyBuf.str();
   2656   Preamble += ",";
   2657   Preamble += utostr(Exp->getString()->getByteLength()) + "};\n";
   2658 
   2659   VarDecl *NewVD = VarDecl::Create(*Context, TUDecl, SourceLocation(),
   2660                                    SourceLocation(), &Context->Idents.get(S),
   2661                                    strType, 0, SC_Static, SC_None);
   2662   DeclRefExpr *DRE = new (Context) DeclRefExpr(NewVD, strType, VK_LValue,
   2663                                                SourceLocation());
   2664   Expr *Unop = new (Context) UnaryOperator(DRE, UO_AddrOf,
   2665                                  Context->getPointerType(DRE->getType()),
   2666                                            VK_RValue, OK_Ordinary,
   2667                                            SourceLocation());
   2668   // cast to NSConstantString *
   2669   CastExpr *cast = NoTypeInfoCStyleCastExpr(Context, Exp->getType(),
   2670                                             CK_BitCast, Unop);
   2671   ReplaceStmt(Exp, cast);
   2672   // delete Exp; leak for now, see RewritePropertyOrImplicitSetter() usage for more info.
   2673   return cast;
   2674 }
   2675 
   2676 // struct objc_super { struct objc_object *receiver; struct objc_class *super; };
   2677 QualType RewriteObjC::getSuperStructType() {
   2678   if (!SuperStructDecl) {
   2679     SuperStructDecl = RecordDecl::Create(*Context, TTK_Struct, TUDecl,
   2680                                          SourceLocation(), SourceLocation(),
   2681                                          &Context->Idents.get("objc_super"));
   2682     QualType FieldTypes[2];
   2683 
   2684     // struct objc_object *receiver;
   2685     FieldTypes[0] = Context->getObjCIdType();
   2686     // struct objc_class *super;
   2687     FieldTypes[1] = Context->getObjCClassType();
   2688 
   2689     // Create fields
   2690     for (unsigned i = 0; i < 2; ++i) {
   2691       SuperStructDecl->addDecl(FieldDecl::Create(*Context, SuperStructDecl,
   2692                                                  SourceLocation(),
   2693                                                  SourceLocation(), 0,
   2694                                                  FieldTypes[i], 0,
   2695                                                  /*BitWidth=*/0,
   2696                                                  /*Mutable=*/false,
   2697                                                  /*HasInit=*/false));
   2698     }
   2699 
   2700     SuperStructDecl->completeDefinition();
   2701   }
   2702   return Context->getTagDeclType(SuperStructDecl);
   2703 }
   2704 
   2705 QualType RewriteObjC::getConstantStringStructType() {
   2706   if (!ConstantStringDecl) {
   2707     ConstantStringDecl = RecordDecl::Create(*Context, TTK_Struct, TUDecl,
   2708                                             SourceLocation(), SourceLocation(),
   2709                          &Context->Idents.get("__NSConstantStringImpl"));
   2710     QualType FieldTypes[4];
   2711 
   2712     // struct objc_object *receiver;
   2713     FieldTypes[0] = Context->getObjCIdType();
   2714     // int flags;
   2715     FieldTypes[1] = Context->IntTy;
   2716     // char *str;
   2717     FieldTypes[2] = Context->getPointerType(Context->CharTy);
   2718     // long length;
   2719     FieldTypes[3] = Context->LongTy;
   2720 
   2721     // Create fields
   2722     for (unsigned i = 0; i < 4; ++i) {
   2723       ConstantStringDecl->addDecl(FieldDecl::Create(*Context,
   2724                                                     ConstantStringDecl,
   2725                                                     SourceLocation(),
   2726                                                     SourceLocation(), 0,
   2727                                                     FieldTypes[i], 0,
   2728                                                     /*BitWidth=*/0,
   2729                                                     /*Mutable=*/true,
   2730                                                     /*HasInit=*/false));
   2731     }
   2732 
   2733     ConstantStringDecl->completeDefinition();
   2734   }
   2735   return Context->getTagDeclType(ConstantStringDecl);
   2736 }
   2737 
   2738 Stmt *RewriteObjC::SynthMessageExpr(ObjCMessageExpr *Exp,
   2739                                     SourceLocation StartLoc,
   2740                                     SourceLocation EndLoc) {
   2741   if (!SelGetUidFunctionDecl)
   2742     SynthSelGetUidFunctionDecl();
   2743   if (!MsgSendFunctionDecl)
   2744     SynthMsgSendFunctionDecl();
   2745   if (!MsgSendSuperFunctionDecl)
   2746     SynthMsgSendSuperFunctionDecl();
   2747   if (!MsgSendStretFunctionDecl)
   2748     SynthMsgSendStretFunctionDecl();
   2749   if (!MsgSendSuperStretFunctionDecl)
   2750     SynthMsgSendSuperStretFunctionDecl();
   2751   if (!MsgSendFpretFunctionDecl)
   2752     SynthMsgSendFpretFunctionDecl();
   2753   if (!GetClassFunctionDecl)
   2754     SynthGetClassFunctionDecl();
   2755   if (!GetSuperClassFunctionDecl)
   2756     SynthGetSuperClassFunctionDecl();
   2757   if (!GetMetaClassFunctionDecl)
   2758     SynthGetMetaClassFunctionDecl();
   2759 
   2760   // default to objc_msgSend().
   2761   FunctionDecl *MsgSendFlavor = MsgSendFunctionDecl;
   2762   // May need to use objc_msgSend_stret() as well.
   2763   FunctionDecl *MsgSendStretFlavor = 0;
   2764   if (ObjCMethodDecl *mDecl = Exp->getMethodDecl()) {
   2765     QualType resultType = mDecl->getResultType();
   2766     if (resultType->isRecordType())
   2767       MsgSendStretFlavor = MsgSendStretFunctionDecl;
   2768     else if (resultType->isRealFloatingType())
   2769       MsgSendFlavor = MsgSendFpretFunctionDecl;
   2770   }
   2771 
   2772   // Synthesize a call to objc_msgSend().
   2773   llvm::SmallVector<Expr*, 8> MsgExprs;
   2774   switch (Exp->getReceiverKind()) {
   2775   case ObjCMessageExpr::SuperClass: {
   2776     MsgSendFlavor = MsgSendSuperFunctionDecl;
   2777     if (MsgSendStretFlavor)
   2778       MsgSendStretFlavor = MsgSendSuperStretFunctionDecl;
   2779     assert(MsgSendFlavor && "MsgSendFlavor is NULL!");
   2780 
   2781     ObjCInterfaceDecl *ClassDecl = CurMethodDef->getClassInterface();
   2782 
   2783     llvm::SmallVector<Expr*, 4> InitExprs;
   2784 
   2785     // set the receiver to self, the first argument to all methods.
   2786     InitExprs.push_back(
   2787       NoTypeInfoCStyleCastExpr(Context, Context->getObjCIdType(),
   2788                                CK_BitCast,
   2789                    new (Context) DeclRefExpr(CurMethodDef->getSelfDecl(),
   2790                                              Context->getObjCIdType(),
   2791                                              VK_RValue,
   2792                                              SourceLocation()))
   2793                         ); // set the 'receiver'.
   2794 
   2795     // (id)class_getSuperclass((Class)objc_getClass("CurrentClass"))
   2796     llvm::SmallVector<Expr*, 8> ClsExprs;
   2797     QualType argType = Context->getPointerType(Context->CharTy);
   2798     ClsExprs.push_back(StringLiteral::Create(*Context,
   2799                                    ClassDecl->getIdentifier()->getName(),
   2800                                    false, false, argType, SourceLocation()));
   2801     CallExpr *Cls = SynthesizeCallToFunctionDecl(GetMetaClassFunctionDecl,
   2802                                                  &ClsExprs[0],
   2803                                                  ClsExprs.size(),
   2804                                                  StartLoc,
   2805                                                  EndLoc);
   2806     // (Class)objc_getClass("CurrentClass")
   2807     CastExpr *ArgExpr = NoTypeInfoCStyleCastExpr(Context,
   2808                                              Context->getObjCClassType(),
   2809                                              CK_BitCast, Cls);
   2810     ClsExprs.clear();
   2811     ClsExprs.push_back(ArgExpr);
   2812     Cls = SynthesizeCallToFunctionDecl(GetSuperClassFunctionDecl,
   2813                                        &ClsExprs[0], ClsExprs.size(),
   2814                                        StartLoc, EndLoc);
   2815 
   2816     // (id)class_getSuperclass((Class)objc_getClass("CurrentClass"))
   2817     // To turn off a warning, type-cast to 'id'
   2818     InitExprs.push_back( // set 'super class', using class_getSuperclass().
   2819                         NoTypeInfoCStyleCastExpr(Context,
   2820                                                  Context->getObjCIdType(),
   2821                                                  CK_BitCast, Cls));
   2822     // struct objc_super
   2823     QualType superType = getSuperStructType();
   2824     Expr *SuperRep;
   2825 
   2826     if (LangOpts.Microsoft) {
   2827       SynthSuperContructorFunctionDecl();
   2828       // Simulate a contructor call...
   2829       DeclRefExpr *DRE = new (Context) DeclRefExpr(SuperContructorFunctionDecl,
   2830                                                    superType, VK_LValue,
   2831                                                    SourceLocation());
   2832       SuperRep = new (Context) CallExpr(*Context, DRE, &InitExprs[0],
   2833                                         InitExprs.size(),
   2834                                         superType, VK_LValue,
   2835                                         SourceLocation());
   2836       // The code for super is a little tricky to prevent collision with
   2837       // the structure definition in the header. The rewriter has it's own
   2838       // internal definition (__rw_objc_super) that is uses. This is why
   2839       // we need the cast below. For example:
   2840       // (struct objc_super *)&__rw_objc_super((id)self, (id)objc_getClass("SUPER"))
   2841       //
   2842       SuperRep = new (Context) UnaryOperator(SuperRep, UO_AddrOf,
   2843                                Context->getPointerType(SuperRep->getType()),
   2844                                              VK_RValue, OK_Ordinary,
   2845                                              SourceLocation());
   2846       SuperRep = NoTypeInfoCStyleCastExpr(Context,
   2847                                           Context->getPointerType(superType),
   2848                                           CK_BitCast, SuperRep);
   2849     } else {
   2850       // (struct objc_super) { <exprs from above> }
   2851       InitListExpr *ILE =
   2852         new (Context) InitListExpr(*Context, SourceLocation(),
   2853                                    &InitExprs[0], InitExprs.size(),
   2854                                    SourceLocation());
   2855       TypeSourceInfo *superTInfo
   2856         = Context->getTrivialTypeSourceInfo(superType);
   2857       SuperRep = new (Context) CompoundLiteralExpr(SourceLocation(), superTInfo,
   2858                                                    superType, VK_LValue,
   2859                                                    ILE, false);
   2860       // struct objc_super *
   2861       SuperRep = new (Context) UnaryOperator(SuperRep, UO_AddrOf,
   2862                                Context->getPointerType(SuperRep->getType()),
   2863                                              VK_RValue, OK_Ordinary,
   2864                                              SourceLocation());
   2865     }
   2866     MsgExprs.push_back(SuperRep);
   2867     break;
   2868   }
   2869 
   2870   case ObjCMessageExpr::Class: {
   2871     llvm::SmallVector<Expr*, 8> ClsExprs;
   2872     QualType argType = Context->getPointerType(Context->CharTy);
   2873     ObjCInterfaceDecl *Class
   2874       = Exp->getClassReceiver()->getAs<ObjCObjectType>()->getInterface();
   2875     IdentifierInfo *clsName = Class->getIdentifier();
   2876     ClsExprs.push_back(StringLiteral::Create(*Context,
   2877                                              clsName->getName(),
   2878                                              false, false,
   2879                                              argType, SourceLocation()));
   2880     CallExpr *Cls = SynthesizeCallToFunctionDecl(GetClassFunctionDecl,
   2881                                                  &ClsExprs[0],
   2882                                                  ClsExprs.size(),
   2883                                                  StartLoc, EndLoc);
   2884     MsgExprs.push_back(Cls);
   2885     break;
   2886   }
   2887 
   2888   case ObjCMessageExpr::SuperInstance:{
   2889     MsgSendFlavor = MsgSendSuperFunctionDecl;
   2890     if (MsgSendStretFlavor)
   2891       MsgSendStretFlavor = MsgSendSuperStretFunctionDecl;
   2892     assert(MsgSendFlavor && "MsgSendFlavor is NULL!");
   2893     ObjCInterfaceDecl *ClassDecl = CurMethodDef->getClassInterface();
   2894     llvm::SmallVector<Expr*, 4> InitExprs;
   2895 
   2896     InitExprs.push_back(
   2897       NoTypeInfoCStyleCastExpr(Context, Context->getObjCIdType(),
   2898                                CK_BitCast,
   2899                    new (Context) DeclRefExpr(CurMethodDef->getSelfDecl(),
   2900                                              Context->getObjCIdType(),
   2901                                              VK_RValue, SourceLocation()))
   2902                         ); // set the 'receiver'.
   2903 
   2904     // (id)class_getSuperclass((Class)objc_getClass("CurrentClass"))
   2905     llvm::SmallVector<Expr*, 8> ClsExprs;
   2906     QualType argType = Context->getPointerType(Context->CharTy);
   2907     ClsExprs.push_back(StringLiteral::Create(*Context,
   2908                                    ClassDecl->getIdentifier()->getName(),
   2909                                    false, false, argType, SourceLocation()));
   2910     CallExpr *Cls = SynthesizeCallToFunctionDecl(GetClassFunctionDecl,
   2911                                                  &ClsExprs[0],
   2912                                                  ClsExprs.size(),
   2913                                                  StartLoc, EndLoc);
   2914     // (Class)objc_getClass("CurrentClass")
   2915     CastExpr *ArgExpr = NoTypeInfoCStyleCastExpr(Context,
   2916                                                  Context->getObjCClassType(),
   2917                                                  CK_BitCast, Cls);
   2918     ClsExprs.clear();
   2919     ClsExprs.push_back(ArgExpr);
   2920     Cls = SynthesizeCallToFunctionDecl(GetSuperClassFunctionDecl,
   2921                                        &ClsExprs[0], ClsExprs.size(),
   2922                                        StartLoc, EndLoc);
   2923 
   2924     // (id)class_getSuperclass((Class)objc_getClass("CurrentClass"))
   2925     // To turn off a warning, type-cast to 'id'
   2926     InitExprs.push_back(
   2927       // set 'super class', using class_getSuperclass().
   2928       NoTypeInfoCStyleCastExpr(Context, Context->getObjCIdType(),
   2929                                CK_BitCast, Cls));
   2930     // struct objc_super
   2931     QualType superType = getSuperStructType();
   2932     Expr *SuperRep;
   2933 
   2934     if (LangOpts.Microsoft) {
   2935       SynthSuperContructorFunctionDecl();
   2936       // Simulate a contructor call...
   2937       DeclRefExpr *DRE = new (Context) DeclRefExpr(SuperContructorFunctionDecl,
   2938                                                    superType, VK_LValue,
   2939                                                    SourceLocation());
   2940       SuperRep = new (Context) CallExpr(*Context, DRE, &InitExprs[0],
   2941                                         InitExprs.size(),
   2942                                         superType, VK_LValue, SourceLocation());
   2943       // The code for super is a little tricky to prevent collision with
   2944       // the structure definition in the header. The rewriter has it's own
   2945       // internal definition (__rw_objc_super) that is uses. This is why
   2946       // we need the cast below. For example:
   2947       // (struct objc_super *)&__rw_objc_super((id)self, (id)objc_getClass("SUPER"))
   2948       //
   2949       SuperRep = new (Context) UnaryOperator(SuperRep, UO_AddrOf,
   2950                                Context->getPointerType(SuperRep->getType()),
   2951                                VK_RValue, OK_Ordinary,
   2952                                SourceLocation());
   2953       SuperRep = NoTypeInfoCStyleCastExpr(Context,
   2954                                Context->getPointerType(superType),
   2955                                CK_BitCast, SuperRep);
   2956     } else {
   2957       // (struct objc_super) { <exprs from above> }
   2958       InitListExpr *ILE =
   2959         new (Context) InitListExpr(*Context, SourceLocation(),
   2960                                    &InitExprs[0], InitExprs.size(),
   2961                                    SourceLocation());
   2962       TypeSourceInfo *superTInfo
   2963         = Context->getTrivialTypeSourceInfo(superType);
   2964       SuperRep = new (Context) CompoundLiteralExpr(SourceLocation(), superTInfo,
   2965                                                    superType, VK_RValue, ILE,
   2966                                                    false);
   2967     }
   2968     MsgExprs.push_back(SuperRep);
   2969     break;
   2970   }
   2971 
   2972   case ObjCMessageExpr::Instance: {
   2973     // Remove all type-casts because it may contain objc-style types; e.g.
   2974     // Foo<Proto> *.
   2975     Expr *recExpr = Exp->getInstanceReceiver();
   2976     while (CStyleCastExpr *CE = dyn_cast<CStyleCastExpr>(recExpr))
   2977       recExpr = CE->getSubExpr();
   2978     recExpr = NoTypeInfoCStyleCastExpr(Context, Context->getObjCIdType(),
   2979                                        CK_BitCast, recExpr);
   2980     MsgExprs.push_back(recExpr);
   2981     break;
   2982   }
   2983   }
   2984 
   2985   // Create a call to sel_registerName("selName"), it will be the 2nd argument.
   2986   llvm::SmallVector<Expr*, 8> SelExprs;
   2987   QualType argType = Context->getPointerType(Context->CharTy);
   2988   SelExprs.push_back(StringLiteral::Create(*Context,
   2989                                        Exp->getSelector().getAsString(),
   2990                                        false, false, argType, SourceLocation()));
   2991   CallExpr *SelExp = SynthesizeCallToFunctionDecl(SelGetUidFunctionDecl,
   2992                                                  &SelExprs[0], SelExprs.size(),
   2993                                                   StartLoc,
   2994                                                   EndLoc);
   2995   MsgExprs.push_back(SelExp);
   2996 
   2997   // Now push any user supplied arguments.
   2998   for (unsigned i = 0; i < Exp->getNumArgs(); i++) {
   2999     Expr *userExpr = Exp->getArg(i);
   3000     // Make all implicit casts explicit...ICE comes in handy:-)
   3001     if (ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(userExpr)) {
   3002       // Reuse the ICE type, it is exactly what the doctor ordered.
   3003       QualType type = ICE->getType();
   3004       if (needToScanForQualifiers(type))
   3005         type = Context->getObjCIdType();
   3006       // Make sure we convert "type (^)(...)" to "type (*)(...)".
   3007       (void)convertBlockPointerToFunctionPointer(type);
   3008       userExpr = NoTypeInfoCStyleCastExpr(Context, type, CK_BitCast,
   3009                                           userExpr);
   3010     }
   3011     // Make id<P...> cast into an 'id' cast.
   3012     else if (CStyleCastExpr *CE = dyn_cast<CStyleCastExpr>(userExpr)) {
   3013       if (CE->getType()->isObjCQualifiedIdType()) {
   3014         while ((CE = dyn_cast<CStyleCastExpr>(userExpr)))
   3015           userExpr = CE->getSubExpr();
   3016         userExpr = NoTypeInfoCStyleCastExpr(Context, Context->getObjCIdType(),
   3017                                             CK_BitCast, userExpr);
   3018       }
   3019     }
   3020     MsgExprs.push_back(userExpr);
   3021     // We've transferred the ownership to MsgExprs. For now, we *don't* null
   3022     // out the argument in the original expression (since we aren't deleting
   3023     // the ObjCMessageExpr). See RewritePropertyOrImplicitSetter() usage for more info.
   3024     //Exp->setArg(i, 0);
   3025   }
   3026   // Generate the funky cast.
   3027   CastExpr *cast;
   3028   llvm::SmallVector<QualType, 8> ArgTypes;
   3029   QualType returnType;
   3030 
   3031   // Push 'id' and 'SEL', the 2 implicit arguments.
   3032   if (MsgSendFlavor == MsgSendSuperFunctionDecl)
   3033     ArgTypes.push_back(Context->getPointerType(getSuperStructType()));
   3034   else
   3035     ArgTypes.push_back(Context->getObjCIdType());
   3036   ArgTypes.push_back(Context->getObjCSelType());
   3037   if (ObjCMethodDecl *OMD = Exp->getMethodDecl()) {
   3038     // Push any user argument types.
   3039     for (ObjCMethodDecl::param_iterator PI = OMD->param_begin(),
   3040          E = OMD->param_end(); PI != E; ++PI) {
   3041       QualType t = (*PI)->getType()->isObjCQualifiedIdType()
   3042                      ? Context->getObjCIdType()
   3043                      : (*PI)->getType();
   3044       // Make sure we convert "t (^)(...)" to "t (*)(...)".
   3045       (void)convertBlockPointerToFunctionPointer(t);
   3046       ArgTypes.push_back(t);
   3047     }
   3048     returnType = OMD->getResultType()->isObjCQualifiedIdType()
   3049                    ? Context->getObjCIdType() : OMD->getResultType();
   3050     (void)convertBlockPointerToFunctionPointer(returnType);
   3051   } else {
   3052     returnType = Context->getObjCIdType();
   3053   }
   3054   // Get the type, we will need to reference it in a couple spots.
   3055   QualType msgSendType = MsgSendFlavor->getType();
   3056 
   3057   // Create a reference to the objc_msgSend() declaration.
   3058   DeclRefExpr *DRE = new (Context) DeclRefExpr(MsgSendFlavor, msgSendType,
   3059                                                VK_LValue, SourceLocation());
   3060 
   3061   // Need to cast objc_msgSend to "void *" (to workaround a GCC bandaid).
   3062   // If we don't do this cast, we get the following bizarre warning/note:
   3063   // xx.m:13: warning: function called through a non-compatible type
   3064   // xx.m:13: note: if this code is reached, the program will abort
   3065   cast = NoTypeInfoCStyleCastExpr(Context,
   3066                                   Context->getPointerType(Context->VoidTy),
   3067                                   CK_BitCast, DRE);
   3068 
   3069   // Now do the "normal" pointer to function cast.
   3070   QualType castType =
   3071     getSimpleFunctionType(returnType, &ArgTypes[0], ArgTypes.size(),
   3072       // If we don't have a method decl, force a variadic cast.
   3073       Exp->getMethodDecl() ? Exp->getMethodDecl()->isVariadic() : true);
   3074   castType = Context->getPointerType(castType);
   3075   cast = NoTypeInfoCStyleCastExpr(Context, castType, CK_BitCast,
   3076                                   cast);
   3077 
   3078   // Don't forget the parens to enforce the proper binding.
   3079   ParenExpr *PE = new (Context) ParenExpr(StartLoc, EndLoc, cast);
   3080 
   3081   const FunctionType *FT = msgSendType->getAs<FunctionType>();
   3082   CallExpr *CE = new (Context) CallExpr(*Context, PE, &MsgExprs[0],
   3083                                         MsgExprs.size(),
   3084                                         FT->getResultType(), VK_RValue,
   3085                                         EndLoc);
   3086   Stmt *ReplacingStmt = CE;
   3087   if (MsgSendStretFlavor) {
   3088     // We have the method which returns a struct/union. Must also generate
   3089     // call to objc_msgSend_stret and hang both varieties on a conditional
   3090     // expression which dictate which one to envoke depending on size of
   3091     // method's return type.
   3092 
   3093     // Create a reference to the objc_msgSend_stret() declaration.
   3094     DeclRefExpr *STDRE = new (Context) DeclRefExpr(MsgSendStretFlavor, msgSendType,
   3095                                                    VK_LValue, SourceLocation());
   3096     // Need to cast objc_msgSend_stret to "void *" (see above comment).
   3097     cast = NoTypeInfoCStyleCastExpr(Context,
   3098                                     Context->getPointerType(Context->VoidTy),
   3099                                     CK_BitCast, STDRE);
   3100     // Now do the "normal" pointer to function cast.
   3101     castType = getSimpleFunctionType(returnType, &ArgTypes[0], ArgTypes.size(),
   3102       Exp->getMethodDecl() ? Exp->getMethodDecl()->isVariadic() : false);
   3103     castType = Context->getPointerType(castType);
   3104     cast = NoTypeInfoCStyleCastExpr(Context, castType, CK_BitCast,
   3105                                     cast);
   3106 
   3107     // Don't forget the parens to enforce the proper binding.
   3108     PE = new (Context) ParenExpr(SourceLocation(), SourceLocation(), cast);
   3109 
   3110     FT = msgSendType->getAs<FunctionType>();
   3111     CallExpr *STCE = new (Context) CallExpr(*Context, PE, &MsgExprs[0],
   3112                                             MsgExprs.size(),
   3113                                             FT->getResultType(), VK_RValue,
   3114                                             SourceLocation());
   3115 
   3116     // Build sizeof(returnType)
   3117     UnaryExprOrTypeTraitExpr *sizeofExpr =
   3118        new (Context) UnaryExprOrTypeTraitExpr(UETT_SizeOf,
   3119                                  Context->getTrivialTypeSourceInfo(returnType),
   3120                                  Context->getSizeType(), SourceLocation(),
   3121                                  SourceLocation());
   3122     // (sizeof(returnType) <= 8 ? objc_msgSend(...) : objc_msgSend_stret(...))
   3123     // FIXME: Value of 8 is base on ppc32/x86 ABI for the most common cases.
   3124     // For X86 it is more complicated and some kind of target specific routine
   3125     // is needed to decide what to do.
   3126     unsigned IntSize =
   3127       static_cast<unsigned>(Context->getTypeSize(Context->IntTy));
   3128     IntegerLiteral *limit = IntegerLiteral::Create(*Context,
   3129                                                    llvm::APInt(IntSize, 8),
   3130                                                    Context->IntTy,
   3131                                                    SourceLocation());
   3132     BinaryOperator *lessThanExpr =
   3133       new (Context) BinaryOperator(sizeofExpr, limit, BO_LE, Context->IntTy,
   3134                                    VK_RValue, OK_Ordinary, SourceLocation());
   3135     // (sizeof(returnType) <= 8 ? objc_msgSend(...) : objc_msgSend_stret(...))
   3136     ConditionalOperator *CondExpr =
   3137       new (Context) ConditionalOperator(lessThanExpr,
   3138                                         SourceLocation(), CE,
   3139                                         SourceLocation(), STCE,
   3140                                         returnType, VK_RValue, OK_Ordinary);
   3141     ReplacingStmt = new (Context) ParenExpr(SourceLocation(), SourceLocation(),
   3142                                             CondExpr);
   3143   }
   3144   // delete Exp; leak for now, see RewritePropertyOrImplicitSetter() usage for more info.
   3145   return ReplacingStmt;
   3146 }
   3147 
   3148 Stmt *RewriteObjC::RewriteMessageExpr(ObjCMessageExpr *Exp) {
   3149   Stmt *ReplacingStmt = SynthMessageExpr(Exp, Exp->getLocStart(),
   3150                                          Exp->getLocEnd());
   3151 
   3152   // Now do the actual rewrite.
   3153   ReplaceStmt(Exp, ReplacingStmt);
   3154 
   3155   // delete Exp; leak for now, see RewritePropertyOrImplicitSetter() usage for more info.
   3156   return ReplacingStmt;
   3157 }
   3158 
   3159 // typedef struct objc_object Protocol;
   3160 QualType RewriteObjC::getProtocolType() {
   3161   if (!ProtocolTypeDecl) {
   3162     TypeSourceInfo *TInfo
   3163       = Context->getTrivialTypeSourceInfo(Context->getObjCIdType());
   3164     ProtocolTypeDecl = TypedefDecl::Create(*Context, TUDecl,
   3165                                            SourceLocation(), SourceLocation(),
   3166                                            &Context->Idents.get("Protocol"),
   3167                                            TInfo);
   3168   }
   3169   return Context->getTypeDeclType(ProtocolTypeDecl);
   3170 }
   3171 
   3172 /// RewriteObjCProtocolExpr - Rewrite a protocol expression into
   3173 /// a synthesized/forward data reference (to the protocol's metadata).
   3174 /// The forward references (and metadata) are generated in
   3175 /// RewriteObjC::HandleTranslationUnit().
   3176 Stmt *RewriteObjC::RewriteObjCProtocolExpr(ObjCProtocolExpr *Exp) {
   3177   std::string Name = "_OBJC_PROTOCOL_" + Exp->getProtocol()->getNameAsString();
   3178   IdentifierInfo *ID = &Context->Idents.get(Name);
   3179   VarDecl *VD = VarDecl::Create(*Context, TUDecl, SourceLocation(),
   3180                                 SourceLocation(), ID, getProtocolType(), 0,
   3181                                 SC_Extern, SC_None);
   3182   DeclRefExpr *DRE = new (Context) DeclRefExpr(VD, getProtocolType(), VK_LValue,
   3183                                                SourceLocation());
   3184   Expr *DerefExpr = new (Context) UnaryOperator(DRE, UO_AddrOf,
   3185                              Context->getPointerType(DRE->getType()),
   3186                              VK_RValue, OK_Ordinary, SourceLocation());
   3187   CastExpr *castExpr = NoTypeInfoCStyleCastExpr(Context, DerefExpr->getType(),
   3188                                                 CK_BitCast,
   3189                                                 DerefExpr);
   3190   ReplaceStmt(Exp, castExpr);
   3191   ProtocolExprDecls.insert(Exp->getProtocol());
   3192   // delete Exp; leak for now, see RewritePropertyOrImplicitSetter() usage for more info.
   3193   return castExpr;
   3194 
   3195 }
   3196 
   3197 bool RewriteObjC::BufferContainsPPDirectives(const char *startBuf,
   3198                                              const char *endBuf) {
   3199   while (startBuf < endBuf) {
   3200     if (*startBuf == '#') {
   3201       // Skip whitespace.
   3202       for (++startBuf; startBuf[0] == ' ' || startBuf[0] == '\t'; ++startBuf)
   3203         ;
   3204       if (!strncmp(startBuf, "if", strlen("if")) ||
   3205           !strncmp(startBuf, "ifdef", strlen("ifdef")) ||
   3206           !strncmp(startBuf, "ifndef", strlen("ifndef")) ||
   3207           !strncmp(startBuf, "define", strlen("define")) ||
   3208           !strncmp(startBuf, "undef", strlen("undef")) ||
   3209           !strncmp(startBuf, "else", strlen("else")) ||
   3210           !strncmp(startBuf, "elif", strlen("elif")) ||
   3211           !strncmp(startBuf, "endif", strlen("endif")) ||
   3212           !strncmp(startBuf, "pragma", strlen("pragma")) ||
   3213           !strncmp(startBuf, "include", strlen("include")) ||
   3214           !strncmp(startBuf, "import", strlen("import")) ||
   3215           !strncmp(startBuf, "include_next", strlen("include_next")))
   3216         return true;
   3217     }
   3218     startBuf++;
   3219   }
   3220   return false;
   3221 }
   3222 
   3223 /// SynthesizeObjCInternalStruct - Rewrite one internal struct corresponding to
   3224 /// an objective-c class with ivars.
   3225 void RewriteObjC::SynthesizeObjCInternalStruct(ObjCInterfaceDecl *CDecl,
   3226                                                std::string &Result) {
   3227   assert(CDecl && "Class missing in SynthesizeObjCInternalStruct");
   3228   assert(CDecl->getName() != "" &&
   3229          "Name missing in SynthesizeObjCInternalStruct");
   3230   // Do not synthesize more than once.
   3231   if (ObjCSynthesizedStructs.count(CDecl))
   3232     return;
   3233   ObjCInterfaceDecl *RCDecl = CDecl->getSuperClass();
   3234   int NumIvars = CDecl->ivar_size();
   3235   SourceLocation LocStart = CDecl->getLocStart();
   3236   SourceLocation LocEnd = CDecl->getLocEnd();
   3237 
   3238   const char *startBuf = SM->getCharacterData(LocStart);
   3239   const char *endBuf = SM->getCharacterData(LocEnd);
   3240 
   3241   // If no ivars and no root or if its root, directly or indirectly,
   3242   // have no ivars (thus not synthesized) then no need to synthesize this class.
   3243   if ((CDecl->isForwardDecl() || NumIvars == 0) &&
   3244       (!RCDecl || !ObjCSynthesizedStructs.count(RCDecl))) {
   3245     endBuf += Lexer::MeasureTokenLength(LocEnd, *SM, LangOpts);
   3246     ReplaceText(LocStart, endBuf-startBuf, Result);
   3247     return;
   3248   }
   3249 
   3250   // FIXME: This has potential of causing problem. If
   3251   // SynthesizeObjCInternalStruct is ever called recursively.
   3252   Result += "\nstruct ";
   3253   Result += CDecl->getNameAsString();
   3254   if (LangOpts.Microsoft)
   3255     Result += "_IMPL";
   3256 
   3257   if (NumIvars > 0) {
   3258     const char *cursor = strchr(startBuf, '{');
   3259     assert((cursor && endBuf)
   3260            && "SynthesizeObjCInternalStruct - malformed @interface");
   3261     // If the buffer contains preprocessor directives, we do more fine-grained
   3262     // rewrites. This is intended to fix code that looks like (which occurs in
   3263     // NSURL.h, for example):
   3264     //
   3265     // #ifdef XYZ
   3266     // @interface Foo : NSObject
   3267     // #else
   3268     // @interface FooBar : NSObject
   3269     // #endif
   3270     // {
   3271     //    int i;
   3272     // }
   3273     // @end
   3274     //
   3275     // This clause is segregated to avoid breaking the common case.
   3276     if (BufferContainsPPDirectives(startBuf, cursor)) {
   3277       SourceLocation L = RCDecl ? CDecl->getSuperClassLoc() :
   3278                                   CDecl->getClassLoc();
   3279       const char *endHeader = SM->getCharacterData(L);
   3280       endHeader += Lexer::MeasureTokenLength(L, *SM, LangOpts);
   3281 
   3282       if (CDecl->protocol_begin() != CDecl->protocol_end()) {
   3283         // advance to the end of the referenced protocols.
   3284         while (endHeader < cursor && *endHeader != '>') endHeader++;
   3285         endHeader++;
   3286       }
   3287       // rewrite the original header
   3288       ReplaceText(LocStart, endHeader-startBuf, Result);
   3289     } else {
   3290       // rewrite the original header *without* disturbing the '{'
   3291       ReplaceText(LocStart, cursor-startBuf, Result);
   3292     }
   3293     if (RCDecl && ObjCSynthesizedStructs.count(RCDecl)) {
   3294       Result = "\n    struct ";
   3295       Result += RCDecl->getNameAsString();
   3296       Result += "_IMPL ";
   3297       Result += RCDecl->getNameAsString();
   3298       Result += "_IVARS;\n";
   3299 
   3300       // insert the super class structure definition.
   3301       SourceLocation OnePastCurly =
   3302         LocStart.getFileLocWithOffset(cursor-startBuf+1);
   3303       InsertText(OnePastCurly, Result);
   3304     }
   3305     cursor++; // past '{'
   3306 
   3307     // Now comment out any visibility specifiers.
   3308     while (cursor < endBuf) {
   3309       if (*cursor == '@') {
   3310         SourceLocation atLoc = LocStart.getFileLocWithOffset(cursor-startBuf);
   3311         // Skip whitespace.
   3312         for (++cursor; cursor[0] == ' ' || cursor[0] == '\t'; ++cursor)
   3313           /*scan*/;
   3314 
   3315         // FIXME: presence of @public, etc. inside comment results in
   3316         // this transformation as well, which is still correct c-code.
   3317         if (!strncmp(cursor, "public", strlen("public")) ||
   3318             !strncmp(cursor, "private", strlen("private")) ||
   3319             !strncmp(cursor, "package", strlen("package")) ||
   3320             !strncmp(cursor, "protected", strlen("protected")))
   3321           InsertText(atLoc, "// ");
   3322       }
   3323       // FIXME: If there are cases where '<' is used in ivar declaration part
   3324       // of user code, then scan the ivar list and use needToScanForQualifiers
   3325       // for type checking.
   3326       else if (*cursor == '<') {
   3327         SourceLocation atLoc = LocStart.getFileLocWithOffset(cursor-startBuf);
   3328         InsertText(atLoc, "/* ");
   3329         cursor = strchr(cursor, '>');
   3330         cursor++;
   3331         atLoc = LocStart.getFileLocWithOffset(cursor-startBuf);
   3332         InsertText(atLoc, " */");
   3333       } else if (*cursor == '^') { // rewrite block specifier.
   3334         SourceLocation caretLoc = LocStart.getFileLocWithOffset(cursor-startBuf);
   3335         ReplaceText(caretLoc, 1, "*");
   3336       }
   3337       cursor++;
   3338     }
   3339     // Don't forget to add a ';'!!
   3340     InsertText(LocEnd.getFileLocWithOffset(1), ";");
   3341   } else { // we don't have any instance variables - insert super struct.
   3342     endBuf += Lexer::MeasureTokenLength(LocEnd, *SM, LangOpts);
   3343     Result += " {\n    struct ";
   3344     Result += RCDecl->getNameAsString();
   3345     Result += "_IMPL ";
   3346     Result += RCDecl->getNameAsString();
   3347     Result += "_IVARS;\n};\n";
   3348     ReplaceText(LocStart, endBuf-startBuf, Result);
   3349   }
   3350   // Mark this struct as having been generated.
   3351   if (!ObjCSynthesizedStructs.insert(CDecl))
   3352     assert(false && "struct already synthesize- SynthesizeObjCInternalStruct");
   3353 }
   3354 
   3355 // RewriteObjCMethodsMetaData - Rewrite methods metadata for instance or
   3356 /// class methods.
   3357 template<typename MethodIterator>
   3358 void RewriteObjC::RewriteObjCMethodsMetaData(MethodIterator MethodBegin,
   3359                                              MethodIterator MethodEnd,
   3360                                              bool IsInstanceMethod,
   3361                                              llvm::StringRef prefix,
   3362                                              llvm::StringRef ClassName,
   3363                                              std::string &Result) {
   3364   if (MethodBegin == MethodEnd) return;
   3365 
   3366   if (!objc_impl_method) {
   3367     /* struct _objc_method {
   3368        SEL _cmd;
   3369        char *method_types;
   3370        void *_imp;
   3371        }
   3372      */
   3373     Result += "\nstruct _objc_method {\n";
   3374     Result += "\tSEL _cmd;\n";
   3375     Result += "\tchar *method_types;\n";
   3376     Result += "\tvoid *_imp;\n";
   3377     Result += "};\n";
   3378 
   3379     objc_impl_method = true;
   3380   }
   3381 
   3382   // Build _objc_method_list for class's methods if needed
   3383 
   3384   /* struct  {
   3385    struct _objc_method_list *next_method;
   3386    int method_count;
   3387    struct _objc_method method_list[];
   3388    }
   3389    */
   3390   unsigned NumMethods = std::distance(MethodBegin, MethodEnd);
   3391   Result += "\nstatic struct {\n";
   3392   Result += "\tstruct _objc_method_list *next_method;\n";
   3393   Result += "\tint method_count;\n";
   3394   Result += "\tstruct _objc_method method_list[";
   3395   Result += utostr(NumMethods);
   3396   Result += "];\n} _OBJC_";
   3397   Result += prefix;
   3398   Result += IsInstanceMethod ? "INSTANCE" : "CLASS";
   3399   Result += "_METHODS_";
   3400   Result += ClassName;
   3401   Result += " __attribute__ ((used, section (\"__OBJC, __";
   3402   Result += IsInstanceMethod ? "inst" : "cls";
   3403   Result += "_meth\")))= ";
   3404   Result += "{\n\t0, " + utostr(NumMethods) + "\n";
   3405 
   3406   Result += "\t,{{(SEL)\"";
   3407   Result += (*MethodBegin)->getSelector().getAsString().c_str();
   3408   std::string MethodTypeString;
   3409   Context->getObjCEncodingForMethodDecl(*MethodBegin, MethodTypeString);
   3410   Result += "\", \"";
   3411   Result += MethodTypeString;
   3412   Result += "\", (void *)";
   3413   Result += MethodInternalNames[*MethodBegin];
   3414   Result += "}\n";
   3415   for (++MethodBegin; MethodBegin != MethodEnd; ++MethodBegin) {
   3416     Result += "\t  ,{(SEL)\"";
   3417     Result += (*MethodBegin)->getSelector().getAsString().c_str();
   3418     std::string MethodTypeString;
   3419     Context->getObjCEncodingForMethodDecl(*MethodBegin, MethodTypeString);
   3420     Result += "\", \"";
   3421     Result += MethodTypeString;
   3422     Result += "\", (void *)";
   3423     Result += MethodInternalNames[*MethodBegin];
   3424     Result += "}\n";
   3425   }
   3426   Result += "\t }\n};\n";
   3427 }
   3428 
   3429 /// RewriteObjCProtocolMetaData - Rewrite protocols meta-data.
   3430 void RewriteObjC::
   3431 RewriteObjCProtocolMetaData(ObjCProtocolDecl *PDecl, llvm::StringRef prefix,
   3432                             llvm::StringRef ClassName, std::string &Result) {
   3433   static bool objc_protocol_methods = false;
   3434 
   3435   // Output struct protocol_methods holder of method selector and type.
   3436   if (!objc_protocol_methods && !PDecl->isForwardDecl()) {
   3437     /* struct protocol_methods {
   3438      SEL _cmd;
   3439      char *method_types;
   3440      }
   3441      */
   3442     Result += "\nstruct _protocol_methods {\n";
   3443     Result += "\tstruct objc_selector *_cmd;\n";
   3444     Result += "\tchar *method_types;\n";
   3445     Result += "};\n";
   3446 
   3447     objc_protocol_methods = true;
   3448   }
   3449   // Do not synthesize the protocol more than once.
   3450   if (ObjCSynthesizedProtocols.count(PDecl))
   3451     return;
   3452 
   3453     if (PDecl->instmeth_begin() != PDecl->instmeth_end()) {
   3454       unsigned NumMethods = std::distance(PDecl->instmeth_begin(),
   3455                                           PDecl->instmeth_end());
   3456     /* struct _objc_protocol_method_list {
   3457      int protocol_method_count;
   3458      struct protocol_methods protocols[];
   3459      }
   3460      */
   3461     Result += "\nstatic struct {\n";
   3462     Result += "\tint protocol_method_count;\n";
   3463     Result += "\tstruct _protocol_methods protocol_methods[";
   3464     Result += utostr(NumMethods);
   3465     Result += "];\n} _OBJC_PROTOCOL_INSTANCE_METHODS_";
   3466     Result += PDecl->getNameAsString();
   3467     Result += " __attribute__ ((used, section (\"__OBJC, __cat_inst_meth\")))= "
   3468       "{\n\t" + utostr(NumMethods) + "\n";
   3469 
   3470     // Output instance methods declared in this protocol.
   3471     for (ObjCProtocolDecl::instmeth_iterator
   3472            I = PDecl->instmeth_begin(), E = PDecl->instmeth_end();
   3473          I != E; ++I) {
   3474       if (I == PDecl->instmeth_begin())
   3475         Result += "\t  ,{{(struct objc_selector *)\"";
   3476       else
   3477         Result += "\t  ,{(struct objc_selector *)\"";
   3478       Result += (*I)->getSelector().getAsString();
   3479       std::string MethodTypeString;
   3480       Context->getObjCEncodingForMethodDecl((*I), MethodTypeString);
   3481       Result += "\", \"";
   3482       Result += MethodTypeString;
   3483       Result += "\"}\n";
   3484     }
   3485     Result += "\t }\n};\n";
   3486   }
   3487 
   3488   // Output class methods declared in this protocol.
   3489   unsigned NumMethods = std::distance(PDecl->classmeth_begin(),
   3490                                       PDecl->classmeth_end());
   3491   if (NumMethods > 0) {
   3492     /* struct _objc_protocol_method_list {
   3493      int protocol_method_count;
   3494      struct protocol_methods protocols[];
   3495      }
   3496      */
   3497     Result += "\nstatic struct {\n";
   3498     Result += "\tint protocol_method_count;\n";
   3499     Result += "\tstruct _protocol_methods protocol_methods[";
   3500     Result += utostr(NumMethods);
   3501     Result += "];\n} _OBJC_PROTOCOL_CLASS_METHODS_";
   3502     Result += PDecl->getNameAsString();
   3503     Result += " __attribute__ ((used, section (\"__OBJC, __cat_cls_meth\")))= "
   3504            "{\n\t";
   3505     Result += utostr(NumMethods);
   3506     Result += "\n";
   3507 
   3508     // Output instance methods declared in this protocol.
   3509     for (ObjCProtocolDecl::classmeth_iterator
   3510            I = PDecl->classmeth_begin(), E = PDecl->classmeth_end();
   3511          I != E; ++I) {
   3512       if (I == PDecl->classmeth_begin())
   3513         Result += "\t  ,{{(struct objc_selector *)\"";
   3514       else
   3515         Result += "\t  ,{(struct objc_selector *)\"";
   3516       Result += (*I)->getSelector().getAsString();
   3517       std::string MethodTypeString;
   3518       Context->getObjCEncodingForMethodDecl((*I), MethodTypeString);
   3519       Result += "\", \"";
   3520       Result += MethodTypeString;
   3521       Result += "\"}\n";
   3522     }
   3523     Result += "\t }\n};\n";
   3524   }
   3525 
   3526   // Output:
   3527   /* struct _objc_protocol {
   3528    // Objective-C 1.0 extensions
   3529    struct _objc_protocol_extension *isa;
   3530    char *protocol_name;
   3531    struct _objc_protocol **protocol_list;
   3532    struct _objc_protocol_method_list *instance_methods;
   3533    struct _objc_protocol_method_list *class_methods;
   3534    };
   3535    */
   3536   static bool objc_protocol = false;
   3537   if (!objc_protocol) {
   3538     Result += "\nstruct _objc_protocol {\n";
   3539     Result += "\tstruct _objc_protocol_extension *isa;\n";
   3540     Result += "\tchar *protocol_name;\n";
   3541     Result += "\tstruct _objc_protocol **protocol_list;\n";
   3542     Result += "\tstruct _objc_protocol_method_list *instance_methods;\n";
   3543     Result += "\tstruct _objc_protocol_method_list *class_methods;\n";
   3544     Result += "};\n";
   3545 
   3546     objc_protocol = true;
   3547   }
   3548 
   3549   Result += "\nstatic struct _objc_protocol _OBJC_PROTOCOL_";
   3550   Result += PDecl->getNameAsString();
   3551   Result += " __attribute__ ((used, section (\"__OBJC, __protocol\")))= "
   3552     "{\n\t0, \"";
   3553   Result += PDecl->getNameAsString();
   3554   Result += "\", 0, ";
   3555   if (PDecl->instmeth_begin() != PDecl->instmeth_end()) {
   3556     Result += "(struct _objc_protocol_method_list *)&_OBJC_PROTOCOL_INSTANCE_METHODS_";
   3557     Result += PDecl->getNameAsString();
   3558     Result += ", ";
   3559   }
   3560   else
   3561     Result += "0, ";
   3562   if (PDecl->classmeth_begin() != PDecl->classmeth_end()) {
   3563     Result += "(struct _objc_protocol_method_list *)&_OBJC_PROTOCOL_CLASS_METHODS_";
   3564     Result += PDecl->getNameAsString();
   3565     Result += "\n";
   3566   }
   3567   else
   3568     Result += "0\n";
   3569   Result += "};\n";
   3570 
   3571   // Mark this protocol as having been generated.
   3572   if (!ObjCSynthesizedProtocols.insert(PDecl))
   3573     assert(false && "protocol already synthesized");
   3574 
   3575 }
   3576 
   3577 void RewriteObjC::
   3578 RewriteObjCProtocolListMetaData(const ObjCList<ObjCProtocolDecl> &Protocols,
   3579                                 llvm::StringRef prefix, llvm::StringRef ClassName,
   3580                                 std::string &Result) {
   3581   if (Protocols.empty()) return;
   3582 
   3583   for (unsigned i = 0; i != Protocols.size(); i++)
   3584     RewriteObjCProtocolMetaData(Protocols[i], prefix, ClassName, Result);
   3585 
   3586   // Output the top lovel protocol meta-data for the class.
   3587   /* struct _objc_protocol_list {
   3588    struct _objc_protocol_list *next;
   3589    int    protocol_count;
   3590    struct _objc_protocol *class_protocols[];
   3591    }
   3592    */
   3593   Result += "\nstatic struct {\n";
   3594   Result += "\tstruct _objc_protocol_list *next;\n";
   3595   Result += "\tint    protocol_count;\n";
   3596   Result += "\tstruct _objc_protocol *class_protocols[";
   3597   Result += utostr(Protocols.size());
   3598   Result += "];\n} _OBJC_";
   3599   Result += prefix;
   3600   Result += "_PROTOCOLS_";
   3601   Result += ClassName;
   3602   Result += " __attribute__ ((used, section (\"__OBJC, __cat_cls_meth\")))= "
   3603     "{\n\t0, ";
   3604   Result += utostr(Protocols.size());
   3605   Result += "\n";
   3606 
   3607   Result += "\t,{&_OBJC_PROTOCOL_";
   3608   Result += Protocols[0]->getNameAsString();
   3609   Result += " \n";
   3610 
   3611   for (unsigned i = 1; i != Protocols.size(); i++) {
   3612     Result += "\t ,&_OBJC_PROTOCOL_";
   3613     Result += Protocols[i]->getNameAsString();
   3614     Result += "\n";
   3615   }
   3616   Result += "\t }\n};\n";
   3617 }
   3618 
   3619 
   3620 /// RewriteObjCCategoryImplDecl - Rewrite metadata for each category
   3621 /// implementation.
   3622 void RewriteObjC::RewriteObjCCategoryImplDecl(ObjCCategoryImplDecl *IDecl,
   3623                                               std::string &Result) {
   3624   ObjCInterfaceDecl *ClassDecl = IDecl->getClassInterface();
   3625   // Find category declaration for this implementation.
   3626   ObjCCategoryDecl *CDecl;
   3627   for (CDecl = ClassDecl->getCategoryList(); CDecl;
   3628        CDecl = CDecl->getNextClassCategory())
   3629     if (CDecl->getIdentifier() == IDecl->getIdentifier())
   3630       break;
   3631 
   3632   std::string FullCategoryName = ClassDecl->getNameAsString();
   3633   FullCategoryName += '_';
   3634   FullCategoryName += IDecl->getNameAsString();
   3635 
   3636   // Build _objc_method_list for class's instance methods if needed
   3637   llvm::SmallVector<ObjCMethodDecl *, 32>
   3638     InstanceMethods(IDecl->instmeth_begin(), IDecl->instmeth_end());
   3639 
   3640   // If any of our property implementations have associated getters or
   3641   // setters, produce metadata for them as well.
   3642   for (ObjCImplDecl::propimpl_iterator Prop = IDecl->propimpl_begin(),
   3643          PropEnd = IDecl->propimpl_end();
   3644        Prop != PropEnd; ++Prop) {
   3645     if ((*Prop)->getPropertyImplementation() == ObjCPropertyImplDecl::Dynamic)
   3646       continue;
   3647     if (!(*Prop)->getPropertyIvarDecl())
   3648       continue;
   3649     ObjCPropertyDecl *PD = (*Prop)->getPropertyDecl();
   3650     if (!PD)
   3651       continue;
   3652     if (ObjCMethodDecl *Getter = PD->getGetterMethodDecl())
   3653       InstanceMethods.push_back(Getter);
   3654     if (PD->isReadOnly())
   3655       continue;
   3656     if (ObjCMethodDecl *Setter = PD->getSetterMethodDecl())
   3657       InstanceMethods.push_back(Setter);
   3658   }
   3659   RewriteObjCMethodsMetaData(InstanceMethods.begin(), InstanceMethods.end(),
   3660                              true, "CATEGORY_", FullCategoryName.c_str(),
   3661                              Result);
   3662 
   3663   // Build _objc_method_list for class's class methods if needed
   3664   RewriteObjCMethodsMetaData(IDecl->classmeth_begin(), IDecl->classmeth_end(),
   3665                              false, "CATEGORY_", FullCategoryName.c_str(),
   3666                              Result);
   3667 
   3668   // Protocols referenced in class declaration?
   3669   // Null CDecl is case of a category implementation with no category interface
   3670   if (CDecl)
   3671     RewriteObjCProtocolListMetaData(CDecl->getReferencedProtocols(), "CATEGORY",
   3672                                     FullCategoryName, Result);
   3673   /* struct _objc_category {
   3674    char *category_name;
   3675    char *class_name;
   3676    struct _objc_method_list *instance_methods;
   3677    struct _objc_method_list *class_methods;
   3678    struct _objc_protocol_list *protocols;
   3679    // Objective-C 1.0 extensions
   3680    uint32_t size;     // sizeof (struct _objc_category)
   3681    struct _objc_property_list *instance_properties;  // category's own
   3682                                                      // @property decl.
   3683    };
   3684    */
   3685 
   3686   static bool objc_category = false;
   3687   if (!objc_category) {
   3688     Result += "\nstruct _objc_category {\n";
   3689     Result += "\tchar *category_name;\n";
   3690     Result += "\tchar *class_name;\n";
   3691     Result += "\tstruct _objc_method_list *instance_methods;\n";
   3692     Result += "\tstruct _objc_method_list *class_methods;\n";
   3693     Result += "\tstruct _objc_protocol_list *protocols;\n";
   3694     Result += "\tunsigned int size;\n";
   3695     Result += "\tstruct _objc_property_list *instance_properties;\n";
   3696     Result += "};\n";
   3697     objc_category = true;
   3698   }
   3699   Result += "\nstatic struct _objc_category _OBJC_CATEGORY_";
   3700   Result += FullCategoryName;
   3701   Result += " __attribute__ ((used, section (\"__OBJC, __category\")))= {\n\t\"";
   3702   Result += IDecl->getNameAsString();
   3703   Result += "\"\n\t, \"";
   3704   Result += ClassDecl->getNameAsString();
   3705   Result += "\"\n";
   3706 
   3707   if (IDecl->instmeth_begin() != IDecl->instmeth_end()) {
   3708     Result += "\t, (struct _objc_method_list *)"
   3709            "&_OBJC_CATEGORY_INSTANCE_METHODS_";
   3710     Result += FullCategoryName;
   3711     Result += "\n";
   3712   }
   3713   else
   3714     Result += "\t, 0\n";
   3715   if (IDecl->classmeth_begin() != IDecl->classmeth_end()) {
   3716     Result += "\t, (struct _objc_method_list *)"
   3717            "&_OBJC_CATEGORY_CLASS_METHODS_";
   3718     Result += FullCategoryName;
   3719     Result += "\n";
   3720   }
   3721   else
   3722     Result += "\t, 0\n";
   3723 
   3724   if (CDecl && CDecl->protocol_begin() != CDecl->protocol_end()) {
   3725     Result += "\t, (struct _objc_protocol_list *)&_OBJC_CATEGORY_PROTOCOLS_";
   3726     Result += FullCategoryName;
   3727     Result += "\n";
   3728   }
   3729   else
   3730     Result += "\t, 0\n";
   3731   Result += "\t, sizeof(struct _objc_category), 0\n};\n";
   3732 }
   3733 
   3734 /// SynthesizeIvarOffsetComputation - This rutine synthesizes computation of
   3735 /// ivar offset.
   3736 void RewriteObjC::SynthesizeIvarOffsetComputation(ObjCIvarDecl *ivar,
   3737                                                   std::string &Result) {
   3738   if (ivar->isBitField()) {
   3739     // FIXME: The hack below doesn't work for bitfields. For now, we simply
   3740     // place all bitfields at offset 0.
   3741     Result += "0";
   3742   } else {
   3743     Result += "__OFFSETOFIVAR__(struct ";
   3744     Result += ivar->getContainingInterface()->getNameAsString();
   3745     if (LangOpts.Microsoft)
   3746       Result += "_IMPL";
   3747     Result += ", ";
   3748     Result += ivar->getNameAsString();
   3749     Result += ")";
   3750   }
   3751 }
   3752 
   3753 //===----------------------------------------------------------------------===//
   3754 // Meta Data Emission
   3755 //===----------------------------------------------------------------------===//
   3756 
   3757 void RewriteObjC::RewriteObjCClassMetaData(ObjCImplementationDecl *IDecl,
   3758                                            std::string &Result) {
   3759   ObjCInterfaceDecl *CDecl = IDecl->getClassInterface();
   3760 
   3761   // Explicitly declared @interface's are already synthesized.
   3762   if (CDecl->isImplicitInterfaceDecl()) {
   3763     // FIXME: Implementation of a class with no @interface (legacy) doese not
   3764     // produce correct synthesis as yet.
   3765     SynthesizeObjCInternalStruct(CDecl, Result);
   3766   }
   3767 
   3768   // Build _objc_ivar_list metadata for classes ivars if needed
   3769   unsigned NumIvars = !IDecl->ivar_empty()
   3770                       ? IDecl->ivar_size()
   3771                       : (CDecl ? CDecl->ivar_size() : 0);
   3772   if (NumIvars > 0) {
   3773     static bool objc_ivar = false;
   3774     if (!objc_ivar) {
   3775       /* struct _objc_ivar {
   3776           char *ivar_name;
   3777           char *ivar_type;
   3778           int ivar_offset;
   3779         };
   3780        */
   3781       Result += "\nstruct _objc_ivar {\n";
   3782       Result += "\tchar *ivar_name;\n";
   3783       Result += "\tchar *ivar_type;\n";
   3784       Result += "\tint ivar_offset;\n";
   3785       Result += "};\n";
   3786 
   3787       objc_ivar = true;
   3788     }
   3789 
   3790     /* struct {
   3791        int ivar_count;
   3792        struct _objc_ivar ivar_list[nIvars];
   3793        };
   3794      */
   3795     Result += "\nstatic struct {\n";
   3796     Result += "\tint ivar_count;\n";
   3797     Result += "\tstruct _objc_ivar ivar_list[";
   3798     Result += utostr(NumIvars);
   3799     Result += "];\n} _OBJC_INSTANCE_VARIABLES_";
   3800     Result += IDecl->getNameAsString();
   3801     Result += " __attribute__ ((used, section (\"__OBJC, __instance_vars\")))= "
   3802       "{\n\t";
   3803     Result += utostr(NumIvars);
   3804     Result += "\n";
   3805 
   3806     ObjCInterfaceDecl::ivar_iterator IVI, IVE;
   3807     llvm::SmallVector<ObjCIvarDecl *, 8> IVars;
   3808     if (!IDecl->ivar_empty()) {
   3809       for (ObjCInterfaceDecl::ivar_iterator
   3810              IV = IDecl->ivar_begin(), IVEnd = IDecl->ivar_end();
   3811            IV != IVEnd; ++IV)
   3812         IVars.push_back(*IV);
   3813       IVI = IDecl->ivar_begin();
   3814       IVE = IDecl->ivar_end();
   3815     } else {
   3816       IVI = CDecl->ivar_begin();
   3817       IVE = CDecl->ivar_end();
   3818     }
   3819     Result += "\t,{{\"";
   3820     Result += (*IVI)->getNameAsString();
   3821     Result += "\", \"";
   3822     std::string TmpString, StrEncoding;
   3823     Context->getObjCEncodingForType((*IVI)->getType(), TmpString, *IVI);
   3824     QuoteDoublequotes(TmpString, StrEncoding);
   3825     Result += StrEncoding;
   3826     Result += "\", ";
   3827     SynthesizeIvarOffsetComputation(*IVI, Result);
   3828     Result += "}\n";
   3829     for (++IVI; IVI != IVE; ++IVI) {
   3830       Result += "\t  ,{\"";
   3831       Result += (*IVI)->getNameAsString();
   3832       Result += "\", \"";
   3833       std::string TmpString, StrEncoding;
   3834       Context->getObjCEncodingForType((*IVI)->getType(), TmpString, *IVI);
   3835       QuoteDoublequotes(TmpString, StrEncoding);
   3836       Result += StrEncoding;
   3837       Result += "\", ";
   3838       SynthesizeIvarOffsetComputation((*IVI), Result);
   3839       Result += "}\n";
   3840     }
   3841 
   3842     Result += "\t }\n};\n";
   3843   }
   3844 
   3845   // Build _objc_method_list for class's instance methods if needed
   3846   llvm::SmallVector<ObjCMethodDecl *, 32>
   3847     InstanceMethods(IDecl->instmeth_begin(), IDecl->instmeth_end());
   3848 
   3849   // If any of our property implementations have associated getters or
   3850   // setters, produce metadata for them as well.
   3851   for (ObjCImplDecl::propimpl_iterator Prop = IDecl->propimpl_begin(),
   3852          PropEnd = IDecl->propimpl_end();
   3853        Prop != PropEnd; ++Prop) {
   3854     if ((*Prop)->getPropertyImplementation() == ObjCPropertyImplDecl::Dynamic)
   3855       continue;
   3856     if (!(*Prop)->getPropertyIvarDecl())
   3857       continue;
   3858     ObjCPropertyDecl *PD = (*Prop)->getPropertyDecl();
   3859     if (!PD)
   3860       continue;
   3861     if (ObjCMethodDecl *Getter = PD->getGetterMethodDecl())
   3862       if (!Getter->isDefined())
   3863         InstanceMethods.push_back(Getter);
   3864     if (PD->isReadOnly())
   3865       continue;
   3866     if (ObjCMethodDecl *Setter = PD->getSetterMethodDecl())
   3867       if (!Setter->isDefined())
   3868         InstanceMethods.push_back(Setter);
   3869   }
   3870   RewriteObjCMethodsMetaData(InstanceMethods.begin(), InstanceMethods.end(),
   3871                              true, "", IDecl->getName(), Result);
   3872 
   3873   // Build _objc_method_list for class's class methods if needed
   3874   RewriteObjCMethodsMetaData(IDecl->classmeth_begin(), IDecl->classmeth_end(),
   3875                              false, "", IDecl->getName(), Result);
   3876 
   3877   // Protocols referenced in class declaration?
   3878   RewriteObjCProtocolListMetaData(CDecl->getReferencedProtocols(),
   3879                                   "CLASS", CDecl->getName(), Result);
   3880 
   3881   // Declaration of class/meta-class metadata
   3882   /* struct _objc_class {
   3883    struct _objc_class *isa; // or const char *root_class_name when metadata
   3884    const char *super_class_name;
   3885    char *name;
   3886    long version;
   3887    long info;
   3888    long instance_size;
   3889    struct _objc_ivar_list *ivars;
   3890    struct _objc_method_list *methods;
   3891    struct objc_cache *cache;
   3892    struct objc_protocol_list *protocols;
   3893    const char *ivar_layout;
   3894    struct _objc_class_ext  *ext;
   3895    };
   3896   */
   3897   static bool objc_class = false;
   3898   if (!objc_class) {
   3899     Result += "\nstruct _objc_class {\n";
   3900     Result += "\tstruct _objc_class *isa;\n";
   3901     Result += "\tconst char *super_class_name;\n";
   3902     Result += "\tchar *name;\n";
   3903     Result += "\tlong version;\n";
   3904     Result += "\tlong info;\n";
   3905     Result += "\tlong instance_size;\n";
   3906     Result += "\tstruct _objc_ivar_list *ivars;\n";
   3907     Result += "\tstruct _objc_method_list *methods;\n";
   3908     Result += "\tstruct objc_cache *cache;\n";
   3909     Result += "\tstruct _objc_protocol_list *protocols;\n";
   3910     Result += "\tconst char *ivar_layout;\n";
   3911     Result += "\tstruct _objc_class_ext  *ext;\n";
   3912     Result += "};\n";
   3913     objc_class = true;
   3914   }
   3915 
   3916   // Meta-class metadata generation.
   3917   ObjCInterfaceDecl *RootClass = 0;
   3918   ObjCInterfaceDecl *SuperClass = CDecl->getSuperClass();
   3919   while (SuperClass) {
   3920     RootClass = SuperClass;
   3921     SuperClass = SuperClass->getSuperClass();
   3922   }
   3923   SuperClass = CDecl->getSuperClass();
   3924 
   3925   Result += "\nstatic struct _objc_class _OBJC_METACLASS_";
   3926   Result += CDecl->getNameAsString();
   3927   Result += " __attribute__ ((used, section (\"__OBJC, __meta_class\")))= "
   3928   "{\n\t(struct _objc_class *)\"";
   3929   Result += (RootClass ? RootClass->getNameAsString() : CDecl->getNameAsString());
   3930   Result += "\"";
   3931 
   3932   if (SuperClass) {
   3933     Result += ", \"";
   3934     Result += SuperClass->getNameAsString();
   3935     Result += "\", \"";
   3936     Result += CDecl->getNameAsString();
   3937     Result += "\"";
   3938   }
   3939   else {
   3940     Result += ", 0, \"";
   3941     Result += CDecl->getNameAsString();
   3942     Result += "\"";
   3943   }
   3944   // Set 'ivars' field for root class to 0. ObjC1 runtime does not use it.
   3945   // 'info' field is initialized to CLS_META(2) for metaclass
   3946   Result += ", 0,2, sizeof(struct _objc_class), 0";
   3947   if (IDecl->classmeth_begin() != IDecl->classmeth_end()) {
   3948     Result += "\n\t, (struct _objc_method_list *)&_OBJC_CLASS_METHODS_";
   3949     Result += IDecl->getNameAsString();
   3950     Result += "\n";
   3951   }
   3952   else
   3953     Result += ", 0\n";
   3954   if (CDecl->protocol_begin() != CDecl->protocol_end()) {
   3955     Result += "\t,0, (struct _objc_protocol_list *)&_OBJC_CLASS_PROTOCOLS_";
   3956     Result += CDecl->getNameAsString();
   3957     Result += ",0,0\n";
   3958   }
   3959   else
   3960     Result += "\t,0,0,0,0\n";
   3961   Result += "};\n";
   3962 
   3963   // class metadata generation.
   3964   Result += "\nstatic struct _objc_class _OBJC_CLASS_";
   3965   Result += CDecl->getNameAsString();
   3966   Result += " __attribute__ ((used, section (\"__OBJC, __class\")))= "
   3967             "{\n\t&_OBJC_METACLASS_";
   3968   Result += CDecl->getNameAsString();
   3969   if (SuperClass) {
   3970     Result += ", \"";
   3971     Result += SuperClass->getNameAsString();
   3972     Result += "\", \"";
   3973     Result += CDecl->getNameAsString();
   3974     Result += "\"";
   3975   }
   3976   else {
   3977     Result += ", 0, \"";
   3978     Result += CDecl->getNameAsString();
   3979     Result += "\"";
   3980   }
   3981   // 'info' field is initialized to CLS_CLASS(1) for class
   3982   Result += ", 0,1";
   3983   if (!ObjCSynthesizedStructs.count(CDecl))
   3984     Result += ",0";
   3985   else {
   3986     // class has size. Must synthesize its size.
   3987     Result += ",sizeof(struct ";
   3988     Result += CDecl->getNameAsString();
   3989     if (LangOpts.Microsoft)
   3990       Result += "_IMPL";
   3991     Result += ")";
   3992   }
   3993   if (NumIvars > 0) {
   3994     Result += ", (struct _objc_ivar_list *)&_OBJC_INSTANCE_VARIABLES_";
   3995     Result += CDecl->getNameAsString();
   3996     Result += "\n\t";
   3997   }
   3998   else
   3999     Result += ",0";
   4000   if (IDecl->instmeth_begin() != IDecl->instmeth_end()) {
   4001     Result += ", (struct _objc_method_list *)&_OBJC_INSTANCE_METHODS_";
   4002     Result += CDecl->getNameAsString();
   4003     Result += ", 0\n\t";
   4004   }
   4005   else
   4006     Result += ",0,0";
   4007   if (CDecl->protocol_begin() != CDecl->protocol_end()) {
   4008     Result += ", (struct _objc_protocol_list*)&_OBJC_CLASS_PROTOCOLS_";
   4009     Result += CDecl->getNameAsString();
   4010     Result += ", 0,0\n";
   4011   }
   4012   else
   4013     Result += ",0,0,0\n";
   4014   Result += "};\n";
   4015 }
   4016 
   4017 /// RewriteImplementations - This routine rewrites all method implementations
   4018 /// and emits meta-data.
   4019 
   4020 void RewriteObjC::RewriteImplementations() {
   4021   int ClsDefCount = ClassImplementation.size();
   4022   int CatDefCount = CategoryImplementation.size();
   4023 
   4024   // Rewrite implemented methods
   4025   for (int i = 0; i < ClsDefCount; i++)
   4026     RewriteImplementationDecl(ClassImplementation[i]);
   4027 
   4028   for (int i = 0; i < CatDefCount; i++)
   4029     RewriteImplementationDecl(CategoryImplementation[i]);
   4030 }
   4031 
   4032 void RewriteObjC::SynthesizeMetaDataIntoBuffer(std::string &Result) {
   4033   int ClsDefCount = ClassImplementation.size();
   4034   int CatDefCount = CategoryImplementation.size();
   4035 
   4036   // For each implemented class, write out all its meta data.
   4037   for (int i = 0; i < ClsDefCount; i++)
   4038     RewriteObjCClassMetaData(ClassImplementation[i], Result);
   4039 
   4040   // For each implemented category, write out all its meta data.
   4041   for (int i = 0; i < CatDefCount; i++)
   4042     RewriteObjCCategoryImplDecl(CategoryImplementation[i], Result);
   4043 
   4044   // Write objc_symtab metadata
   4045   /*
   4046    struct _objc_symtab
   4047    {
   4048    long sel_ref_cnt;
   4049    SEL *refs;
   4050    short cls_def_cnt;
   4051    short cat_def_cnt;
   4052    void *defs[cls_def_cnt + cat_def_cnt];
   4053    };
   4054    */
   4055 
   4056   Result += "\nstruct _objc_symtab {\n";
   4057   Result += "\tlong sel_ref_cnt;\n";
   4058   Result += "\tSEL *refs;\n";
   4059   Result += "\tshort cls_def_cnt;\n";
   4060   Result += "\tshort cat_def_cnt;\n";
   4061   Result += "\tvoid *defs[" + utostr(ClsDefCount + CatDefCount)+ "];\n";
   4062   Result += "};\n\n";
   4063 
   4064   Result += "static struct _objc_symtab "
   4065          "_OBJC_SYMBOLS __attribute__((used, section (\"__OBJC, __symbols\")))= {\n";
   4066   Result += "\t0, 0, " + utostr(ClsDefCount)
   4067             + ", " + utostr(CatDefCount) + "\n";
   4068   for (int i = 0; i < ClsDefCount; i++) {
   4069     Result += "\t,&_OBJC_CLASS_";
   4070     Result += ClassImplementation[i]->getNameAsString();
   4071     Result += "\n";
   4072   }
   4073 
   4074   for (int i = 0; i < CatDefCount; i++) {
   4075     Result += "\t,&_OBJC_CATEGORY_";
   4076     Result += CategoryImplementation[i]->getClassInterface()->getNameAsString();
   4077     Result += "_";
   4078     Result += CategoryImplementation[i]->getNameAsString();
   4079     Result += "\n";
   4080   }
   4081 
   4082   Result += "};\n\n";
   4083 
   4084   // Write objc_module metadata
   4085 
   4086   /*
   4087    struct _objc_module {
   4088     long version;
   4089     long size;
   4090     const char *name;
   4091     struct _objc_symtab *symtab;
   4092    }
   4093   */
   4094 
   4095   Result += "\nstruct _objc_module {\n";
   4096   Result += "\tlong version;\n";
   4097   Result += "\tlong size;\n";
   4098   Result += "\tconst char *name;\n";
   4099   Result += "\tstruct _objc_symtab *symtab;\n";
   4100   Result += "};\n\n";
   4101   Result += "static struct _objc_module "
   4102     "_OBJC_MODULES __attribute__ ((used, section (\"__OBJC, __module_info\")))= {\n";
   4103   Result += "\t" + utostr(OBJC_ABI_VERSION) +
   4104   ", sizeof(struct _objc_module), \"\", &_OBJC_SYMBOLS\n";
   4105   Result += "};\n\n";
   4106 
   4107   if (LangOpts.Microsoft) {
   4108     if (ProtocolExprDecls.size()) {
   4109       Result += "#pragma section(\".objc_protocol$B\",long,read,write)\n";
   4110       Result += "#pragma data_seg(push, \".objc_protocol$B\")\n";
   4111       for (llvm::SmallPtrSet<ObjCProtocolDecl *,8>::iterator I = ProtocolExprDecls.begin(),
   4112            E = ProtocolExprDecls.end(); I != E; ++I) {
   4113         Result += "static struct _objc_protocol *_POINTER_OBJC_PROTOCOL_";
   4114         Result += (*I)->getNameAsString();
   4115         Result += " = &_OBJC_PROTOCOL_";
   4116         Result += (*I)->getNameAsString();
   4117         Result += ";\n";
   4118       }
   4119       Result += "#pragma data_seg(pop)\n\n";
   4120     }
   4121     Result += "#pragma section(\".objc_module_info$B\",long,read,write)\n";
   4122     Result += "#pragma data_seg(push, \".objc_module_info$B\")\n";
   4123     Result += "static struct _objc_module *_POINTER_OBJC_MODULES = ";
   4124     Result += "&_OBJC_MODULES;\n";
   4125     Result += "#pragma data_seg(pop)\n\n";
   4126   }
   4127 }
   4128 
   4129 void RewriteObjC::RewriteByRefString(std::string &ResultStr,
   4130                                      const std::string &Name,
   4131                                      ValueDecl *VD, bool def) {
   4132   assert(BlockByRefDeclNo.count(VD) &&
   4133          "RewriteByRefString: ByRef decl missing");
   4134   if (def)
   4135     ResultStr += "struct ";
   4136   ResultStr += "__Block_byref_" + Name +
   4137     "_" + utostr(BlockByRefDeclNo[VD]) ;
   4138 }
   4139 
   4140 static bool HasLocalVariableExternalStorage(ValueDecl *VD) {
   4141   if (VarDecl *Var = dyn_cast<VarDecl>(VD))
   4142     return (Var->isFunctionOrMethodVarDecl() && !Var->hasLocalStorage());
   4143   return false;
   4144 }
   4145 
   4146 std::string RewriteObjC::SynthesizeBlockFunc(BlockExpr *CE, int i,
   4147                                                    llvm::StringRef funcName,
   4148                                                    std::string Tag) {
   4149   const FunctionType *AFT = CE->getFunctionType();
   4150   QualType RT = AFT->getResultType();
   4151   std::string StructRef = "struct " + Tag;
   4152   std::string S = "static " + RT.getAsString(Context->PrintingPolicy) + " __" +
   4153                   funcName.str() + "_" + "block_func_" + utostr(i);
   4154 
   4155   BlockDecl *BD = CE->getBlockDecl();
   4156 
   4157   if (isa<FunctionNoProtoType>(AFT)) {
   4158     // No user-supplied arguments. Still need to pass in a pointer to the
   4159     // block (to reference imported block decl refs).
   4160     S += "(" + StructRef + " *__cself)";
   4161   } else if (BD->param_empty()) {
   4162     S += "(" + StructRef + " *__cself)";
   4163   } else {
   4164     const FunctionProtoType *FT = cast<FunctionProtoType>(AFT);
   4165     assert(FT && "SynthesizeBlockFunc: No function proto");
   4166     S += '(';
   4167     // first add the implicit argument.
   4168     S += StructRef + " *__cself, ";
   4169     std::string ParamStr;
   4170     for (BlockDecl::param_iterator AI = BD->param_begin(),
   4171          E = BD->param_end(); AI != E; ++AI) {
   4172       if (AI != BD->param_begin()) S += ", ";
   4173       ParamStr = (*AI)->getNameAsString();
   4174       QualType QT = (*AI)->getType();
   4175       if (convertBlockPointerToFunctionPointer(QT))
   4176         QT.getAsStringInternal(ParamStr, Context->PrintingPolicy);
   4177       else
   4178         QT.getAsStringInternal(ParamStr, Context->PrintingPolicy);
   4179       S += ParamStr;
   4180     }
   4181     if (FT->isVariadic()) {
   4182       if (!BD->param_empty()) S += ", ";
   4183       S += "...";
   4184     }
   4185     S += ')';
   4186   }
   4187   S += " {\n";
   4188 
   4189   // Create local declarations to avoid rewriting all closure decl ref exprs.
   4190   // First, emit a declaration for all "by ref" decls.
   4191   for (llvm::SmallVector<ValueDecl*,8>::iterator I = BlockByRefDecls.begin(),
   4192        E = BlockByRefDecls.end(); I != E; ++I) {
   4193     S += "  ";
   4194     std::string Name = (*I)->getNameAsString();
   4195     std::string TypeString;
   4196     RewriteByRefString(TypeString, Name, (*I));
   4197     TypeString += " *";
   4198     Name = TypeString + Name;
   4199     S += Name + " = __cself->" + (*I)->getNameAsString() + "; // bound by ref\n";
   4200   }
   4201   // Next, emit a declaration for all "by copy" declarations.
   4202   for (llvm::SmallVector<ValueDecl*,8>::iterator I = BlockByCopyDecls.begin(),
   4203        E = BlockByCopyDecls.end(); I != E; ++I) {
   4204     S += "  ";
   4205     // Handle nested closure invocation. For example:
   4206     //
   4207     //   void (^myImportedClosure)(void);
   4208     //   myImportedClosure  = ^(void) { setGlobalInt(x + y); };
   4209     //
   4210     //   void (^anotherClosure)(void);
   4211     //   anotherClosure = ^(void) {
   4212     //     myImportedClosure(); // import and invoke the closure
   4213     //   };
   4214     //
   4215     if (isTopLevelBlockPointerType((*I)->getType())) {
   4216       RewriteBlockPointerTypeVariable(S, (*I));
   4217       S += " = (";
   4218       RewriteBlockPointerType(S, (*I)->getType());
   4219       S += ")";
   4220       S += "__cself->" + (*I)->getNameAsString() + "; // bound by copy\n";
   4221     }
   4222     else {
   4223       std::string Name = (*I)->getNameAsString();
   4224       QualType QT = (*I)->getType();
   4225       if (HasLocalVariableExternalStorage(*I))
   4226         QT = Context->getPointerType(QT);
   4227       QT.getAsStringInternal(Name, Context->PrintingPolicy);
   4228       S += Name + " = __cself->" +
   4229                               (*I)->getNameAsString() + "; // bound by copy\n";
   4230     }
   4231   }
   4232   std::string RewrittenStr = RewrittenBlockExprs[CE];
   4233   const char *cstr = RewrittenStr.c_str();
   4234   while (*cstr++ != '{') ;
   4235   S += cstr;
   4236   S += "\n";
   4237   return S;
   4238 }
   4239 
   4240 std::string RewriteObjC::SynthesizeBlockHelperFuncs(BlockExpr *CE, int i,
   4241                                                    llvm::StringRef funcName,
   4242                                                    std::string Tag) {
   4243   std::string StructRef = "struct " + Tag;
   4244   std::string S = "static void __";
   4245 
   4246   S += funcName;
   4247   S += "_block_copy_" + utostr(i);
   4248   S += "(" + StructRef;
   4249   S += "*dst, " + StructRef;
   4250   S += "*src) {";
   4251   for (llvm::SmallPtrSet<ValueDecl*,8>::iterator I = ImportedBlockDecls.begin(),
   4252       E = ImportedBlockDecls.end(); I != E; ++I) {
   4253     S += "_Block_object_assign((void*)&dst->";
   4254     S += (*I)->getNameAsString();
   4255     S += ", (void*)src->";
   4256     S += (*I)->getNameAsString();
   4257     if (BlockByRefDeclsPtrSet.count((*I)))
   4258       S += ", " + utostr(BLOCK_FIELD_IS_BYREF) + "/*BLOCK_FIELD_IS_BYREF*/);";
   4259     else
   4260       S += ", " + utostr(BLOCK_FIELD_IS_OBJECT) + "/*BLOCK_FIELD_IS_OBJECT*/);";
   4261   }
   4262   S += "}\n";
   4263 
   4264   S += "\nstatic void __";
   4265   S += funcName;
   4266   S += "_block_dispose_" + utostr(i);
   4267   S += "(" + StructRef;
   4268   S += "*src) {";
   4269   for (llvm::SmallPtrSet<ValueDecl*,8>::iterator I = ImportedBlockDecls.begin(),
   4270       E = ImportedBlockDecls.end(); I != E; ++I) {
   4271     S += "_Block_object_dispose((void*)src->";
   4272     S += (*I)->getNameAsString();
   4273     if (BlockByRefDeclsPtrSet.count((*I)))
   4274       S += ", " + utostr(BLOCK_FIELD_IS_BYREF) + "/*BLOCK_FIELD_IS_BYREF*/);";
   4275     else
   4276       S += ", " + utostr(BLOCK_FIELD_IS_OBJECT) + "/*BLOCK_FIELD_IS_OBJECT*/);";
   4277   }
   4278   S += "}\n";
   4279   return S;
   4280 }
   4281 
   4282 std::string RewriteObjC::SynthesizeBlockImpl(BlockExpr *CE, std::string Tag,
   4283                                              std::string Desc) {
   4284   std::string S = "\nstruct " + Tag;
   4285   std::string Constructor = "  " + Tag;
   4286 
   4287   S += " {\n  struct __block_impl impl;\n";
   4288   S += "  struct " + Desc;
   4289   S += "* Desc;\n";
   4290 
   4291   Constructor += "(void *fp, "; // Invoke function pointer.
   4292   Constructor += "struct " + Desc; // Descriptor pointer.
   4293   Constructor += " *desc";
   4294 
   4295   if (BlockDeclRefs.size()) {
   4296     // Output all "by copy" declarations.
   4297     for (llvm::SmallVector<ValueDecl*,8>::iterator I = BlockByCopyDecls.begin(),
   4298          E = BlockByCopyDecls.end(); I != E; ++I) {
   4299       S += "  ";
   4300       std::string FieldName = (*I)->getNameAsString();
   4301       std::string ArgName = "_" + FieldName;
   4302       // Handle nested closure invocation. For example:
   4303       //
   4304       //   void (^myImportedBlock)(void);
   4305       //   myImportedBlock  = ^(void) { setGlobalInt(x + y); };
   4306       //
   4307       //   void (^anotherBlock)(void);
   4308       //   anotherBlock = ^(void) {
   4309       //     myImportedBlock(); // import and invoke the closure
   4310       //   };
   4311       //
   4312       if (isTopLevelBlockPointerType((*I)->getType())) {
   4313         S += "struct __block_impl *";
   4314         Constructor += ", void *" + ArgName;
   4315       } else {
   4316         QualType QT = (*I)->getType();
   4317         if (HasLocalVariableExternalStorage(*I))
   4318           QT = Context->getPointerType(QT);
   4319         QT.getAsStringInternal(FieldName, Context->PrintingPolicy);
   4320         QT.getAsStringInternal(ArgName, Context->PrintingPolicy);
   4321         Constructor += ", " + ArgName;
   4322       }
   4323       S += FieldName + ";\n";
   4324     }
   4325     // Output all "by ref" declarations.
   4326     for (llvm::SmallVector<ValueDecl*,8>::iterator I = BlockByRefDecls.begin(),
   4327          E = BlockByRefDecls.end(); I != E; ++I) {
   4328       S += "  ";
   4329       std::string FieldName = (*I)->getNameAsString();
   4330       std::string ArgName = "_" + FieldName;
   4331       {
   4332         std::string TypeString;
   4333         RewriteByRefString(TypeString, FieldName, (*I));
   4334         TypeString += " *";
   4335         FieldName = TypeString + FieldName;
   4336         ArgName = TypeString + ArgName;
   4337         Constructor += ", " + ArgName;
   4338       }
   4339       S += FieldName + "; // by ref\n";
   4340     }
   4341     // Finish writing the constructor.
   4342     Constructor += ", int flags=0)";
   4343     // Initialize all "by copy" arguments.
   4344     bool firsTime = true;
   4345     for (llvm::SmallVector<ValueDecl*,8>::iterator I = BlockByCopyDecls.begin(),
   4346          E = BlockByCopyDecls.end(); I != E; ++I) {
   4347       std::string Name = (*I)->getNameAsString();
   4348         if (firsTime) {
   4349           Constructor += " : ";
   4350           firsTime = false;
   4351         }
   4352         else
   4353           Constructor += ", ";
   4354         if (isTopLevelBlockPointerType((*I)->getType()))
   4355           Constructor += Name + "((struct __block_impl *)_" + Name + ")";
   4356         else
   4357           Constructor += Name + "(_" + Name + ")";
   4358     }
   4359     // Initialize all "by ref" arguments.
   4360     for (llvm::SmallVector<ValueDecl*,8>::iterator I = BlockByRefDecls.begin(),
   4361          E = BlockByRefDecls.end(); I != E; ++I) {
   4362       std::string Name = (*I)->getNameAsString();
   4363       if (firsTime) {
   4364         Constructor += " : ";
   4365         firsTime = false;
   4366       }
   4367       else
   4368         Constructor += ", ";
   4369       Constructor += Name + "(_" + Name + "->__forwarding)";
   4370     }
   4371 
   4372     Constructor += " {\n";
   4373     if (GlobalVarDecl)
   4374       Constructor += "    impl.isa = &_NSConcreteGlobalBlock;\n";
   4375     else
   4376       Constructor += "    impl.isa = &_NSConcreteStackBlock;\n";
   4377     Constructor += "    impl.Flags = flags;\n    impl.FuncPtr = fp;\n";
   4378 
   4379     Constructor += "    Desc = desc;\n";
   4380   } else {
   4381     // Finish writing the constructor.
   4382     Constructor += ", int flags=0) {\n";
   4383     if (GlobalVarDecl)
   4384       Constructor += "    impl.isa = &_NSConcreteGlobalBlock;\n";
   4385     else
   4386       Constructor += "    impl.isa = &_NSConcreteStackBlock;\n";
   4387     Constructor += "    impl.Flags = flags;\n    impl.FuncPtr = fp;\n";
   4388     Constructor += "    Desc = desc;\n";
   4389   }
   4390   Constructor += "  ";
   4391   Constructor += "}\n";
   4392   S += Constructor;
   4393   S += "};\n";
   4394   return S;
   4395 }
   4396 
   4397 std::string RewriteObjC::SynthesizeBlockDescriptor(std::string DescTag,
   4398                                                    std::string ImplTag, int i,
   4399                                                    llvm::StringRef FunName,
   4400                                                    unsigned hasCopy) {
   4401   std::string S = "\nstatic struct " + DescTag;
   4402 
   4403   S += " {\n  unsigned long reserved;\n";
   4404   S += "  unsigned long Block_size;\n";
   4405   if (hasCopy) {
   4406     S += "  void (*copy)(struct ";
   4407     S += ImplTag; S += "*, struct ";
   4408     S += ImplTag; S += "*);\n";
   4409 
   4410     S += "  void (*dispose)(struct ";
   4411     S += ImplTag; S += "*);\n";
   4412   }
   4413   S += "} ";
   4414 
   4415   S += DescTag + "_DATA = { 0, sizeof(struct ";
   4416   S += ImplTag + ")";
   4417   if (hasCopy) {
   4418     S += ", __" + FunName.str() + "_block_copy_" + utostr(i);
   4419     S += ", __" + FunName.str() + "_block_dispose_" + utostr(i);
   4420   }
   4421   S += "};\n";
   4422   return S;
   4423 }
   4424 
   4425 void RewriteObjC::SynthesizeBlockLiterals(SourceLocation FunLocStart,
   4426                                           llvm::StringRef FunName) {
   4427   // Insert declaration for the function in which block literal is used.
   4428   if (CurFunctionDeclToDeclareForBlock && !Blocks.empty())
   4429     RewriteBlockLiteralFunctionDecl(CurFunctionDeclToDeclareForBlock);
   4430   bool RewriteSC = (GlobalVarDecl &&
   4431                     !Blocks.empty() &&
   4432                     GlobalVarDecl->getStorageClass() == SC_Static &&
   4433                     GlobalVarDecl->getType().getCVRQualifiers());
   4434   if (RewriteSC) {
   4435     std::string SC(" void __");
   4436     SC += GlobalVarDecl->getNameAsString();
   4437     SC += "() {}";
   4438     InsertText(FunLocStart, SC);
   4439   }
   4440 
   4441   // Insert closures that were part of the function.
   4442   for (unsigned i = 0, count=0; i < Blocks.size(); i++) {
   4443     CollectBlockDeclRefInfo(Blocks[i]);
   4444     // Need to copy-in the inner copied-in variables not actually used in this
   4445     // block.
   4446     for (int j = 0; j < InnerDeclRefsCount[i]; j++) {
   4447       BlockDeclRefExpr *Exp = InnerDeclRefs[count++];
   4448       ValueDecl *VD = Exp->getDecl();
   4449       BlockDeclRefs.push_back(Exp);
   4450       if (!Exp->isByRef() && !BlockByCopyDeclsPtrSet.count(VD)) {
   4451         BlockByCopyDeclsPtrSet.insert(VD);
   4452         BlockByCopyDecls.push_back(VD);
   4453       }
   4454       if (Exp->isByRef() && !BlockByRefDeclsPtrSet.count(VD)) {
   4455         BlockByRefDeclsPtrSet.insert(VD);
   4456         BlockByRefDecls.push_back(VD);
   4457       }
   4458       // imported objects in the inner blocks not used in the outer
   4459       // blocks must be copied/disposed in the outer block as well.
   4460       if (Exp->isByRef() ||
   4461           VD->getType()->isObjCObjectPointerType() ||
   4462           VD->getType()->isBlockPointerType())
   4463         ImportedBlockDecls.insert(VD);
   4464     }
   4465 
   4466     std::string ImplTag = "__" + FunName.str() + "_block_impl_" + utostr(i);
   4467     std::string DescTag = "__" + FunName.str() + "_block_desc_" + utostr(i);
   4468 
   4469     std::string CI = SynthesizeBlockImpl(Blocks[i], ImplTag, DescTag);
   4470 
   4471     InsertText(FunLocStart, CI);
   4472 
   4473     std::string CF = SynthesizeBlockFunc(Blocks[i], i, FunName, ImplTag);
   4474 
   4475     InsertText(FunLocStart, CF);
   4476 
   4477     if (ImportedBlockDecls.size()) {
   4478       std::string HF = SynthesizeBlockHelperFuncs(Blocks[i], i, FunName, ImplTag);
   4479       InsertText(FunLocStart, HF);
   4480     }
   4481     std::string BD = SynthesizeBlockDescriptor(DescTag, ImplTag, i, FunName,
   4482                                                ImportedBlockDecls.size() > 0);
   4483     InsertText(FunLocStart, BD);
   4484 
   4485     BlockDeclRefs.clear();
   4486     BlockByRefDecls.clear();
   4487     BlockByRefDeclsPtrSet.clear();
   4488     BlockByCopyDecls.clear();
   4489     BlockByCopyDeclsPtrSet.clear();
   4490     ImportedBlockDecls.clear();
   4491   }
   4492   if (RewriteSC) {
   4493     // Must insert any 'const/volatile/static here. Since it has been
   4494     // removed as result of rewriting of block literals.
   4495     std::string SC;
   4496     if (GlobalVarDecl->getStorageClass() == SC_Static)
   4497       SC = "static ";
   4498     if (GlobalVarDecl->getType().isConstQualified())
   4499       SC += "const ";
   4500     if (GlobalVarDecl->getType().isVolatileQualified())
   4501       SC += "volatile ";
   4502     if (GlobalVarDecl->getType().isRestrictQualified())
   4503       SC += "restrict ";
   4504     InsertText(FunLocStart, SC);
   4505   }
   4506 
   4507   Blocks.clear();
   4508   InnerDeclRefsCount.clear();
   4509   InnerDeclRefs.clear();
   4510   RewrittenBlockExprs.clear();
   4511 }
   4512 
   4513 void RewriteObjC::InsertBlockLiteralsWithinFunction(FunctionDecl *FD) {
   4514   SourceLocation FunLocStart = FD->getTypeSpecStartLoc();
   4515   llvm::StringRef FuncName = FD->getName();
   4516 
   4517   SynthesizeBlockLiterals(FunLocStart, FuncName);
   4518 }
   4519 
   4520 static void BuildUniqueMethodName(std::string &Name,
   4521                                   ObjCMethodDecl *MD) {
   4522   ObjCInterfaceDecl *IFace = MD->getClassInterface();
   4523   Name = IFace->getName();
   4524   Name += "__" + MD->getSelector().getAsString();
   4525   // Convert colons to underscores.
   4526   std::string::size_type loc = 0;
   4527   while ((loc = Name.find(":", loc)) != std::string::npos)
   4528     Name.replace(loc, 1, "_");
   4529 }
   4530 
   4531 void RewriteObjC::InsertBlockLiteralsWithinMethod(ObjCMethodDecl *MD) {
   4532   //fprintf(stderr,"In InsertBlockLiteralsWitinMethod\n");
   4533   //SourceLocation FunLocStart = MD->getLocStart();
   4534   SourceLocation FunLocStart = MD->getLocStart();
   4535   std::string FuncName;
   4536   BuildUniqueMethodName(FuncName, MD);
   4537   SynthesizeBlockLiterals(FunLocStart, FuncName);
   4538 }
   4539 
   4540 void RewriteObjC::GetBlockDeclRefExprs(Stmt *S) {
   4541   for (Stmt::child_range CI = S->children(); CI; ++CI)
   4542     if (*CI) {
   4543       if (BlockExpr *CBE = dyn_cast<BlockExpr>(*CI))
   4544         GetBlockDeclRefExprs(CBE->getBody());
   4545       else
   4546         GetBlockDeclRefExprs(*CI);
   4547     }
   4548   // Handle specific things.
   4549   if (BlockDeclRefExpr *CDRE = dyn_cast<BlockDeclRefExpr>(S)) {
   4550     // FIXME: Handle enums.
   4551     if (!isa<FunctionDecl>(CDRE->getDecl()))
   4552       BlockDeclRefs.push_back(CDRE);
   4553   }
   4554   else if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(S))
   4555     if (HasLocalVariableExternalStorage(DRE->getDecl())) {
   4556         BlockDeclRefExpr *BDRE =
   4557           new (Context)BlockDeclRefExpr(cast<VarDecl>(DRE->getDecl()),
   4558                                         DRE->getType(),
   4559                                         VK_LValue, DRE->getLocation(), false);
   4560         BlockDeclRefs.push_back(BDRE);
   4561     }
   4562 
   4563   return;
   4564 }
   4565 
   4566 void RewriteObjC::GetInnerBlockDeclRefExprs(Stmt *S,
   4567                 llvm::SmallVector<BlockDeclRefExpr *, 8> &InnerBlockDeclRefs,
   4568                 llvm::SmallPtrSet<const DeclContext *, 8> &InnerContexts) {
   4569   for (Stmt::child_range CI = S->children(); CI; ++CI)
   4570     if (*CI) {
   4571       if (BlockExpr *CBE = dyn_cast<BlockExpr>(*CI)) {
   4572         InnerContexts.insert(cast<DeclContext>(CBE->getBlockDecl()));
   4573         GetInnerBlockDeclRefExprs(CBE->getBody(),
   4574                                   InnerBlockDeclRefs,
   4575                                   InnerContexts);
   4576       }
   4577       else
   4578         GetInnerBlockDeclRefExprs(*CI,
   4579                                   InnerBlockDeclRefs,
   4580                                   InnerContexts);
   4581 
   4582     }
   4583   // Handle specific things.
   4584   if (BlockDeclRefExpr *CDRE = dyn_cast<BlockDeclRefExpr>(S)) {
   4585     if (!isa<FunctionDecl>(CDRE->getDecl()) &&
   4586         !InnerContexts.count(CDRE->getDecl()->getDeclContext()))
   4587       InnerBlockDeclRefs.push_back(CDRE);
   4588   }
   4589   else if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(S)) {
   4590     if (VarDecl *Var = dyn_cast<VarDecl>(DRE->getDecl()))
   4591       if (Var->isFunctionOrMethodVarDecl())
   4592         ImportedLocalExternalDecls.insert(Var);
   4593   }
   4594 
   4595   return;
   4596 }
   4597 
   4598 /// convertFunctionTypeOfBlocks - This routine converts a function type
   4599 /// whose result type may be a block pointer or whose argument type(s)
   4600 /// might be block pointers to an equivalent function type replacing
   4601 /// all block pointers to function pointers.
   4602 QualType RewriteObjC::convertFunctionTypeOfBlocks(const FunctionType *FT) {
   4603   const FunctionProtoType *FTP = dyn_cast<FunctionProtoType>(FT);
   4604   // FTP will be null for closures that don't take arguments.
   4605   // Generate a funky cast.
   4606   llvm::SmallVector<QualType, 8> ArgTypes;
   4607   QualType Res = FT->getResultType();
   4608   bool HasBlockType = convertBlockPointerToFunctionPointer(Res);
   4609 
   4610   if (FTP) {
   4611     for (FunctionProtoType::arg_type_iterator I = FTP->arg_type_begin(),
   4612          E = FTP->arg_type_end(); I && (I != E); ++I) {
   4613       QualType t = *I;
   4614       // Make sure we convert "t (^)(...)" to "t (*)(...)".
   4615       if (convertBlockPointerToFunctionPointer(t))
   4616         HasBlockType = true;
   4617       ArgTypes.push_back(t);
   4618     }
   4619   }
   4620   QualType FuncType;
   4621   // FIXME. Does this work if block takes no argument but has a return type
   4622   // which is of block type?
   4623   if (HasBlockType)
   4624     FuncType = getSimpleFunctionType(Res, &ArgTypes[0], ArgTypes.size());
   4625   else FuncType = QualType(FT, 0);
   4626   return FuncType;
   4627 }
   4628 
   4629 Stmt *RewriteObjC::SynthesizeBlockCall(CallExpr *Exp, const Expr *BlockExp) {
   4630   // Navigate to relevant type information.
   4631   const BlockPointerType *CPT = 0;
   4632 
   4633   if (const DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(BlockExp)) {
   4634     CPT = DRE->getType()->getAs<BlockPointerType>();
   4635   } else if (const BlockDeclRefExpr *CDRE =
   4636               dyn_cast<BlockDeclRefExpr>(BlockExp)) {
   4637     CPT = CDRE->getType()->getAs<BlockPointerType>();
   4638   } else if (const MemberExpr *MExpr = dyn_cast<MemberExpr>(BlockExp)) {
   4639     CPT = MExpr->getType()->getAs<BlockPointerType>();
   4640   }
   4641   else if (const ParenExpr *PRE = dyn_cast<ParenExpr>(BlockExp)) {
   4642     return SynthesizeBlockCall(Exp, PRE->getSubExpr());
   4643   }
   4644   else if (const ImplicitCastExpr *IEXPR = dyn_cast<ImplicitCastExpr>(BlockExp))
   4645     CPT = IEXPR->getType()->getAs<BlockPointerType>();
   4646   else if (const ConditionalOperator *CEXPR =
   4647             dyn_cast<ConditionalOperator>(BlockExp)) {
   4648     Expr *LHSExp = CEXPR->getLHS();
   4649     Stmt *LHSStmt = SynthesizeBlockCall(Exp, LHSExp);
   4650     Expr *RHSExp = CEXPR->getRHS();
   4651     Stmt *RHSStmt = SynthesizeBlockCall(Exp, RHSExp);
   4652     Expr *CONDExp = CEXPR->getCond();
   4653     ConditionalOperator *CondExpr =
   4654       new (Context) ConditionalOperator(CONDExp,
   4655                                       SourceLocation(), cast<Expr>(LHSStmt),
   4656                                       SourceLocation(), cast<Expr>(RHSStmt),
   4657                                       Exp->getType(), VK_RValue, OK_Ordinary);
   4658     return CondExpr;
   4659   } else if (const ObjCIvarRefExpr *IRE = dyn_cast<ObjCIvarRefExpr>(BlockExp)) {
   4660     CPT = IRE->getType()->getAs<BlockPointerType>();
   4661   } else {
   4662     assert(1 && "RewriteBlockClass: Bad type");
   4663   }
   4664   assert(CPT && "RewriteBlockClass: Bad type");
   4665   const FunctionType *FT = CPT->getPointeeType()->getAs<FunctionType>();
   4666   assert(FT && "RewriteBlockClass: Bad type");
   4667   const FunctionProtoType *FTP = dyn_cast<FunctionProtoType>(FT);
   4668   // FTP will be null for closures that don't take arguments.
   4669 
   4670   RecordDecl *RD = RecordDecl::Create(*Context, TTK_Struct, TUDecl,
   4671                                       SourceLocation(), SourceLocation(),
   4672                                       &Context->Idents.get("__block_impl"));
   4673   QualType PtrBlock = Context->getPointerType(Context->getTagDeclType(RD));
   4674 
   4675   // Generate a funky cast.
   4676   llvm::SmallVector<QualType, 8> ArgTypes;
   4677 
   4678   // Push the block argument type.
   4679   ArgTypes.push_back(PtrBlock);
   4680   if (FTP) {
   4681     for (FunctionProtoType::arg_type_iterator I = FTP->arg_type_begin(),
   4682          E = FTP->arg_type_end(); I && (I != E); ++I) {
   4683       QualType t = *I;
   4684       // Make sure we convert "t (^)(...)" to "t (*)(...)".
   4685       if (!convertBlockPointerToFunctionPointer(t))
   4686         convertToUnqualifiedObjCType(t);
   4687       ArgTypes.push_back(t);
   4688     }
   4689   }
   4690   // Now do the pointer to function cast.
   4691   QualType PtrToFuncCastType
   4692     = getSimpleFunctionType(Exp->getType(), &ArgTypes[0], ArgTypes.size());
   4693 
   4694   PtrToFuncCastType = Context->getPointerType(PtrToFuncCastType);
   4695 
   4696   CastExpr *BlkCast = NoTypeInfoCStyleCastExpr(Context, PtrBlock,
   4697                                                CK_BitCast,
   4698                                                const_cast<Expr*>(BlockExp));
   4699   // Don't forget the parens to enforce the proper binding.
   4700   ParenExpr *PE = new (Context) ParenExpr(SourceLocation(), SourceLocation(),
   4701                                           BlkCast);
   4702   //PE->dump();
   4703 
   4704   FieldDecl *FD = FieldDecl::Create(*Context, 0, SourceLocation(),
   4705                                     SourceLocation(),
   4706                                     &Context->Idents.get("FuncPtr"),
   4707                                     Context->VoidPtrTy, 0,
   4708                                     /*BitWidth=*/0, /*Mutable=*/true,
   4709                                     /*HasInit=*/false);
   4710   MemberExpr *ME = new (Context) MemberExpr(PE, true, FD, SourceLocation(),
   4711                                             FD->getType(), VK_LValue,
   4712                                             OK_Ordinary);
   4713 
   4714 
   4715   CastExpr *FunkCast = NoTypeInfoCStyleCastExpr(Context, PtrToFuncCastType,
   4716                                                 CK_BitCast, ME);
   4717   PE = new (Context) ParenExpr(SourceLocation(), SourceLocation(), FunkCast);
   4718 
   4719   llvm::SmallVector<Expr*, 8> BlkExprs;
   4720   // Add the implicit argument.
   4721   BlkExprs.push_back(BlkCast);
   4722   // Add the user arguments.
   4723   for (CallExpr::arg_iterator I = Exp->arg_begin(),
   4724        E = Exp->arg_end(); I != E; ++I) {
   4725     BlkExprs.push_back(*I);
   4726   }
   4727   CallExpr *CE = new (Context) CallExpr(*Context, PE, &BlkExprs[0],
   4728                                         BlkExprs.size(),
   4729                                         Exp->getType(), VK_RValue,
   4730                                         SourceLocation());
   4731   return CE;
   4732 }
   4733 
   4734 // We need to return the rewritten expression to handle cases where the
   4735 // BlockDeclRefExpr is embedded in another expression being rewritten.
   4736 // For example:
   4737 //
   4738 // int main() {
   4739 //    __block Foo *f;
   4740 //    __block int i;
   4741 //
   4742 //    void (^myblock)() = ^() {
   4743 //        [f test]; // f is a BlockDeclRefExpr embedded in a message (which is being rewritten).
   4744 //        i = 77;
   4745 //    };
   4746 //}
   4747 Stmt *RewriteObjC::RewriteBlockDeclRefExpr(Expr *DeclRefExp) {
   4748   // Rewrite the byref variable into BYREFVAR->__forwarding->BYREFVAR
   4749   // for each DeclRefExp where BYREFVAR is name of the variable.
   4750   ValueDecl *VD;
   4751   bool isArrow = true;
   4752   if (BlockDeclRefExpr *BDRE = dyn_cast<BlockDeclRefExpr>(DeclRefExp))
   4753     VD = BDRE->getDecl();
   4754   else {
   4755     VD = cast<DeclRefExpr>(DeclRefExp)->getDecl();
   4756     isArrow = false;
   4757   }
   4758 
   4759   FieldDecl *FD = FieldDecl::Create(*Context, 0, SourceLocation(),
   4760                                     SourceLocation(),
   4761                                     &Context->Idents.get("__forwarding"),
   4762                                     Context->VoidPtrTy, 0,
   4763                                     /*BitWidth=*/0, /*Mutable=*/true,
   4764                                     /*HasInit=*/false);
   4765   MemberExpr *ME = new (Context) MemberExpr(DeclRefExp, isArrow,
   4766                                             FD, SourceLocation(),
   4767                                             FD->getType(), VK_LValue,
   4768                                             OK_Ordinary);
   4769 
   4770   llvm::StringRef Name = VD->getName();
   4771   FD = FieldDecl::Create(*Context, 0, SourceLocation(), SourceLocation(),
   4772                          &Context->Idents.get(Name),
   4773                          Context->VoidPtrTy, 0,
   4774                          /*BitWidth=*/0, /*Mutable=*/true,
   4775                          /*HasInit=*/false);
   4776   ME = new (Context) MemberExpr(ME, true, FD, SourceLocation(),
   4777                                 DeclRefExp->getType(), VK_LValue, OK_Ordinary);
   4778 
   4779 
   4780 
   4781   // Need parens to enforce precedence.
   4782   ParenExpr *PE = new (Context) ParenExpr(DeclRefExp->getExprLoc(),
   4783                                           DeclRefExp->getExprLoc(),
   4784                                           ME);
   4785   ReplaceStmt(DeclRefExp, PE);
   4786   return PE;
   4787 }
   4788 
   4789 // Rewrites the imported local variable V with external storage
   4790 // (static, extern, etc.) as *V
   4791 //
   4792 Stmt *RewriteObjC::RewriteLocalVariableExternalStorage(DeclRefExpr *DRE) {
   4793   ValueDecl *VD = DRE->getDecl();
   4794   if (VarDecl *Var = dyn_cast<VarDecl>(VD))
   4795     if (!ImportedLocalExternalDecls.count(Var))
   4796       return DRE;
   4797   Expr *Exp = new (Context) UnaryOperator(DRE, UO_Deref, DRE->getType(),
   4798                                           VK_LValue, OK_Ordinary,
   4799                                           DRE->getLocation());
   4800   // Need parens to enforce precedence.
   4801   ParenExpr *PE = new (Context) ParenExpr(SourceLocation(), SourceLocation(),
   4802                                           Exp);
   4803   ReplaceStmt(DRE, PE);
   4804   return PE;
   4805 }
   4806 
   4807 void RewriteObjC::RewriteCastExpr(CStyleCastExpr *CE) {
   4808   SourceLocation LocStart = CE->getLParenLoc();
   4809   SourceLocation LocEnd = CE->getRParenLoc();
   4810 
   4811   // Need to avoid trying to rewrite synthesized casts.
   4812   if (LocStart.isInvalid())
   4813     return;
   4814   // Need to avoid trying to rewrite casts contained in macros.
   4815   if (!Rewriter::isRewritable(LocStart) || !Rewriter::isRewritable(LocEnd))
   4816     return;
   4817 
   4818   const char *startBuf = SM->getCharacterData(LocStart);
   4819   const char *endBuf = SM->getCharacterData(LocEnd);
   4820   QualType QT = CE->getType();
   4821   const Type* TypePtr = QT->getAs<Type>();
   4822   if (isa<TypeOfExprType>(TypePtr)) {
   4823     const TypeOfExprType *TypeOfExprTypePtr = cast<TypeOfExprType>(TypePtr);
   4824     QT = TypeOfExprTypePtr->getUnderlyingExpr()->getType();
   4825     std::string TypeAsString = "(";
   4826     RewriteBlockPointerType(TypeAsString, QT);
   4827     TypeAsString += ")";
   4828     ReplaceText(LocStart, endBuf-startBuf+1, TypeAsString);
   4829     return;
   4830   }
   4831   // advance the location to startArgList.
   4832   const char *argPtr = startBuf;
   4833 
   4834   while (*argPtr++ && (argPtr < endBuf)) {
   4835     switch (*argPtr) {
   4836     case '^':
   4837       // Replace the '^' with '*'.
   4838       LocStart = LocStart.getFileLocWithOffset(argPtr-startBuf);
   4839       ReplaceText(LocStart, 1, "*");
   4840       break;
   4841     }
   4842   }
   4843   return;
   4844 }
   4845 
   4846 void RewriteObjC::RewriteBlockPointerFunctionArgs(FunctionDecl *FD) {
   4847   SourceLocation DeclLoc = FD->getLocation();
   4848   unsigned parenCount = 0;
   4849 
   4850   // We have 1 or more arguments that have closure pointers.
   4851   const char *startBuf = SM->getCharacterData(DeclLoc);
   4852   const char *startArgList = strchr(startBuf, '(');
   4853 
   4854   assert((*startArgList == '(') && "Rewriter fuzzy parser confused");
   4855 
   4856   parenCount++;
   4857   // advance the location to startArgList.
   4858   DeclLoc = DeclLoc.getFileLocWithOffset(startArgList-startBuf);
   4859   assert((DeclLoc.isValid()) && "Invalid DeclLoc");
   4860 
   4861   const char *argPtr = startArgList;
   4862 
   4863   while (*argPtr++ && parenCount) {
   4864     switch (*argPtr) {
   4865     case '^':
   4866       // Replace the '^' with '*'.
   4867       DeclLoc = DeclLoc.getFileLocWithOffset(argPtr-startArgList);
   4868       ReplaceText(DeclLoc, 1, "*");
   4869       break;
   4870     case '(':
   4871       parenCount++;
   4872       break;
   4873     case ')':
   4874       parenCount--;
   4875       break;
   4876     }
   4877   }
   4878   return;
   4879 }
   4880 
   4881 bool RewriteObjC::PointerTypeTakesAnyBlockArguments(QualType QT) {
   4882   const FunctionProtoType *FTP;
   4883   const PointerType *PT = QT->getAs<PointerType>();
   4884   if (PT) {
   4885     FTP = PT->getPointeeType()->getAs<FunctionProtoType>();
   4886   } else {
   4887     const BlockPointerType *BPT = QT->getAs<BlockPointerType>();
   4888     assert(BPT && "BlockPointerTypeTakeAnyBlockArguments(): not a block pointer type");
   4889     FTP = BPT->getPointeeType()->getAs<FunctionProtoType>();
   4890   }
   4891   if (FTP) {
   4892     for (FunctionProtoType::arg_type_iterator I = FTP->arg_type_begin(),
   4893          E = FTP->arg_type_end(); I != E; ++I)
   4894       if (isTopLevelBlockPointerType(*I))
   4895         return true;
   4896   }
   4897   return false;
   4898 }
   4899 
   4900 bool RewriteObjC::PointerTypeTakesAnyObjCQualifiedType(QualType QT) {
   4901   const FunctionProtoType *FTP;
   4902   const PointerType *PT = QT->getAs<PointerType>();
   4903   if (PT) {
   4904     FTP = PT->getPointeeType()->getAs<FunctionProtoType>();
   4905   } else {
   4906     const BlockPointerType *BPT = QT->getAs<BlockPointerType>();
   4907     assert(BPT && "BlockPointerTypeTakeAnyBlockArguments(): not a block pointer type");
   4908     FTP = BPT->getPointeeType()->getAs<FunctionProtoType>();
   4909   }
   4910   if (FTP) {
   4911     for (FunctionProtoType::arg_type_iterator I = FTP->arg_type_begin(),
   4912          E = FTP->arg_type_end(); I != E; ++I) {
   4913       if ((*I)->isObjCQualifiedIdType())
   4914         return true;
   4915       if ((*I)->isObjCObjectPointerType() &&
   4916           (*I)->getPointeeType()->isObjCQualifiedInterfaceType())
   4917         return true;
   4918     }
   4919 
   4920   }
   4921   return false;
   4922 }
   4923 
   4924 void RewriteObjC::GetExtentOfArgList(const char *Name, const char *&LParen,
   4925                                      const char *&RParen) {
   4926   const char *argPtr = strchr(Name, '(');
   4927   assert((*argPtr == '(') && "Rewriter fuzzy parser confused");
   4928 
   4929   LParen = argPtr; // output the start.
   4930   argPtr++; // skip past the left paren.
   4931   unsigned parenCount = 1;
   4932 
   4933   while (*argPtr && parenCount) {
   4934     switch (*argPtr) {
   4935     case '(': parenCount++; break;
   4936     case ')': parenCount--; break;
   4937     default: break;
   4938     }
   4939     if (parenCount) argPtr++;
   4940   }
   4941   assert((*argPtr == ')') && "Rewriter fuzzy parser confused");
   4942   RParen = argPtr; // output the end
   4943 }
   4944 
   4945 void RewriteObjC::RewriteBlockPointerDecl(NamedDecl *ND) {
   4946   if (FunctionDecl *FD = dyn_cast<FunctionDecl>(ND)) {
   4947     RewriteBlockPointerFunctionArgs(FD);
   4948     return;
   4949   }
   4950   // Handle Variables and Typedefs.
   4951   SourceLocation DeclLoc = ND->getLocation();
   4952   QualType DeclT;
   4953   if (VarDecl *VD = dyn_cast<VarDecl>(ND))
   4954     DeclT = VD->getType();
   4955   else if (TypedefNameDecl *TDD = dyn_cast<TypedefNameDecl>(ND))
   4956     DeclT = TDD->getUnderlyingType();
   4957   else if (FieldDecl *FD = dyn_cast<FieldDecl>(ND))
   4958     DeclT = FD->getType();
   4959   else
   4960     assert(0 && "RewriteBlockPointerDecl(): Decl type not yet handled");
   4961 
   4962   const char *startBuf = SM->getCharacterData(DeclLoc);
   4963   const char *endBuf = startBuf;
   4964   // scan backward (from the decl location) for the end of the previous decl.
   4965   while (*startBuf != '^' && *startBuf != ';' && startBuf != MainFileStart)
   4966     startBuf--;
   4967   SourceLocation Start = DeclLoc.getFileLocWithOffset(startBuf-endBuf);
   4968   std::string buf;
   4969   unsigned OrigLength=0;
   4970   // *startBuf != '^' if we are dealing with a pointer to function that
   4971   // may take block argument types (which will be handled below).
   4972   if (*startBuf == '^') {
   4973     // Replace the '^' with '*', computing a negative offset.
   4974     buf = '*';
   4975     startBuf++;
   4976     OrigLength++;
   4977   }
   4978   while (*startBuf != ')') {
   4979     buf += *startBuf;
   4980     startBuf++;
   4981     OrigLength++;
   4982   }
   4983   buf += ')';
   4984   OrigLength++;
   4985 
   4986   if (PointerTypeTakesAnyBlockArguments(DeclT) ||
   4987       PointerTypeTakesAnyObjCQualifiedType(DeclT)) {
   4988     // Replace the '^' with '*' for arguments.
   4989     // Replace id<P> with id/*<>*/
   4990     DeclLoc = ND->getLocation();
   4991     startBuf = SM->getCharacterData(DeclLoc);
   4992     const char *argListBegin, *argListEnd;
   4993     GetExtentOfArgList(startBuf, argListBegin, argListEnd);
   4994     while (argListBegin < argListEnd) {
   4995       if (*argListBegin == '^')
   4996         buf += '*';
   4997       else if (*argListBegin ==  '<') {
   4998         buf += "/*";
   4999         buf += *argListBegin++;
   5000         OrigLength++;;
   5001         while (*argListBegin != '>') {
   5002           buf += *argListBegin++;
   5003           OrigLength++;
   5004         }
   5005         buf += *argListBegin;
   5006         buf += "*/";
   5007       }
   5008       else
   5009         buf += *argListBegin;
   5010       argListBegin++;
   5011       OrigLength++;
   5012     }
   5013     buf += ')';
   5014     OrigLength++;
   5015   }
   5016   ReplaceText(Start, OrigLength, buf);
   5017 
   5018   return;
   5019 }
   5020 
   5021 
   5022 /// SynthesizeByrefCopyDestroyHelper - This routine synthesizes:
   5023 /// void __Block_byref_id_object_copy(struct Block_byref_id_object *dst,
   5024 ///                    struct Block_byref_id_object *src) {
   5025 ///  _Block_object_assign (&_dest->object, _src->object,
   5026 ///                        BLOCK_BYREF_CALLER | BLOCK_FIELD_IS_OBJECT
   5027 ///                        [|BLOCK_FIELD_IS_WEAK]) // object
   5028 ///  _Block_object_assign(&_dest->object, _src->object,
   5029 ///                       BLOCK_BYREF_CALLER | BLOCK_FIELD_IS_BLOCK
   5030 ///                       [|BLOCK_FIELD_IS_WEAK]) // block
   5031 /// }
   5032 /// And:
   5033 /// void __Block_byref_id_object_dispose(struct Block_byref_id_object *_src) {
   5034 ///  _Block_object_dispose(_src->object,
   5035 ///                        BLOCK_BYREF_CALLER | BLOCK_FIELD_IS_OBJECT
   5036 ///                        [|BLOCK_FIELD_IS_WEAK]) // object
   5037 ///  _Block_object_dispose(_src->object,
   5038 ///                         BLOCK_BYREF_CALLER | BLOCK_FIELD_IS_BLOCK
   5039 ///                         [|BLOCK_FIELD_IS_WEAK]) // block
   5040 /// }
   5041 
   5042 std::string RewriteObjC::SynthesizeByrefCopyDestroyHelper(VarDecl *VD,
   5043                                                           int flag) {
   5044   std::string S;
   5045   if (CopyDestroyCache.count(flag))
   5046     return S;
   5047   CopyDestroyCache.insert(flag);
   5048   S = "static void __Block_byref_id_object_copy_";
   5049   S += utostr(flag);
   5050   S += "(void *dst, void *src) {\n";
   5051 
   5052   // offset into the object pointer is computed as:
   5053   // void * + void* + int + int + void* + void *
   5054   unsigned IntSize =
   5055   static_cast<unsigned>(Context->getTypeSize(Context->IntTy));
   5056   unsigned VoidPtrSize =
   5057   static_cast<unsigned>(Context->getTypeSize(Context->VoidPtrTy));
   5058 
   5059   unsigned offset = (VoidPtrSize*4 + IntSize + IntSize)/Context->getCharWidth();
   5060   S += " _Block_object_assign((char*)dst + ";
   5061   S += utostr(offset);
   5062   S += ", *(void * *) ((char*)src + ";
   5063   S += utostr(offset);
   5064   S += "), ";
   5065   S += utostr(flag);
   5066   S += ");\n}\n";
   5067 
   5068   S += "static void __Block_byref_id_object_dispose_";
   5069   S += utostr(flag);
   5070   S += "(void *src) {\n";
   5071   S += " _Block_object_dispose(*(void * *) ((char*)src + ";
   5072   S += utostr(offset);
   5073   S += "), ";
   5074   S += utostr(flag);
   5075   S += ");\n}\n";
   5076   return S;
   5077 }
   5078 
   5079 /// RewriteByRefVar - For each __block typex ND variable this routine transforms
   5080 /// the declaration into:
   5081 /// struct __Block_byref_ND {
   5082 /// void *__isa;                  // NULL for everything except __weak pointers
   5083 /// struct __Block_byref_ND *__forwarding;
   5084 /// int32_t __flags;
   5085 /// int32_t __size;
   5086 /// void *__Block_byref_id_object_copy; // If variable is __block ObjC object
   5087 /// void *__Block_byref_id_object_dispose; // If variable is __block ObjC object
   5088 /// typex ND;
   5089 /// };
   5090 ///
   5091 /// It then replaces declaration of ND variable with:
   5092 /// struct __Block_byref_ND ND = {__isa=0B, __forwarding=&ND, __flags=some_flag,
   5093 ///                               __size=sizeof(struct __Block_byref_ND),
   5094 ///                               ND=initializer-if-any};
   5095 ///
   5096 ///
   5097 void RewriteObjC::RewriteByRefVar(VarDecl *ND) {
   5098   // Insert declaration for the function in which block literal is
   5099   // used.
   5100   if (CurFunctionDeclToDeclareForBlock)
   5101     RewriteBlockLiteralFunctionDecl(CurFunctionDeclToDeclareForBlock);
   5102   int flag = 0;
   5103   int isa = 0;
   5104   SourceLocation DeclLoc = ND->getTypeSpecStartLoc();
   5105   if (DeclLoc.isInvalid())
   5106     // If type location is missing, it is because of missing type (a warning).
   5107     // Use variable's location which is good for this case.
   5108     DeclLoc = ND->getLocation();
   5109   const char *startBuf = SM->getCharacterData(DeclLoc);
   5110   SourceLocation X = ND->getLocEnd();
   5111   X = SM->getInstantiationLoc(X);
   5112   const char *endBuf = SM->getCharacterData(X);
   5113   std::string Name(ND->getNameAsString());
   5114   std::string ByrefType;
   5115   RewriteByRefString(ByrefType, Name, ND, true);
   5116   ByrefType += " {\n";
   5117   ByrefType += "  void *__isa;\n";
   5118   RewriteByRefString(ByrefType, Name, ND);
   5119   ByrefType += " *__forwarding;\n";
   5120   ByrefType += " int __flags;\n";
   5121   ByrefType += " int __size;\n";
   5122   // Add void *__Block_byref_id_object_copy;
   5123   // void *__Block_byref_id_object_dispose; if needed.
   5124   QualType Ty = ND->getType();
   5125   bool HasCopyAndDispose = Context->BlockRequiresCopying(Ty);
   5126   if (HasCopyAndDispose) {
   5127     ByrefType += " void (*__Block_byref_id_object_copy)(void*, void*);\n";
   5128     ByrefType += " void (*__Block_byref_id_object_dispose)(void*);\n";
   5129   }
   5130 
   5131   QualType T = Ty;
   5132   (void)convertBlockPointerToFunctionPointer(T);
   5133   T.getAsStringInternal(Name, Context->PrintingPolicy);
   5134 
   5135   ByrefType += " " + Name + ";\n";
   5136   ByrefType += "};\n";
   5137   // Insert this type in global scope. It is needed by helper function.
   5138   SourceLocation FunLocStart;
   5139   if (CurFunctionDef)
   5140      FunLocStart = CurFunctionDef->getTypeSpecStartLoc();
   5141   else {
   5142     assert(CurMethodDef && "RewriteByRefVar - CurMethodDef is null");
   5143     FunLocStart = CurMethodDef->getLocStart();
   5144   }
   5145   InsertText(FunLocStart, ByrefType);
   5146   if (Ty.isObjCGCWeak()) {
   5147     flag |= BLOCK_FIELD_IS_WEAK;
   5148     isa = 1;
   5149   }
   5150 
   5151   if (HasCopyAndDispose) {
   5152     flag = BLOCK_BYREF_CALLER;
   5153     QualType Ty = ND->getType();
   5154     // FIXME. Handle __weak variable (BLOCK_FIELD_IS_WEAK) as well.
   5155     if (Ty->isBlockPointerType())
   5156       flag |= BLOCK_FIELD_IS_BLOCK;
   5157     else
   5158       flag |= BLOCK_FIELD_IS_OBJECT;
   5159     std::string HF = SynthesizeByrefCopyDestroyHelper(ND, flag);
   5160     if (!HF.empty())
   5161       InsertText(FunLocStart, HF);
   5162   }
   5163 
   5164   // struct __Block_byref_ND ND =
   5165   // {0, &ND, some_flag, __size=sizeof(struct __Block_byref_ND),
   5166   //  initializer-if-any};
   5167   bool hasInit = (ND->getInit() != 0);
   5168   unsigned flags = 0;
   5169   if (HasCopyAndDispose)
   5170     flags |= BLOCK_HAS_COPY_DISPOSE;
   5171   Name = ND->getNameAsString();
   5172   ByrefType.clear();
   5173   RewriteByRefString(ByrefType, Name, ND);
   5174   std::string ForwardingCastType("(");
   5175   ForwardingCastType += ByrefType + " *)";
   5176   if (!hasInit) {
   5177     ByrefType += " " + Name + " = {(void*)";
   5178     ByrefType += utostr(isa);
   5179     ByrefType += "," +  ForwardingCastType + "&" + Name + ", ";
   5180     ByrefType += utostr(flags);
   5181     ByrefType += ", ";
   5182     ByrefType += "sizeof(";
   5183     RewriteByRefString(ByrefType, Name, ND);
   5184     ByrefType += ")";
   5185     if (HasCopyAndDispose) {
   5186       ByrefType += ", __Block_byref_id_object_copy_";
   5187       ByrefType += utostr(flag);
   5188       ByrefType += ", __Block_byref_id_object_dispose_";
   5189       ByrefType += utostr(flag);
   5190     }
   5191     ByrefType += "};\n";
   5192     unsigned nameSize = Name.size();
   5193     // for block or function pointer declaration. Name is aleady
   5194     // part of the declaration.
   5195     if (Ty->isBlockPointerType() || Ty->isFunctionPointerType())
   5196       nameSize = 1;
   5197     ReplaceText(DeclLoc, endBuf-startBuf+nameSize, ByrefType);
   5198   }
   5199   else {
   5200     SourceLocation startLoc;
   5201     Expr *E = ND->getInit();
   5202     if (const CStyleCastExpr *ECE = dyn_cast<CStyleCastExpr>(E))
   5203       startLoc = ECE->getLParenLoc();
   5204     else
   5205       startLoc = E->getLocStart();
   5206     startLoc = SM->getInstantiationLoc(startLoc);
   5207     endBuf = SM->getCharacterData(startLoc);
   5208     ByrefType += " " + Name;
   5209     ByrefType += " = {(void*)";
   5210     ByrefType += utostr(isa);
   5211     ByrefType += "," +  ForwardingCastType + "&" + Name + ", ";
   5212     ByrefType += utostr(flags);
   5213     ByrefType += ", ";
   5214     ByrefType += "sizeof(";
   5215     RewriteByRefString(ByrefType, Name, ND);
   5216     ByrefType += "), ";
   5217     if (HasCopyAndDispose) {
   5218       ByrefType += "__Block_byref_id_object_copy_";
   5219       ByrefType += utostr(flag);
   5220       ByrefType += ", __Block_byref_id_object_dispose_";
   5221       ByrefType += utostr(flag);
   5222       ByrefType += ", ";
   5223     }
   5224     ReplaceText(DeclLoc, endBuf-startBuf, ByrefType);
   5225 
   5226     // Complete the newly synthesized compound expression by inserting a right
   5227     // curly brace before the end of the declaration.
   5228     // FIXME: This approach avoids rewriting the initializer expression. It
   5229     // also assumes there is only one declarator. For example, the following
   5230     // isn't currently supported by this routine (in general):
   5231     //
   5232     // double __block BYREFVAR = 1.34, BYREFVAR2 = 1.37;
   5233     //
   5234     const char *startInitializerBuf = SM->getCharacterData(startLoc);
   5235     const char *semiBuf = strchr(startInitializerBuf, ';');
   5236     assert((*semiBuf == ';') && "RewriteByRefVar: can't find ';'");
   5237     SourceLocation semiLoc =
   5238       startLoc.getFileLocWithOffset(semiBuf-startInitializerBuf);
   5239 
   5240     InsertText(semiLoc, "}");
   5241   }
   5242   return;
   5243 }
   5244 
   5245 void RewriteObjC::CollectBlockDeclRefInfo(BlockExpr *Exp) {
   5246   // Add initializers for any closure decl refs.
   5247   GetBlockDeclRefExprs(Exp->getBody());
   5248   if (BlockDeclRefs.size()) {
   5249     // Unique all "by copy" declarations.
   5250     for (unsigned i = 0; i < BlockDeclRefs.size(); i++)
   5251       if (!BlockDeclRefs[i]->isByRef()) {
   5252         if (!BlockByCopyDeclsPtrSet.count(BlockDeclRefs[i]->getDecl())) {
   5253           BlockByCopyDeclsPtrSet.insert(BlockDeclRefs[i]->getDecl());
   5254           BlockByCopyDecls.push_back(BlockDeclRefs[i]->getDecl());
   5255         }
   5256       }
   5257     // Unique all "by ref" declarations.
   5258     for (unsigned i = 0; i < BlockDeclRefs.size(); i++)
   5259       if (BlockDeclRefs[i]->isByRef()) {
   5260         if (!BlockByRefDeclsPtrSet.count(BlockDeclRefs[i]->getDecl())) {
   5261           BlockByRefDeclsPtrSet.insert(BlockDeclRefs[i]->getDecl());
   5262           BlockByRefDecls.push_back(BlockDeclRefs[i]->getDecl());
   5263         }
   5264       }
   5265     // Find any imported blocks...they will need special attention.
   5266     for (unsigned i = 0; i < BlockDeclRefs.size(); i++)
   5267       if (BlockDeclRefs[i]->isByRef() ||
   5268           BlockDeclRefs[i]->getType()->isObjCObjectPointerType() ||
   5269           BlockDeclRefs[i]->getType()->isBlockPointerType())
   5270         ImportedBlockDecls.insert(BlockDeclRefs[i]->getDecl());
   5271   }
   5272 }
   5273 
   5274 FunctionDecl *RewriteObjC::SynthBlockInitFunctionDecl(llvm::StringRef name) {
   5275   IdentifierInfo *ID = &Context->Idents.get(name);
   5276   QualType FType = Context->getFunctionNoProtoType(Context->VoidPtrTy);
   5277   return FunctionDecl::Create(*Context, TUDecl, SourceLocation(),
   5278                               SourceLocation(), ID, FType, 0, SC_Extern,
   5279                               SC_None, false, false);
   5280 }
   5281 
   5282 Stmt *RewriteObjC::SynthBlockInitExpr(BlockExpr *Exp,
   5283           const llvm::SmallVector<BlockDeclRefExpr *, 8> &InnerBlockDeclRefs) {
   5284   const BlockDecl *block = Exp->getBlockDecl();
   5285   Blocks.push_back(Exp);
   5286 
   5287   CollectBlockDeclRefInfo(Exp);
   5288 
   5289   // Add inner imported variables now used in current block.
   5290  int countOfInnerDecls = 0;
   5291   if (!InnerBlockDeclRefs.empty()) {
   5292     for (unsigned i = 0; i < InnerBlockDeclRefs.size(); i++) {
   5293       BlockDeclRefExpr *Exp = InnerBlockDeclRefs[i];
   5294       ValueDecl *VD = Exp->getDecl();
   5295       if (!Exp->isByRef() && !BlockByCopyDeclsPtrSet.count(VD)) {
   5296       // We need to save the copied-in variables in nested
   5297       // blocks because it is needed at the end for some of the API generations.
   5298       // See SynthesizeBlockLiterals routine.
   5299         InnerDeclRefs.push_back(Exp); countOfInnerDecls++;
   5300         BlockDeclRefs.push_back(Exp);
   5301         BlockByCopyDeclsPtrSet.insert(VD);
   5302         BlockByCopyDecls.push_back(VD);
   5303       }
   5304       if (Exp->isByRef() && !BlockByRefDeclsPtrSet.count(VD)) {
   5305         InnerDeclRefs.push_back(Exp); countOfInnerDecls++;
   5306         BlockDeclRefs.push_back(Exp);
   5307         BlockByRefDeclsPtrSet.insert(VD);
   5308         BlockByRefDecls.push_back(VD);
   5309       }
   5310     }
   5311     // Find any imported blocks...they will need special attention.
   5312     for (unsigned i = 0; i < InnerBlockDeclRefs.size(); i++)
   5313       if (InnerBlockDeclRefs[i]->isByRef() ||
   5314           InnerBlockDeclRefs[i]->getType()->isObjCObjectPointerType() ||
   5315           InnerBlockDeclRefs[i]->getType()->isBlockPointerType())
   5316         ImportedBlockDecls.insert(InnerBlockDeclRefs[i]->getDecl());
   5317   }
   5318   InnerDeclRefsCount.push_back(countOfInnerDecls);
   5319 
   5320   std::string FuncName;
   5321 
   5322   if (CurFunctionDef)
   5323     FuncName = CurFunctionDef->getNameAsString();
   5324   else if (CurMethodDef)
   5325     BuildUniqueMethodName(FuncName, CurMethodDef);
   5326   else if (GlobalVarDecl)
   5327     FuncName = std::string(GlobalVarDecl->getNameAsString());
   5328 
   5329   std::string BlockNumber = utostr(Blocks.size()-1);
   5330 
   5331   std::string Tag = "__" + FuncName + "_block_impl_" + BlockNumber;
   5332   std::string Func = "__" + FuncName + "_block_func_" + BlockNumber;
   5333 
   5334   // Get a pointer to the function type so we can cast appropriately.
   5335   QualType BFT = convertFunctionTypeOfBlocks(Exp->getFunctionType());
   5336   QualType FType = Context->getPointerType(BFT);
   5337 
   5338   FunctionDecl *FD;
   5339   Expr *NewRep;
   5340 
   5341   // Simulate a contructor call...
   5342   FD = SynthBlockInitFunctionDecl(Tag);
   5343   DeclRefExpr *DRE = new (Context) DeclRefExpr(FD, FType, VK_RValue,
   5344                                                SourceLocation());
   5345 
   5346   llvm::SmallVector<Expr*, 4> InitExprs;
   5347 
   5348   // Initialize the block function.
   5349   FD = SynthBlockInitFunctionDecl(Func);
   5350   DeclRefExpr *Arg = new (Context) DeclRefExpr(FD, FD->getType(), VK_LValue,
   5351                                                SourceLocation());
   5352   CastExpr *castExpr = NoTypeInfoCStyleCastExpr(Context, Context->VoidPtrTy,
   5353                                                 CK_BitCast, Arg);
   5354   InitExprs.push_back(castExpr);
   5355 
   5356   // Initialize the block descriptor.
   5357   std::string DescData = "__" + FuncName + "_block_desc_" + BlockNumber + "_DATA";
   5358 
   5359   VarDecl *NewVD = VarDecl::Create(*Context, TUDecl,
   5360                                    SourceLocation(), SourceLocation(),
   5361                                    &Context->Idents.get(DescData.c_str()),
   5362                                    Context->VoidPtrTy, 0,
   5363                                    SC_Static, SC_None);
   5364   UnaryOperator *DescRefExpr =
   5365     new (Context) UnaryOperator(new (Context) DeclRefExpr(NewVD,
   5366                                                           Context->VoidPtrTy,
   5367                                                           VK_LValue,
   5368                                                           SourceLocation()),
   5369                                 UO_AddrOf,
   5370                                 Context->getPointerType(Context->VoidPtrTy),
   5371                                 VK_RValue, OK_Ordinary,
   5372                                 SourceLocation());
   5373   InitExprs.push_back(DescRefExpr);
   5374 
   5375   // Add initializers for any closure decl refs.
   5376   if (BlockDeclRefs.size()) {
   5377     Expr *Exp;
   5378     // Output all "by copy" declarations.
   5379     for (llvm::SmallVector<ValueDecl*,8>::iterator I = BlockByCopyDecls.begin(),
   5380          E = BlockByCopyDecls.end(); I != E; ++I) {
   5381       if (isObjCType((*I)->getType())) {
   5382         // FIXME: Conform to ABI ([[obj retain] autorelease]).
   5383         FD = SynthBlockInitFunctionDecl((*I)->getName());
   5384         Exp = new (Context) DeclRefExpr(FD, FD->getType(), VK_LValue,
   5385                                         SourceLocation());
   5386         if (HasLocalVariableExternalStorage(*I)) {
   5387           QualType QT = (*I)->getType();
   5388           QT = Context->getPointerType(QT);
   5389           Exp = new (Context) UnaryOperator(Exp, UO_AddrOf, QT, VK_RValue,
   5390                                             OK_Ordinary, SourceLocation());
   5391         }
   5392       } else if (isTopLevelBlockPointerType((*I)->getType())) {
   5393         FD = SynthBlockInitFunctionDecl((*I)->getName());
   5394         Arg = new (Context) DeclRefExpr(FD, FD->getType(), VK_LValue,
   5395                                         SourceLocation());
   5396         Exp = NoTypeInfoCStyleCastExpr(Context, Context->VoidPtrTy,
   5397                                        CK_BitCast, Arg);
   5398       } else {
   5399         FD = SynthBlockInitFunctionDecl((*I)->getName());
   5400         Exp = new (Context) DeclRefExpr(FD, FD->getType(), VK_LValue,
   5401                                         SourceLocation());
   5402         if (HasLocalVariableExternalStorage(*I)) {
   5403           QualType QT = (*I)->getType();
   5404           QT = Context->getPointerType(QT);
   5405           Exp = new (Context) UnaryOperator(Exp, UO_AddrOf, QT, VK_RValue,
   5406                                             OK_Ordinary, SourceLocation());
   5407         }
   5408 
   5409       }
   5410       InitExprs.push_back(Exp);
   5411     }
   5412     // Output all "by ref" declarations.
   5413     for (llvm::SmallVector<ValueDecl*,8>::iterator I = BlockByRefDecls.begin(),
   5414          E = BlockByRefDecls.end(); I != E; ++I) {
   5415       ValueDecl *ND = (*I);
   5416       std::string Name(ND->getNameAsString());
   5417       std::string RecName;
   5418       RewriteByRefString(RecName, Name, ND, true);
   5419       IdentifierInfo *II = &Context->Idents.get(RecName.c_str()
   5420                                                 + sizeof("struct"));
   5421       RecordDecl *RD = RecordDecl::Create(*Context, TTK_Struct, TUDecl,
   5422                                           SourceLocation(), SourceLocation(),
   5423                                           II);
   5424       assert(RD && "SynthBlockInitExpr(): Can't find RecordDecl");
   5425       QualType castT = Context->getPointerType(Context->getTagDeclType(RD));
   5426 
   5427       FD = SynthBlockInitFunctionDecl((*I)->getName());
   5428       Exp = new (Context) DeclRefExpr(FD, FD->getType(), VK_LValue,
   5429                                       SourceLocation());
   5430       bool isNestedCapturedVar = false;
   5431       if (block)
   5432         for (BlockDecl::capture_const_iterator ci = block->capture_begin(),
   5433              ce = block->capture_end(); ci != ce; ++ci) {
   5434           const VarDecl *variable = ci->getVariable();
   5435           if (variable == ND && ci->isNested()) {
   5436             assert (ci->isByRef() &&
   5437                     "SynthBlockInitExpr - captured block variable is not byref");
   5438             isNestedCapturedVar = true;
   5439             break;
   5440           }
   5441         }
   5442       // captured nested byref variable has its address passed. Do not take
   5443       // its address again.
   5444       if (!isNestedCapturedVar)
   5445           Exp = new (Context) UnaryOperator(Exp, UO_AddrOf,
   5446                                      Context->getPointerType(Exp->getType()),
   5447                                      VK_RValue, OK_Ordinary, SourceLocation());
   5448       Exp = NoTypeInfoCStyleCastExpr(Context, castT, CK_BitCast, Exp);
   5449       InitExprs.push_back(Exp);
   5450     }
   5451   }
   5452   if (ImportedBlockDecls.size()) {
   5453     // generate BLOCK_HAS_COPY_DISPOSE(have helper funcs) | BLOCK_HAS_DESCRIPTOR
   5454     int flag = (BLOCK_HAS_COPY_DISPOSE | BLOCK_HAS_DESCRIPTOR);
   5455     unsigned IntSize =
   5456       static_cast<unsigned>(Context->getTypeSize(Context->IntTy));
   5457     Expr *FlagExp = IntegerLiteral::Create(*Context, llvm::APInt(IntSize, flag),
   5458                                            Context->IntTy, SourceLocation());
   5459     InitExprs.push_back(FlagExp);
   5460   }
   5461   NewRep = new (Context) CallExpr(*Context, DRE, &InitExprs[0], InitExprs.size(),
   5462                                   FType, VK_LValue, SourceLocation());
   5463   NewRep = new (Context) UnaryOperator(NewRep, UO_AddrOf,
   5464                              Context->getPointerType(NewRep->getType()),
   5465                              VK_RValue, OK_Ordinary, SourceLocation());
   5466   NewRep = NoTypeInfoCStyleCastExpr(Context, FType, CK_BitCast,
   5467                                     NewRep);
   5468   BlockDeclRefs.clear();
   5469   BlockByRefDecls.clear();
   5470   BlockByRefDeclsPtrSet.clear();
   5471   BlockByCopyDecls.clear();
   5472   BlockByCopyDeclsPtrSet.clear();
   5473   ImportedBlockDecls.clear();
   5474   return NewRep;
   5475 }
   5476 
   5477 bool RewriteObjC::IsDeclStmtInForeachHeader(DeclStmt *DS) {
   5478   if (const ObjCForCollectionStmt * CS =
   5479       dyn_cast<ObjCForCollectionStmt>(Stmts.back()))
   5480         return CS->getElement() == DS;
   5481   return false;
   5482 }
   5483 
   5484 //===----------------------------------------------------------------------===//
   5485 // Function Body / Expression rewriting
   5486 //===----------------------------------------------------------------------===//
   5487 
   5488 // This is run as a first "pass" prior to RewriteFunctionBodyOrGlobalInitializer().
   5489 // The allows the main rewrite loop to associate all ObjCPropertyRefExprs with
   5490 // their respective BinaryOperator. Without this knowledge, we'd need to rewrite
   5491 // the ObjCPropertyRefExpr twice (once as a getter, and later as a setter).
   5492 // Since the rewriter isn't capable of rewriting rewritten code, it's important
   5493 // we get this right.
   5494 void RewriteObjC::CollectPropertySetters(Stmt *S) {
   5495   // Perform a bottom up traversal of all children.
   5496   for (Stmt::child_range CI = S->children(); CI; ++CI)
   5497     if (*CI)
   5498       CollectPropertySetters(*CI);
   5499 
   5500   if (BinaryOperator *BinOp = dyn_cast<BinaryOperator>(S)) {
   5501     if (BinOp->isAssignmentOp()) {
   5502       if (isa<ObjCPropertyRefExpr>(BinOp->getLHS()))
   5503         PropSetters[BinOp->getLHS()] = BinOp;
   5504     }
   5505   }
   5506 }
   5507 
   5508 Stmt *RewriteObjC::RewriteFunctionBodyOrGlobalInitializer(Stmt *S) {
   5509   if (isa<SwitchStmt>(S) || isa<WhileStmt>(S) ||
   5510       isa<DoStmt>(S) || isa<ForStmt>(S))
   5511     Stmts.push_back(S);
   5512   else if (isa<ObjCForCollectionStmt>(S)) {
   5513     Stmts.push_back(S);
   5514     ObjCBcLabelNo.push_back(++BcLabelCount);
   5515   }
   5516 
   5517   SourceRange OrigStmtRange = S->getSourceRange();
   5518 
   5519   // Perform a bottom up rewrite of all children.
   5520   for (Stmt::child_range CI = S->children(); CI; ++CI)
   5521     if (*CI) {
   5522       Stmt *newStmt;
   5523       Stmt *ChildStmt = (*CI);
   5524       if (ObjCIvarRefExpr *IvarRefExpr = dyn_cast<ObjCIvarRefExpr>(ChildStmt)) {
   5525         Expr *OldBase = IvarRefExpr->getBase();
   5526         bool replaced = false;
   5527         newStmt = RewriteObjCNestedIvarRefExpr(ChildStmt, replaced);
   5528         if (replaced) {
   5529           if (ObjCIvarRefExpr *IRE = dyn_cast<ObjCIvarRefExpr>(newStmt))
   5530             ReplaceStmt(OldBase, IRE->getBase());
   5531           else
   5532             ReplaceStmt(ChildStmt, newStmt);
   5533         }
   5534       }
   5535       else
   5536         newStmt = RewriteFunctionBodyOrGlobalInitializer(ChildStmt);
   5537       if (newStmt) {
   5538           if (Expr *PropOrImplicitRefExpr = dyn_cast<Expr>(ChildStmt))
   5539             if (PropSetters[PropOrImplicitRefExpr] == S) {
   5540               S = newStmt;
   5541               newStmt = 0;
   5542             }
   5543         if (newStmt)
   5544           *CI = newStmt;
   5545       }
   5546       // If dealing with an assignment with LHS being a property reference
   5547       // expression, the entire assignment tree is rewritten into a property
   5548       // setter messaging. This involvs the RHS too. Do not attempt to rewrite
   5549       // RHS again.
   5550       if (Expr *Exp = dyn_cast<Expr>(ChildStmt))
   5551         if (isa<ObjCPropertyRefExpr>(Exp)) {
   5552           if (PropSetters[Exp]) {
   5553             ++CI;
   5554             continue;
   5555           }
   5556         }
   5557     }
   5558 
   5559   if (BlockExpr *BE = dyn_cast<BlockExpr>(S)) {
   5560     llvm::SmallVector<BlockDeclRefExpr *, 8> InnerBlockDeclRefs;
   5561     llvm::SmallPtrSet<const DeclContext *, 8> InnerContexts;
   5562     InnerContexts.insert(BE->getBlockDecl());
   5563     ImportedLocalExternalDecls.clear();
   5564     GetInnerBlockDeclRefExprs(BE->getBody(),
   5565                               InnerBlockDeclRefs, InnerContexts);
   5566     // Rewrite the block body in place.
   5567     Stmt *SaveCurrentBody = CurrentBody;
   5568     CurrentBody = BE->getBody();
   5569     CollectPropertySetters(CurrentBody);
   5570     PropParentMap = 0;
   5571     RewriteFunctionBodyOrGlobalInitializer(BE->getBody());
   5572     CurrentBody = SaveCurrentBody;
   5573     PropParentMap = 0;
   5574     ImportedLocalExternalDecls.clear();
   5575     // Now we snarf the rewritten text and stash it away for later use.
   5576     std::string Str = Rewrite.ConvertToString(BE->getBody());
   5577     RewrittenBlockExprs[BE] = Str;
   5578 
   5579     Stmt *blockTranscribed = SynthBlockInitExpr(BE, InnerBlockDeclRefs);
   5580 
   5581     //blockTranscribed->dump();
   5582     ReplaceStmt(S, blockTranscribed);
   5583     return blockTranscribed;
   5584   }
   5585   // Handle specific things.
   5586   if (ObjCEncodeExpr *AtEncode = dyn_cast<ObjCEncodeExpr>(S))
   5587     return RewriteAtEncode(AtEncode);
   5588 
   5589   if (isa<ObjCPropertyRefExpr>(S)) {
   5590     Expr *PropOrImplicitRefExpr = dyn_cast<Expr>(S);
   5591     assert(PropOrImplicitRefExpr && "Property or implicit setter/getter is null");
   5592 
   5593     BinaryOperator *BinOp = PropSetters[PropOrImplicitRefExpr];
   5594     if (BinOp) {
   5595       // Because the rewriter doesn't allow us to rewrite rewritten code,
   5596       // we need to rewrite the right hand side prior to rewriting the setter.
   5597       DisableReplaceStmt = true;
   5598       // Save the source range. Even if we disable the replacement, the
   5599       // rewritten node will have been inserted into the tree. If the synthesized
   5600       // node is at the 'end', the rewriter will fail. Consider this:
   5601       //    self.errorHandler = handler ? handler :
   5602       //              ^(NSURL *errorURL, NSError *error) { return (BOOL)1; };
   5603       SourceRange SrcRange = BinOp->getSourceRange();
   5604       Stmt *newStmt = RewriteFunctionBodyOrGlobalInitializer(BinOp->getRHS());
   5605       // Need to rewrite the ivar access expression if need be.
   5606       if (isa<ObjCIvarRefExpr>(newStmt)) {
   5607         bool replaced = false;
   5608         newStmt = RewriteObjCNestedIvarRefExpr(newStmt, replaced);
   5609       }
   5610 
   5611       DisableReplaceStmt = false;
   5612       //
   5613       // Unlike the main iterator, we explicily avoid changing 'BinOp'. If
   5614       // we changed the RHS of BinOp, the rewriter would fail (since it needs
   5615       // to see the original expression). Consider this example:
   5616       //
   5617       // Foo *obj1, *obj2;
   5618       //
   5619       // obj1.i = [obj2 rrrr];
   5620       //
   5621       // 'BinOp' for the previous expression looks like:
   5622       //
   5623       // (BinaryOperator 0x231ccf0 'int' '='
   5624       //   (ObjCPropertyRefExpr 0x231cc70 'int' Kind=PropertyRef Property="i"
   5625       //     (DeclRefExpr 0x231cc50 'Foo *' Var='obj1' 0x231cbb0))
   5626       //   (ObjCMessageExpr 0x231ccb0 'int' selector=rrrr
   5627       //     (DeclRefExpr 0x231cc90 'Foo *' Var='obj2' 0x231cbe0)))
   5628       //
   5629       // 'newStmt' represents the rewritten message expression. For example:
   5630       //
   5631       // (CallExpr 0x231d300 'id':'struct objc_object *'
   5632       //   (ParenExpr 0x231d2e0 'int (*)(id, SEL)'
   5633       //     (CStyleCastExpr 0x231d2c0 'int (*)(id, SEL)'
   5634       //       (CStyleCastExpr 0x231d220 'void *'
   5635       //         (DeclRefExpr 0x231d200 'id (id, SEL, ...)' FunctionDecl='objc_msgSend' 0x231cdc0))))
   5636       //
   5637       // Note that 'newStmt' is passed to RewritePropertyOrImplicitSetter so that it
   5638       // can be used as the setter argument. ReplaceStmt() will still 'see'
   5639       // the original RHS (since we haven't altered BinOp).
   5640       //
   5641       // This implies the Rewrite* routines can no longer delete the original
   5642       // node. As a result, we now leak the original AST nodes.
   5643       //
   5644       return RewritePropertyOrImplicitSetter(BinOp, dyn_cast<Expr>(newStmt), SrcRange);
   5645     } else {
   5646       return RewritePropertyOrImplicitGetter(PropOrImplicitRefExpr);
   5647     }
   5648   }
   5649 
   5650   if (ObjCSelectorExpr *AtSelector = dyn_cast<ObjCSelectorExpr>(S))
   5651     return RewriteAtSelector(AtSelector);
   5652 
   5653   if (ObjCStringLiteral *AtString = dyn_cast<ObjCStringLiteral>(S))
   5654     return RewriteObjCStringLiteral(AtString);
   5655 
   5656   if (ObjCMessageExpr *MessExpr = dyn_cast<ObjCMessageExpr>(S)) {
   5657 #if 0
   5658     // Before we rewrite it, put the original message expression in a comment.
   5659     SourceLocation startLoc = MessExpr->getLocStart();
   5660     SourceLocation endLoc = MessExpr->getLocEnd();
   5661 
   5662     const char *startBuf = SM->getCharacterData(startLoc);
   5663     const char *endBuf = SM->getCharacterData(endLoc);
   5664 
   5665     std::string messString;
   5666     messString += "// ";
   5667     messString.append(startBuf, endBuf-startBuf+1);
   5668     messString += "\n";
   5669 
   5670     // FIXME: Missing definition of
   5671     // InsertText(clang::SourceLocation, char const*, unsigned int).
   5672     // InsertText(startLoc, messString.c_str(), messString.size());
   5673     // Tried this, but it didn't work either...
   5674     // ReplaceText(startLoc, 0, messString.c_str(), messString.size());
   5675 #endif
   5676     return RewriteMessageExpr(MessExpr);
   5677   }
   5678 
   5679   if (ObjCAtTryStmt *StmtTry = dyn_cast<ObjCAtTryStmt>(S))
   5680     return RewriteObjCTryStmt(StmtTry);
   5681 
   5682   if (ObjCAtSynchronizedStmt *StmtTry = dyn_cast<ObjCAtSynchronizedStmt>(S))
   5683     return RewriteObjCSynchronizedStmt(StmtTry);
   5684 
   5685   if (ObjCAtThrowStmt *StmtThrow = dyn_cast<ObjCAtThrowStmt>(S))
   5686     return RewriteObjCThrowStmt(StmtThrow);
   5687 
   5688   if (ObjCProtocolExpr *ProtocolExp = dyn_cast<ObjCProtocolExpr>(S))
   5689     return RewriteObjCProtocolExpr(ProtocolExp);
   5690 
   5691   if (ObjCForCollectionStmt *StmtForCollection =
   5692         dyn_cast<ObjCForCollectionStmt>(S))
   5693     return RewriteObjCForCollectionStmt(StmtForCollection,
   5694                                         OrigStmtRange.getEnd());
   5695   if (BreakStmt *StmtBreakStmt =
   5696       dyn_cast<BreakStmt>(S))
   5697     return RewriteBreakStmt(StmtBreakStmt);
   5698   if (ContinueStmt *StmtContinueStmt =
   5699       dyn_cast<ContinueStmt>(S))
   5700     return RewriteContinueStmt(StmtContinueStmt);
   5701 
   5702   // Need to check for protocol refs (id <P>, Foo <P> *) in variable decls
   5703   // and cast exprs.
   5704   if (DeclStmt *DS = dyn_cast<DeclStmt>(S)) {
   5705     // FIXME: What we're doing here is modifying the type-specifier that
   5706     // precedes the first Decl.  In the future the DeclGroup should have
   5707     // a separate type-specifier that we can rewrite.
   5708     // NOTE: We need to avoid rewriting the DeclStmt if it is within
   5709     // the context of an ObjCForCollectionStmt. For example:
   5710     //   NSArray *someArray;
   5711     //   for (id <FooProtocol> index in someArray) ;
   5712     // This is because RewriteObjCForCollectionStmt() does textual rewriting
   5713     // and it depends on the original text locations/positions.
   5714     if (Stmts.empty() || !IsDeclStmtInForeachHeader(DS))
   5715       RewriteObjCQualifiedInterfaceTypes(*DS->decl_begin());
   5716 
   5717     // Blocks rewrite rules.
   5718     for (DeclStmt::decl_iterator DI = DS->decl_begin(), DE = DS->decl_end();
   5719          DI != DE; ++DI) {
   5720       Decl *SD = *DI;
   5721       if (ValueDecl *ND = dyn_cast<ValueDecl>(SD)) {
   5722         if (isTopLevelBlockPointerType(ND->getType()))
   5723           RewriteBlockPointerDecl(ND);
   5724         else if (ND->getType()->isFunctionPointerType())
   5725           CheckFunctionPointerDecl(ND->getType(), ND);
   5726         if (VarDecl *VD = dyn_cast<VarDecl>(SD)) {
   5727           if (VD->hasAttr<BlocksAttr>()) {
   5728             static unsigned uniqueByrefDeclCount = 0;
   5729             assert(!BlockByRefDeclNo.count(ND) &&
   5730               "RewriteFunctionBodyOrGlobalInitializer: Duplicate byref decl");
   5731             BlockByRefDeclNo[ND] = uniqueByrefDeclCount++;
   5732             RewriteByRefVar(VD);
   5733           }
   5734           else
   5735             RewriteTypeOfDecl(VD);
   5736         }
   5737       }
   5738       if (TypedefNameDecl *TD = dyn_cast<TypedefNameDecl>(SD)) {
   5739         if (isTopLevelBlockPointerType(TD->getUnderlyingType()))
   5740           RewriteBlockPointerDecl(TD);
   5741         else if (TD->getUnderlyingType()->isFunctionPointerType())
   5742           CheckFunctionPointerDecl(TD->getUnderlyingType(), TD);
   5743       }
   5744     }
   5745   }
   5746 
   5747   if (CStyleCastExpr *CE = dyn_cast<CStyleCastExpr>(S))
   5748     RewriteObjCQualifiedInterfaceTypes(CE);
   5749 
   5750   if (isa<SwitchStmt>(S) || isa<WhileStmt>(S) ||
   5751       isa<DoStmt>(S) || isa<ForStmt>(S)) {
   5752     assert(!Stmts.empty() && "Statement stack is empty");
   5753     assert ((isa<SwitchStmt>(Stmts.back()) || isa<WhileStmt>(Stmts.back()) ||
   5754              isa<DoStmt>(Stmts.back()) || isa<ForStmt>(Stmts.back()))
   5755             && "Statement stack mismatch");
   5756     Stmts.pop_back();
   5757   }
   5758   // Handle blocks rewriting.
   5759   if (BlockDeclRefExpr *BDRE = dyn_cast<BlockDeclRefExpr>(S)) {
   5760     if (BDRE->isByRef())
   5761       return RewriteBlockDeclRefExpr(BDRE);
   5762   }
   5763   if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(S)) {
   5764     ValueDecl *VD = DRE->getDecl();
   5765     if (VD->hasAttr<BlocksAttr>())
   5766       return RewriteBlockDeclRefExpr(DRE);
   5767     if (HasLocalVariableExternalStorage(VD))
   5768       return RewriteLocalVariableExternalStorage(DRE);
   5769   }
   5770 
   5771   if (CallExpr *CE = dyn_cast<CallExpr>(S)) {
   5772     if (CE->getCallee()->getType()->isBlockPointerType()) {
   5773       Stmt *BlockCall = SynthesizeBlockCall(CE, CE->getCallee());
   5774       ReplaceStmt(S, BlockCall);
   5775       return BlockCall;
   5776     }
   5777   }
   5778   if (CStyleCastExpr *CE = dyn_cast<CStyleCastExpr>(S)) {
   5779     RewriteCastExpr(CE);
   5780   }
   5781 #if 0
   5782   if (ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(S)) {
   5783     CastExpr *Replacement = new (Context) CastExpr(ICE->getType(),
   5784                                                    ICE->getSubExpr(),
   5785                                                    SourceLocation());
   5786     // Get the new text.
   5787     std::string SStr;
   5788     llvm::raw_string_ostream Buf(SStr);
   5789     Replacement->printPretty(Buf, *Context);
   5790     const std::string &Str = Buf.str();
   5791 
   5792     printf("CAST = %s\n", &Str[0]);
   5793     InsertText(ICE->getSubExpr()->getLocStart(), &Str[0], Str.size());
   5794     delete S;
   5795     return Replacement;
   5796   }
   5797 #endif
   5798   // Return this stmt unmodified.
   5799   return S;
   5800 }
   5801 
   5802 void RewriteObjC::RewriteRecordBody(RecordDecl *RD) {
   5803   for (RecordDecl::field_iterator i = RD->field_begin(),
   5804                                   e = RD->field_end(); i != e; ++i) {
   5805     FieldDecl *FD = *i;
   5806     if (isTopLevelBlockPointerType(FD->getType()))
   5807       RewriteBlockPointerDecl(FD);
   5808     if (FD->getType()->isObjCQualifiedIdType() ||
   5809         FD->getType()->isObjCQualifiedInterfaceType())
   5810       RewriteObjCQualifiedInterfaceTypes(FD);
   5811   }
   5812 }
   5813 
   5814 /// HandleDeclInMainFile - This is called for each top-level decl defined in the
   5815 /// main file of the input.
   5816 void RewriteObjC::HandleDeclInMainFile(Decl *D) {
   5817   if (FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) {
   5818     if (FD->isOverloadedOperator())
   5819       return;
   5820 
   5821     // Since function prototypes don't have ParmDecl's, we check the function
   5822     // prototype. This enables us to rewrite function declarations and
   5823     // definitions using the same code.
   5824     RewriteBlocksInFunctionProtoType(FD->getType(), FD);
   5825 
   5826     // FIXME: If this should support Obj-C++, support CXXTryStmt
   5827     if (CompoundStmt *Body = dyn_cast_or_null<CompoundStmt>(FD->getBody())) {
   5828       CurFunctionDef = FD;
   5829       CurFunctionDeclToDeclareForBlock = FD;
   5830       CollectPropertySetters(Body);
   5831       CurrentBody = Body;
   5832       Body =
   5833        cast_or_null<CompoundStmt>(RewriteFunctionBodyOrGlobalInitializer(Body));
   5834       FD->setBody(Body);
   5835       CurrentBody = 0;
   5836       if (PropParentMap) {
   5837         delete PropParentMap;
   5838         PropParentMap = 0;
   5839       }
   5840       // This synthesizes and inserts the block "impl" struct, invoke function,
   5841       // and any copy/dispose helper functions.
   5842       InsertBlockLiteralsWithinFunction(FD);
   5843       CurFunctionDef = 0;
   5844       CurFunctionDeclToDeclareForBlock = 0;
   5845     }
   5846     return;
   5847   }
   5848   if (ObjCMethodDecl *MD = dyn_cast<ObjCMethodDecl>(D)) {
   5849     if (CompoundStmt *Body = MD->getCompoundBody()) {
   5850       CurMethodDef = MD;
   5851       CollectPropertySetters(Body);
   5852       CurrentBody = Body;
   5853       Body =
   5854        cast_or_null<CompoundStmt>(RewriteFunctionBodyOrGlobalInitializer(Body));
   5855       MD->setBody(Body);
   5856       CurrentBody = 0;
   5857       if (PropParentMap) {
   5858         delete PropParentMap;
   5859         PropParentMap = 0;
   5860       }
   5861       InsertBlockLiteralsWithinMethod(MD);
   5862       CurMethodDef = 0;
   5863     }
   5864   }
   5865   if (ObjCImplementationDecl *CI = dyn_cast<ObjCImplementationDecl>(D))
   5866     ClassImplementation.push_back(CI);
   5867   else if (ObjCCategoryImplDecl *CI = dyn_cast<ObjCCategoryImplDecl>(D))
   5868     CategoryImplementation.push_back(CI);
   5869   else if (ObjCClassDecl *CD = dyn_cast<ObjCClassDecl>(D))
   5870     RewriteForwardClassDecl(CD);
   5871   else if (VarDecl *VD = dyn_cast<VarDecl>(D)) {
   5872     RewriteObjCQualifiedInterfaceTypes(VD);
   5873     if (isTopLevelBlockPointerType(VD->getType()))
   5874       RewriteBlockPointerDecl(VD);
   5875     else if (VD->getType()->isFunctionPointerType()) {
   5876       CheckFunctionPointerDecl(VD->getType(), VD);
   5877       if (VD->getInit()) {
   5878         if (CStyleCastExpr *CE = dyn_cast<CStyleCastExpr>(VD->getInit())) {
   5879           RewriteCastExpr(CE);
   5880         }
   5881       }
   5882     } else if (VD->getType()->isRecordType()) {
   5883       RecordDecl *RD = VD->getType()->getAs<RecordType>()->getDecl();
   5884       if (RD->isDefinition())
   5885         RewriteRecordBody(RD);
   5886     }
   5887     if (VD->getInit()) {
   5888       GlobalVarDecl = VD;
   5889       CollectPropertySetters(VD->getInit());
   5890       CurrentBody = VD->getInit();
   5891       RewriteFunctionBodyOrGlobalInitializer(VD->getInit());
   5892       CurrentBody = 0;
   5893       if (PropParentMap) {
   5894         delete PropParentMap;
   5895         PropParentMap = 0;
   5896       }
   5897       SynthesizeBlockLiterals(VD->getTypeSpecStartLoc(),
   5898                               VD->getName());
   5899       GlobalVarDecl = 0;
   5900 
   5901       // This is needed for blocks.
   5902       if (CStyleCastExpr *CE = dyn_cast<CStyleCastExpr>(VD->getInit())) {
   5903         RewriteCastExpr(CE);
   5904       }
   5905     }
   5906     return;
   5907   }
   5908   if (TypedefNameDecl *TD = dyn_cast<TypedefNameDecl>(D)) {
   5909     if (isTopLevelBlockPointerType(TD->getUnderlyingType()))
   5910       RewriteBlockPointerDecl(TD);
   5911     else if (TD->getUnderlyingType()->isFunctionPointerType())
   5912       CheckFunctionPointerDecl(TD->getUnderlyingType(), TD);
   5913     return;
   5914   }
   5915   if (RecordDecl *RD = dyn_cast<RecordDecl>(D)) {
   5916     if (RD->isDefinition())
   5917       RewriteRecordBody(RD);
   5918     return;
   5919   }
   5920   // Nothing yet.
   5921 }
   5922 
   5923 void RewriteObjC::HandleTranslationUnit(ASTContext &C) {
   5924   if (Diags.hasErrorOccurred())
   5925     return;
   5926 
   5927   RewriteInclude();
   5928 
   5929   // Here's a great place to add any extra declarations that may be needed.
   5930   // Write out meta data for each @protocol(<expr>).
   5931   for (llvm::SmallPtrSet<ObjCProtocolDecl *,8>::iterator I = ProtocolExprDecls.begin(),
   5932        E = ProtocolExprDecls.end(); I != E; ++I)
   5933     RewriteObjCProtocolMetaData(*I, "", "", Preamble);
   5934 
   5935   InsertText(SM->getLocForStartOfFile(MainFileID), Preamble, false);
   5936   if (ClassImplementation.size() || CategoryImplementation.size())
   5937     RewriteImplementations();
   5938 
   5939   // Get the buffer corresponding to MainFileID.  If we haven't changed it, then
   5940   // we are done.
   5941   if (const RewriteBuffer *RewriteBuf =
   5942       Rewrite.getRewriteBufferFor(MainFileID)) {
   5943     //printf("Changed:\n");
   5944     *OutFile << std::string(RewriteBuf->begin(), RewriteBuf->end());
   5945   } else {
   5946     llvm::errs() << "No changes\n";
   5947   }
   5948 
   5949   if (ClassImplementation.size() || CategoryImplementation.size() ||
   5950       ProtocolExprDecls.size()) {
   5951     // Rewrite Objective-c meta data*
   5952     std::string ResultStr;
   5953     SynthesizeMetaDataIntoBuffer(ResultStr);
   5954     // Emit metadata.
   5955     *OutFile << ResultStr;
   5956   }
   5957   OutFile->flush();
   5958 }
   5959