From: Pavel Labath Date: Wed, 5 Jun 2013 16:23:30 +0000 (+0000) Subject: clang-check: Enable specification of additional compiler arguments X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=88c200473d133a4e40083af22c316da536bad755;p=clang 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 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@183320 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/test/Tooling/clang-check-extra-arg.cpp b/test/Tooling/clang-check-extra-arg.cpp new file mode 100644 index 0000000000..f671535845 --- /dev/null +++ b/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/tools/clang-check/ClangCheck.cpp b/tools/clang-check/ClangCheck.cpp index bf4337486a..05783620ca 100644 --- a/tools/clang-check/ClangCheck.cpp +++ b/tools/clang-check/ClangCheck.cpp @@ -70,6 +70,11 @@ static cl::opt FixWhatYouCan( "fix-what-you-can", cl::desc(Options->getOptionHelpText(options::OPT_fix_what_you_can))); +static cl::list ArgsAfter("extra-arg", + cl::desc("Additional argument to append to the compiler command line")); +static cl::list 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()); clang_check::ClangCheckActionFactory Factory;