aboutsummaryrefslogtreecommitdiff
path: root/lib/ARCMigrate/TransAllocCopyWithZone.cpp
diff options
context:
space:
mode:
authorArgyrios Kyrtzidis <akyrtzi@gmail.com>2011-06-23 21:21:28 +0000
committerArgyrios Kyrtzidis <akyrtzi@gmail.com>2011-06-23 21:21:28 +0000
commit7707c75ff98e26aa939557e3bf80490556c00ae4 (patch)
treeade3b2962c7976d6a8fb24e9f890e9fb588c27ca /lib/ARCMigrate/TransAllocCopyWithZone.cpp
parent7b3f853c6f684c1df423e994482681844c396342 (diff)
[arcmt] Remove rewriteAllocCopyWithZone transformation; not needed anymore.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@133762 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/ARCMigrate/TransAllocCopyWithZone.cpp')
-rw-r--r--lib/ARCMigrate/TransAllocCopyWithZone.cpp223
1 files changed, 0 insertions, 223 deletions
diff --git a/lib/ARCMigrate/TransAllocCopyWithZone.cpp b/lib/ARCMigrate/TransAllocCopyWithZone.cpp
deleted file mode 100644
index da7f25d0ea..0000000000
--- a/lib/ARCMigrate/TransAllocCopyWithZone.cpp
+++ /dev/null
@@ -1,223 +0,0 @@
-//===--- TransAllocCopyWithZone.cpp - Tranformations to ARC mode ----------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-//
-// rewriteAllocCopyWithZone:
-//
-// Calls to +allocWithZone/-copyWithZone/-mutableCopyWithZone are changed to
-// +alloc/-copy/-mutableCopy if we can safely remove the given parameter.
-//
-// Foo *foo1 = [[Foo allocWithZone:[self zone]] init];
-// ---->
-// Foo *foo1 = [[Foo alloc] init];
-//
-//===----------------------------------------------------------------------===//
-
-#include "Transforms.h"
-#include "Internals.h"
-#include "clang/Sema/SemaDiagnostic.h"
-
-using namespace clang;
-using namespace arcmt;
-using namespace trans;
-using llvm::StringRef;
-
-namespace {
-
-class AllocCopyWithZoneRewriter :
- public RecursiveASTVisitor<AllocCopyWithZoneRewriter> {
- Decl *Dcl;
- Stmt *Body;
- MigrationPass &Pass;
-
- Selector allocWithZoneSel;
- Selector copyWithZoneSel;
- Selector mutableCopyWithZoneSel;
- Selector zoneSel;
- IdentifierInfo *NSZoneII;
-
- std::vector<DeclStmt *> NSZoneVars;
- std::vector<Expr *> Removals;
-
-public:
- AllocCopyWithZoneRewriter(Decl *D, MigrationPass &pass)
- : Dcl(D), Body(0), Pass(pass) {
- SelectorTable &sels = pass.Ctx.Selectors;
- IdentifierTable &ids = pass.Ctx.Idents;
- allocWithZoneSel = sels.getUnarySelector(&ids.get("allocWithZone"));
- copyWithZoneSel = sels.getUnarySelector(&ids.get("copyWithZone"));
- mutableCopyWithZoneSel = sels.getUnarySelector(
- &ids.get("mutableCopyWithZone"));
- zoneSel = sels.getNullarySelector(&ids.get("zone"));
- NSZoneII = &ids.get("_NSZone");
- }
-
- void transformBody(Stmt *body) {
- Body = body;
- // Don't change allocWithZone/copyWithZone messages inside
- // custom implementations of such methods, it can lead to infinite loops.
- if (ObjCMethodDecl *MD = dyn_cast<ObjCMethodDecl>(Dcl)) {
- Selector sel = MD->getSelector();
- if (sel == allocWithZoneSel ||
- sel == copyWithZoneSel ||
- sel == mutableCopyWithZoneSel ||
- sel == zoneSel)
- return;
- }
-
- TraverseStmt(body);
- }
-
- ~AllocCopyWithZoneRewriter() {
- for (std::vector<DeclStmt *>::reverse_iterator
- I = NSZoneVars.rbegin(), E = NSZoneVars.rend(); I != E; ++I) {
- DeclStmt *DS = *I;
- DeclGroupRef group = DS->getDeclGroup();
- std::vector<Expr *> varRemovals = Removals;
-
- bool areAllVarsUnused = true;
- for (std::reverse_iterator<DeclGroupRef::iterator>
- DI(group.end()), DE(group.begin()); DI != DE; ++DI) {
- VarDecl *VD = cast<VarDecl>(*DI);
- if (isNSZoneVarUsed(VD, varRemovals)) {
- areAllVarsUnused = false;
- break;
- }
- varRemovals.push_back(VD->getInit());
- }
-
- if (areAllVarsUnused) {
- Transaction Trans(Pass.TA);
- clearUnavailableDiags(DS);
- Pass.TA.removeStmt(DS);
- Removals.swap(varRemovals);
- }
- }
- }
-
- bool VisitObjCMessageExpr(ObjCMessageExpr *E) {
- if (!isAllocCopyWithZoneCall(E))
- return true;
- Expr *arg = E->getArg(0);
- if (paramToAllocWithZoneHasSideEffects(arg))
- return true;
-
- Pass.TA.startTransaction();
-
- clearUnavailableDiags(arg);
- Pass.TA.clearDiagnostic(diag::err_unavailable_message,
- E->getReceiverRange().getBegin());
-
- Pass.TA.remove(SourceRange(E->getSelectorLoc(), arg->getLocEnd()));
- StringRef rewrite;
- if (E->getSelector() == allocWithZoneSel)
- rewrite = "alloc";
- else if (E->getSelector() == copyWithZoneSel)
- rewrite = "copy";
- else {
- assert(E->getSelector() == mutableCopyWithZoneSel);
- rewrite = "mutableCopy";
- }
- Pass.TA.insert(E->getSelectorLoc(), rewrite);
-
- bool failed = Pass.TA.commitTransaction();
- if (!failed)
- Removals.push_back(arg);
-
- return true;
- }
-
- bool VisitDeclStmt(DeclStmt *DS) {
- DeclGroupRef group = DS->getDeclGroup();
- if (group.begin() == group.end())
- return true;
- for (DeclGroupRef::iterator
- DI = group.begin(), DE = group.end(); DI != DE; ++DI)
- if (!isRemovableNSZoneVar(*DI))
- return true;
-
- NSZoneVars.push_back(DS);
- return true;
- }
-
-private:
- bool isRemovableNSZoneVar(Decl *D) {
- if (VarDecl *VD = dyn_cast<VarDecl>(D)) {
- if (isNSZone(VD->getType()))
- return !paramToAllocWithZoneHasSideEffects(VD->getInit());
- }
- return false;
- }
-
- bool isNSZone(RecordDecl *RD) {
- return RD && RD->getIdentifier() == NSZoneII;
- }
-
- bool isNSZone(QualType Ty) {
- QualType pointee = Ty->getPointeeType();
- if (pointee.isNull())
- return false;
- if (const RecordType *recT = pointee->getAsStructureType())
- return isNSZone(recT->getDecl());
- return false;
- }
-
- bool isNSZoneVarUsed(VarDecl *D, std::vector<Expr *> &removals) {
- ExprSet refs;
- collectRefs(D, Body, refs);
- clearRefsIn(removals.begin(), removals.end(), refs);
-
- return !refs.empty();
- }
-
- bool isAllocCopyWithZoneCall(ObjCMessageExpr *E) {
- if (E->getNumArgs() == 1 &&
- E->getSelector() == allocWithZoneSel &&
- (E->isClassMessage() ||
- Pass.TA.hasDiagnostic(diag::err_unavailable_message,
- E->getReceiverRange().getBegin())))
- return true;
-
- return E->isInstanceMessage() &&
- E->getNumArgs() == 1 &&
- (E->getSelector() == copyWithZoneSel ||
- E->getSelector() == mutableCopyWithZoneSel);
- }
-
- bool isZoneCall(ObjCMessageExpr *E) {
- return E->isInstanceMessage() &&
- E->getNumArgs() == 0 &&
- E->getSelector() == zoneSel;
- }
-
- bool paramToAllocWithZoneHasSideEffects(Expr *E) {
- if (!hasSideEffects(E, Pass.Ctx))
- return false;
- E = E->IgnoreParenCasts();
- ObjCMessageExpr *ME = dyn_cast<ObjCMessageExpr>(E);
- if (!ME)
- return true;
- if (!isZoneCall(ME))
- return true;
- return hasSideEffects(ME->getInstanceReceiver(), Pass.Ctx);
- }
-
- void clearUnavailableDiags(Stmt *S) {
- if (S)
- Pass.TA.clearDiagnostic(diag::err_unavailable,
- diag::err_unavailable_message,
- S->getSourceRange());
- }
-};
-
-} // end anonymous namespace
-
-void trans::rewriteAllocCopyWithZone(MigrationPass &pass) {
- BodyTransform<AllocCopyWithZoneRewriter> trans(pass);
- trans.TraverseDecl(pass.Ctx.getTranslationUnitDecl());
-}