diff options
author | John McCall <rjmccall@apple.com> | 2011-06-15 23:25:17 +0000 |
---|---|---|
committer | John McCall <rjmccall@apple.com> | 2011-06-15 23:25:17 +0000 |
commit | d70fb9812adbfa133be0c4348faa014c4f53f1c5 (patch) | |
tree | e958f99ebbd6548f7e4c242202643f3f986c36c7 /clang/lib/Frontend | |
parent | 31168b077c3687bb79985102b08718cd77db353d (diff) | |
download | bcm5719-llvm-d70fb9812adbfa133be0c4348faa014c4f53f1c5.tar.gz bcm5719-llvm-d70fb9812adbfa133be0c4348faa014c4f53f1c5.zip |
The ARC Migration Tool. All the credit goes to Argyrios and Fariborz
for this.
llvm-svn: 133104
Diffstat (limited to 'clang/lib/Frontend')
-rw-r--r-- | clang/lib/Frontend/CMakeLists.txt | 1 | ||||
-rw-r--r-- | clang/lib/Frontend/CompilerInstance.cpp | 29 | ||||
-rw-r--r-- | clang/lib/Frontend/CompilerInvocation.cpp | 32 |
3 files changed, 62 insertions, 0 deletions
diff --git a/clang/lib/Frontend/CMakeLists.txt b/clang/lib/Frontend/CMakeLists.txt index 7dcbebff39b..5565b7b4a85 100644 --- a/clang/lib/Frontend/CMakeLists.txt +++ b/clang/lib/Frontend/CMakeLists.txt @@ -1,4 +1,5 @@ set( LLVM_USED_LIBS + clangARCMigrate clangAST clangBasic clangDriver diff --git a/clang/lib/Frontend/CompilerInstance.cpp b/clang/lib/Frontend/CompilerInstance.cpp index 38fcfe3c471..b05c24a9851 100644 --- a/clang/lib/Frontend/CompilerInstance.cpp +++ b/clang/lib/Frontend/CompilerInstance.cpp @@ -26,6 +26,7 @@ #include "clang/Frontend/TextDiagnosticPrinter.h" #include "clang/Frontend/VerifyDiagnosticsClient.h" #include "clang/Frontend/Utils.h" +#include "clang/ARCMigrate/ARCMT.h" #include "clang/Serialization/ASTReader.h" #include "clang/Sema/CodeCompleteConsumer.h" #include "llvm/Support/FileSystem.h" @@ -596,6 +597,34 @@ bool CompilerInstance::ExecuteAction(FrontendAction &Act) { if (hasSourceManager()) getSourceManager().clearIDTables(); + switch (getFrontendOpts().ARCMTAction) { + default: + break; + + case FrontendOptions::ARCMT_Check: + if (arcmt::checkForManualIssues(getInvocation(), InFile, + getFrontendOpts().Inputs[i].first, + getDiagnostics().getClient())) + continue; + // We only want to see warnings reported from arcmt::checkForManualIssues. + getDiagnostics().setIgnoreAllWarnings(true); + break; + + case FrontendOptions::ARCMT_Modify: + if (arcmt::applyTransformations(getInvocation(), InFile, + getFrontendOpts().Inputs[i].first, + getDiagnostics().getClient())) + continue; + break; + + case FrontendOptions::ARCMT_ModifyInMemory: + if (arcmt::applyTransformationsInMemory(getInvocation(), InFile, + getFrontendOpts().Inputs[i].first, + getDiagnostics().getClient())) + continue; + break; + } + if (Act.BeginSourceFile(*this, InFile, getFrontendOpts().Inputs[i].first)) { Act.Execute(); Act.EndSourceFile(); diff --git a/clang/lib/Frontend/CompilerInvocation.cpp b/clang/lib/Frontend/CompilerInvocation.cpp index 1324926f94e..2c158fb1e4c 100644 --- a/clang/lib/Frontend/CompilerInvocation.cpp +++ b/clang/lib/Frontend/CompilerInvocation.cpp @@ -415,6 +415,19 @@ static void FrontendOptsToArgs(const FrontendOptions &Opts, Res.push_back("-version"); if (Opts.FixWhatYouCan) Res.push_back("-fix-what-you-can"); + switch (Opts.ARCMTAction) { + case FrontendOptions::ARCMT_None: + break; + case FrontendOptions::ARCMT_Check: + Res.push_back("-arcmt-check"); + break; + case FrontendOptions::ARCMT_Modify: + Res.push_back("-arcmt-modify"); + break; + case FrontendOptions::ARCMT_ModifyInMemory: + Res.push_back("-arcmt-modify-in-memory"); + break; + } bool NeedLang = false; for (unsigned i = 0, e = Opts.Inputs.size(); i != e; ++i) @@ -1227,6 +1240,25 @@ static InputKind ParseFrontendArgs(FrontendOptions &Opts, ArgList &Args, Opts.FixWhatYouCan = Args.hasArg(OPT_fix_what_you_can); Opts.Modules = Args.getAllArgValues(OPT_import_module); + Opts.ARCMTAction = FrontendOptions::ARCMT_None; + if (const Arg *A = Args.getLastArg(OPT_arcmt_check, + OPT_arcmt_modify, + OPT_arcmt_modify_in_memory)) { + switch (A->getOption().getID()) { + default: + llvm_unreachable("missed a case"); + case OPT_arcmt_check: + Opts.ARCMTAction = FrontendOptions::ARCMT_Check; + break; + case OPT_arcmt_modify: + Opts.ARCMTAction = FrontendOptions::ARCMT_Modify; + break; + case OPT_arcmt_modify_in_memory: + Opts.ARCMTAction = FrontendOptions::ARCMT_ModifyInMemory; + break; + } + } + InputKind DashX = IK_None; if (const Arg *A = Args.getLastArg(OPT_x)) { DashX = llvm::StringSwitch<InputKind>(A->getValue(Args)) |