TransGCCalls.cpp revision e0ac7454bae910ab3d67a92f6e2e5046d3bb8c1a
1e0ac7454bae910ab3d67a92f6e2e5046d3bb8c1aArgyrios Kyrtzidis//===--- TransGCCalls.cpp - Tranformations to ARC mode --------------------===// 2e0ac7454bae910ab3d67a92f6e2e5046d3bb8c1aArgyrios Kyrtzidis// 3e0ac7454bae910ab3d67a92f6e2e5046d3bb8c1aArgyrios Kyrtzidis// The LLVM Compiler Infrastructure 4e0ac7454bae910ab3d67a92f6e2e5046d3bb8c1aArgyrios Kyrtzidis// 5e0ac7454bae910ab3d67a92f6e2e5046d3bb8c1aArgyrios Kyrtzidis// This file is distributed under the University of Illinois Open Source 6e0ac7454bae910ab3d67a92f6e2e5046d3bb8c1aArgyrios Kyrtzidis// License. See LICENSE.TXT for details. 7e0ac7454bae910ab3d67a92f6e2e5046d3bb8c1aArgyrios Kyrtzidis// 8e0ac7454bae910ab3d67a92f6e2e5046d3bb8c1aArgyrios Kyrtzidis//===----------------------------------------------------------------------===// 9e0ac7454bae910ab3d67a92f6e2e5046d3bb8c1aArgyrios Kyrtzidis 10e0ac7454bae910ab3d67a92f6e2e5046d3bb8c1aArgyrios Kyrtzidis#include "Transforms.h" 11e0ac7454bae910ab3d67a92f6e2e5046d3bb8c1aArgyrios Kyrtzidis#include "Internals.h" 12e0ac7454bae910ab3d67a92f6e2e5046d3bb8c1aArgyrios Kyrtzidis#include "clang/Sema/SemaDiagnostic.h" 13e0ac7454bae910ab3d67a92f6e2e5046d3bb8c1aArgyrios Kyrtzidis 14e0ac7454bae910ab3d67a92f6e2e5046d3bb8c1aArgyrios Kyrtzidisusing namespace clang; 15e0ac7454bae910ab3d67a92f6e2e5046d3bb8c1aArgyrios Kyrtzidisusing namespace arcmt; 16e0ac7454bae910ab3d67a92f6e2e5046d3bb8c1aArgyrios Kyrtzidisusing namespace trans; 17e0ac7454bae910ab3d67a92f6e2e5046d3bb8c1aArgyrios Kyrtzidis 18e0ac7454bae910ab3d67a92f6e2e5046d3bb8c1aArgyrios Kyrtzidisnamespace { 19e0ac7454bae910ab3d67a92f6e2e5046d3bb8c1aArgyrios Kyrtzidis 20e0ac7454bae910ab3d67a92f6e2e5046d3bb8c1aArgyrios Kyrtzidisclass GCCollectableCallsChecker : 21e0ac7454bae910ab3d67a92f6e2e5046d3bb8c1aArgyrios Kyrtzidis public RecursiveASTVisitor<GCCollectableCallsChecker> { 22e0ac7454bae910ab3d67a92f6e2e5046d3bb8c1aArgyrios Kyrtzidis MigrationContext &MigrateCtx; 23e0ac7454bae910ab3d67a92f6e2e5046d3bb8c1aArgyrios Kyrtzidis ParentMap &PMap; 24e0ac7454bae910ab3d67a92f6e2e5046d3bb8c1aArgyrios Kyrtzidis IdentifierInfo *NSMakeCollectableII; 25e0ac7454bae910ab3d67a92f6e2e5046d3bb8c1aArgyrios Kyrtzidis 26e0ac7454bae910ab3d67a92f6e2e5046d3bb8c1aArgyrios Kyrtzidispublic: 27e0ac7454bae910ab3d67a92f6e2e5046d3bb8c1aArgyrios Kyrtzidis GCCollectableCallsChecker(MigrationContext &ctx, ParentMap &map) 28e0ac7454bae910ab3d67a92f6e2e5046d3bb8c1aArgyrios Kyrtzidis : MigrateCtx(ctx), PMap(map) { 29e0ac7454bae910ab3d67a92f6e2e5046d3bb8c1aArgyrios Kyrtzidis NSMakeCollectableII = 30e0ac7454bae910ab3d67a92f6e2e5046d3bb8c1aArgyrios Kyrtzidis &MigrateCtx.getPass().Ctx.Idents.get("NSMakeCollectable"); 31e0ac7454bae910ab3d67a92f6e2e5046d3bb8c1aArgyrios Kyrtzidis } 32e0ac7454bae910ab3d67a92f6e2e5046d3bb8c1aArgyrios Kyrtzidis 33e0ac7454bae910ab3d67a92f6e2e5046d3bb8c1aArgyrios Kyrtzidis bool VisitCallExpr(CallExpr *E) { 34e0ac7454bae910ab3d67a92f6e2e5046d3bb8c1aArgyrios Kyrtzidis Expr *CEE = E->getCallee()->IgnoreParenImpCasts(); 35e0ac7454bae910ab3d67a92f6e2e5046d3bb8c1aArgyrios Kyrtzidis if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(CEE)) { 36e0ac7454bae910ab3d67a92f6e2e5046d3bb8c1aArgyrios Kyrtzidis if (FunctionDecl *FD = dyn_cast_or_null<FunctionDecl>(DRE->getDecl())) { 37e0ac7454bae910ab3d67a92f6e2e5046d3bb8c1aArgyrios Kyrtzidis if (FD->getDeclContext()->getRedeclContext()->isFileContext() && 38e0ac7454bae910ab3d67a92f6e2e5046d3bb8c1aArgyrios Kyrtzidis FD->getIdentifier() == NSMakeCollectableII) { 39e0ac7454bae910ab3d67a92f6e2e5046d3bb8c1aArgyrios Kyrtzidis TransformActions &TA = MigrateCtx.getPass().TA; 40e0ac7454bae910ab3d67a92f6e2e5046d3bb8c1aArgyrios Kyrtzidis Transaction Trans(TA); 41e0ac7454bae910ab3d67a92f6e2e5046d3bb8c1aArgyrios Kyrtzidis TA.clearDiagnostic(diag::err_unavailable, 42e0ac7454bae910ab3d67a92f6e2e5046d3bb8c1aArgyrios Kyrtzidis diag::err_unavailable_message, 43e0ac7454bae910ab3d67a92f6e2e5046d3bb8c1aArgyrios Kyrtzidis DRE->getSourceRange()); 44e0ac7454bae910ab3d67a92f6e2e5046d3bb8c1aArgyrios Kyrtzidis TA.replace(DRE->getSourceRange(), "CFBridgingRelease"); 45e0ac7454bae910ab3d67a92f6e2e5046d3bb8c1aArgyrios Kyrtzidis } 46e0ac7454bae910ab3d67a92f6e2e5046d3bb8c1aArgyrios Kyrtzidis } 47e0ac7454bae910ab3d67a92f6e2e5046d3bb8c1aArgyrios Kyrtzidis } 48e0ac7454bae910ab3d67a92f6e2e5046d3bb8c1aArgyrios Kyrtzidis 49e0ac7454bae910ab3d67a92f6e2e5046d3bb8c1aArgyrios Kyrtzidis return true; 50e0ac7454bae910ab3d67a92f6e2e5046d3bb8c1aArgyrios Kyrtzidis } 51e0ac7454bae910ab3d67a92f6e2e5046d3bb8c1aArgyrios Kyrtzidis}; 52e0ac7454bae910ab3d67a92f6e2e5046d3bb8c1aArgyrios Kyrtzidis 53e0ac7454bae910ab3d67a92f6e2e5046d3bb8c1aArgyrios Kyrtzidis} // anonymous namespace 54e0ac7454bae910ab3d67a92f6e2e5046d3bb8c1aArgyrios Kyrtzidis 55e0ac7454bae910ab3d67a92f6e2e5046d3bb8c1aArgyrios Kyrtzidisvoid GCCollectableCallsTraverser::traverseBody(BodyContext &BodyCtx) { 56e0ac7454bae910ab3d67a92f6e2e5046d3bb8c1aArgyrios Kyrtzidis GCCollectableCallsChecker(BodyCtx.getMigrationContext(), 57e0ac7454bae910ab3d67a92f6e2e5046d3bb8c1aArgyrios Kyrtzidis BodyCtx.getParentMap()) 58e0ac7454bae910ab3d67a92f6e2e5046d3bb8c1aArgyrios Kyrtzidis .TraverseStmt(BodyCtx.getTopStmt()); 59e0ac7454bae910ab3d67a92f6e2e5046d3bb8c1aArgyrios Kyrtzidis} 60