diff options
author | Pavel Labath <labath@google.com> | 2013-06-05 16:23:30 +0000 |
---|---|---|
committer | Pavel Labath <labath@google.com> | 2013-06-05 16:23:30 +0000 |
commit | 951ad647a0e2e16a3678775c1a2db61bbd559c9e (patch) | |
tree | 9e8311d288749dcef27e1728051ee4133073ea72 | |
parent | 2773f1deb4639c484fd66276442e61259583c1b2 (diff) | |
download | bcm5719-llvm-951ad647a0e2e16a3678775c1a2db61bbd559c9e.tar.gz bcm5719-llvm-951ad647a0e2e16a3678775c1a2db61bbd559c9e.zip |
clang-check: Enable specification of additional compiler arguments
Summary:
This adds two command-line parameters: -extra-arg and -extra-arg-before, which
enable the user to pass additional parameters to the compiler command.
Reviewers: klimek
CC: cfe-commits
Differential Revision: http://llvm-reviews.chandlerc.com/D919
llvm-svn: 183320
-rw-r--r-- | clang/test/Tooling/clang-check-extra-arg.cpp | 5 | ||||
-rw-r--r-- | clang/tools/clang-check/ClangCheck.cpp | 40 |
2 files changed, 45 insertions, 0 deletions
diff --git a/clang/test/Tooling/clang-check-extra-arg.cpp b/clang/test/Tooling/clang-check-extra-arg.cpp new file mode 100644 index 00000000000..f6715358453 --- /dev/null +++ b/clang/test/Tooling/clang-check-extra-arg.cpp @@ -0,0 +1,5 @@ +// RUN: clang-check "%s" -extra-arg=-Wunimplemented-warning -extra-arg-before=-Wunimplemented-warning-before -- -c 2>&1 | FileCheck %s + +// CHECK: unknown warning option '-Wunimplemented-warning-before' +// CHECK: unknown warning option '-Wunimplemented-warning' +int a(){} diff --git a/clang/tools/clang-check/ClangCheck.cpp b/clang/tools/clang-check/ClangCheck.cpp index bf4337486ad..05783620ca3 100644 --- a/clang/tools/clang-check/ClangCheck.cpp +++ b/clang/tools/clang-check/ClangCheck.cpp @@ -70,6 +70,11 @@ static cl::opt<bool> FixWhatYouCan( "fix-what-you-can", cl::desc(Options->getOptionHelpText(options::OPT_fix_what_you_can))); +static cl::list<std::string> ArgsAfter("extra-arg", + cl::desc("Additional argument to append to the compiler command line")); +static cl::list<std::string> ArgsBefore("extra-arg-before", + cl::desc("Additional argument to prepend to the compiler command line")); + namespace { // FIXME: Move FixItRewriteInPlace from lib/Rewrite/Frontend/FrontendActions.cpp @@ -123,6 +128,35 @@ public: } }; +class InsertAdjuster: public clang::tooling::ArgumentsAdjuster { +public: + enum Position { BEGIN, END }; + + InsertAdjuster(const CommandLineArguments &Extra, Position Pos) + : Extra(Extra), Pos(Pos) { + } + + virtual CommandLineArguments + Adjust(const CommandLineArguments &Args) LLVM_OVERRIDE { + CommandLineArguments Return(Args); + + CommandLineArguments::iterator I; + if (Pos == END) { + I = Return.end(); + } else { + I = Return.begin(); + ++I; // To leave the program name in place + } + + Return.insert(I, Extra.begin(), Extra.end()); + return Return; + } + +private: + const CommandLineArguments Extra; + const Position Pos; +}; + } // namespace // Anonymous namespace here causes problems with gcc <= 4.4 on MacOS 10.6. @@ -147,6 +181,12 @@ int main(int argc, const char **argv) { CommonOptionsParser OptionsParser(argc, argv); ClangTool Tool(OptionsParser.getCompilations(), OptionsParser.getSourcePathList()); + + if (ArgsAfter.size() > 0) + Tool.appendArgumentsAdjuster(new InsertAdjuster(ArgsAfter, InsertAdjuster::END)); + if (ArgsBefore.size() > 0) + Tool.appendArgumentsAdjuster(new InsertAdjuster(ArgsBefore, InsertAdjuster::BEGIN)); + if (Fixit) return Tool.run(newFrontendActionFactory<FixItAction>()); clang_check::ClangCheckActionFactory Factory; |