diff --git a/include/clang/Driver/CC1Options.td b/include/clang/Driver/CC1Options.td index 86457d9e7842f82753b3677bbea34afcb6b724f3..1125ddd60339d25d83d276d0cca95d110a88166e 100644 --- a/include/clang/Driver/CC1Options.td +++ b/include/clang/Driver/CC1Options.td @@ -106,6 +106,9 @@ def analyzer_checker_help : Flag<"-analyzer-checker-help">, def migrator_no_nsalloc_error : Flag<"-no-ns-alloc-error">, HelpText<"Do not error on use of NSAllocateCollectable/NSReallocateCollectable">; +def migrator_no_finalize_removal : Flag<"-no-finalize-removal">, + HelpText<"Do not remove finalize method in gc mode">; + //===----------------------------------------------------------------------===// // CodeGen Options //===----------------------------------------------------------------------===// diff --git a/include/clang/Frontend/MigratorOptions.h b/include/clang/Frontend/MigratorOptions.h index 23263d7aa039511554873b9717ffd307c3d33865..f9554e4a61fd71cb9a199e93d4fe1f24827c2346 100644 --- a/include/clang/Frontend/MigratorOptions.h +++ b/include/clang/Frontend/MigratorOptions.h @@ -20,8 +20,10 @@ namespace clang { class MigratorOptions { public: unsigned NoNSAllocReallocError : 1; + unsigned NoFinalizeRemoval : 1; MigratorOptions() { NoNSAllocReallocError = 0; + NoFinalizeRemoval = 0; } }; diff --git a/lib/ARCMigrate/ARCMT.cpp b/lib/ARCMigrate/ARCMT.cpp index 09752f0d612c8a0dc26985e366e50abe72614553..cd4835ef3915feb33aef4dfe81f7a4c36a96f3f6 100644 --- a/lib/ARCMigrate/ARCMT.cpp +++ b/lib/ARCMigrate/ARCMT.cpp @@ -230,6 +230,7 @@ bool arcmt::checkForManualIssues(CompilerInvocation &origCI, LangOptions::GCMode OrigGCMode = origCI.getLangOpts()->getGC(); bool NoNSAllocReallocError = origCI.getMigratorOpts().NoNSAllocReallocError; + bool NoFinalizeRemoval = origCI.getMigratorOpts().NoFinalizeRemoval; std::vector<TransformFn> transforms = arcmt::getAllTransformations(OrigGCMode); assert(!transforms.empty()); @@ -294,6 +295,7 @@ bool arcmt::checkForManualIssues(CompilerInvocation &origCI, TransformActions testAct(*Diags, capturedDiags, Ctx, Unit->getPreprocessor()); MigrationPass pass(Ctx, OrigGCMode, Unit->getSema(), testAct, ARCMTMacroLocs); pass.setNSAllocReallocError(NoNSAllocReallocError); + pass.setNoFinalizeRemoval(NoFinalizeRemoval); for (unsigned i=0, e = transforms.size(); i != e; ++i) transforms[i](pass); diff --git a/lib/ARCMigrate/Internals.h b/lib/ARCMigrate/Internals.h index 78bf341fe6b33f4c09e881cdda708a10fafe6be0..59177c483ea0c1b73de6c63fe97ebd0a443d6387 100644 --- a/lib/ARCMigrate/Internals.h +++ b/lib/ARCMigrate/Internals.h @@ -155,6 +155,8 @@ public: bool isGCMigration() const { return OrigGCMode != LangOptions::NonGC; } bool noNSAllocReallocError() const { return MigOptions.NoNSAllocReallocError; } void setNSAllocReallocError(bool val) { MigOptions.NoNSAllocReallocError = val; } + bool noFinalizeRemoval() const { return MigOptions.NoFinalizeRemoval; } + void setNoFinalizeRemoval(bool val) {MigOptions.NoFinalizeRemoval = val; } }; static inline StringRef getARCMTMacroName() {