ClangTool: strip -o from the command line

Summary:
This patch creates a new ArgumentsAdjuster, which removes all -o parameters from
the command line. This adjuster is inserted by default into the ClangTool pipeline.

Reviewers: klimek

CC: cfe-commits, revane

Differential Revision: http://llvm-reviews.chandlerc.com/D925

llvm-svn: 183398
This commit is contained in:
Pavel Labath 2013-06-06 11:52:19 +00:00
parent de229235b9
commit dee20c105b
5 changed files with 38 additions and 3 deletions

View File

@ -52,6 +52,12 @@ class ClangSyntaxOnlyAdjuster : public ArgumentsAdjuster {
virtual CommandLineArguments Adjust(const CommandLineArguments &Args);
};
/// \brief An argument adjuster which removes output-related command line
/// arguments.
class ClangStripOutputAdjuster : public ArgumentsAdjuster {
virtual CommandLineArguments Adjust(const CommandLineArguments &Args);
};
} // end namespace tooling
} // end namespace clang

View File

@ -233,7 +233,7 @@ class ClangTool {
// Contains a list of pairs (<file name>, <file content>).
std::vector< std::pair<StringRef, StringRef> > MappedFileContents;
SmallVector<ArgumentsAdjuster *, 1> ArgsAdjusters;
SmallVector<ArgumentsAdjuster *, 2> ArgsAdjusters;
};
template <typename T>

View File

@ -37,6 +37,23 @@ ClangSyntaxOnlyAdjuster::Adjust(const CommandLineArguments &Args) {
return AdjustedArgs;
}
CommandLineArguments
ClangStripOutputAdjuster::Adjust(const CommandLineArguments &Args) {
CommandLineArguments AdjustedArgs;
for (size_t i = 0, e = Args.size(); i < e; ++i) {
StringRef Arg = Args[i];
if(!Arg.startswith("-o"))
AdjustedArgs.push_back(Args[i]);
if(Arg == "-o") {
// Output is specified as -o foo. Skip the next argument also.
++i;
}
// Else, the output is specified as -ofoo. Just do nothing.
}
return AdjustedArgs;
}
} // end namespace tooling
} // end namespace clang

View File

@ -236,8 +236,9 @@ void ToolInvocation::addFileMappingsTo(SourceManager &Sources) {
ClangTool::ClangTool(const CompilationDatabase &Compilations,
ArrayRef<std::string> SourcePaths)
: Files((FileSystemOptions())),
ArgsAdjusters(1, new ClangSyntaxOnlyAdjuster()) {
: Files((FileSystemOptions())) {
ArgsAdjusters.push_back(new ClangStripOutputAdjuster());
ArgsAdjusters.push_back(new ClangSyntaxOnlyAdjuster());
for (unsigned I = 0, E = SourcePaths.size(); I != E; ++I) {
SmallString<1024> File(getAbsolutePath(SourcePaths[I]));

View File

@ -0,0 +1,11 @@
// RUN: rm -rf %t
// RUN: mkdir %t
// RUN: echo '[{"directory":".","command":"clang++ -c %t/test.cpp -o foo -ofoo","file":"%t/test.cpp"}]' | sed -e 's/\\/\//g' > %t/compile_commands.json
// RUN: cp "%s" "%t/test.cpp"
// RUN: clang-check -p "%t" "%t/test.cpp" -extra-arg=-v 2>&1|FileCheck %s
// FIXME: Make the above easier.
// CHECK: Invocation
// CHECK-NOT: {{ -v}}
// CHECK: C++ requires
invalid;