summaryrefslogtreecommitdiffstats
path: root/clang/lib/Frontend
diff options
context:
space:
mode:
authorJohn McCall <rjmccall@apple.com>2011-06-15 23:25:17 +0000
committerJohn McCall <rjmccall@apple.com>2011-06-15 23:25:17 +0000
commitd70fb9812adbfa133be0c4348faa014c4f53f1c5 (patch)
treee958f99ebbd6548f7e4c242202643f3f986c36c7 /clang/lib/Frontend
parent31168b077c3687bb79985102b08718cd77db353d (diff)
downloadbcm5719-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.txt1
-rw-r--r--clang/lib/Frontend/CompilerInstance.cpp29
-rw-r--r--clang/lib/Frontend/CompilerInvocation.cpp32
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))
OpenPOWER on IntegriCloud