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
This commit is contained in:
Pavel Labath 2013-06-05 16:23:30 +00:00
parent 2773f1deb4
commit 951ad647a0
2 changed files with 45 additions and 0 deletions

View File

@ -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(){}

View File

@ -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;