forked from OSchip/llvm-project
[clang-scan-deps] Support double-dashes in clang command lines
This fixes argument injection in clang command lines, by adding them before "--". Previously, the arguments were injected at the end of the command line and could be added after "--", which would be wrongly interpreted as input file paths. This fix is needed for a subsequent patch, see D92191. Differential Revision: https://reviews.llvm.org/D95099
This commit is contained in:
parent
7b75a3a8eb
commit
488a19d00c
|
@ -11,7 +11,7 @@
|
|||
},
|
||||
{
|
||||
"directory": "DIR",
|
||||
"command": "clang -E DIR/regular_cdb_input.cpp -IInputs -o adena.o",
|
||||
"command": "clang -E -IInputs -o adena.o -- DIR/regular_cdb_input.cpp",
|
||||
"file": "DIR/regular_cdb_input.cpp"
|
||||
}
|
||||
]
|
||||
|
|
|
@ -418,14 +418,15 @@ int main(int argc, const char **argv) {
|
|||
bool HasMQ = false;
|
||||
bool HasMD = false;
|
||||
bool HasResourceDir = false;
|
||||
// We need to find the last -o value.
|
||||
if (!Args.empty()) {
|
||||
std::size_t Idx = Args.size() - 1;
|
||||
for (auto It = Args.rbegin(); It != Args.rend(); ++It) {
|
||||
StringRef Arg = Args[Idx];
|
||||
auto FlagsEnd = llvm::find(Args, "--");
|
||||
if (FlagsEnd != Args.begin()) {
|
||||
// Reverse scan, starting at the end or at the element before "--".
|
||||
auto R = llvm::make_reverse_iterator(FlagsEnd);
|
||||
for (auto I = R, E = Args.rend(); I != E; ++I) {
|
||||
StringRef Arg = *I;
|
||||
if (LastO.empty()) {
|
||||
if (Arg == "-o" && It != Args.rbegin())
|
||||
LastO = Args[Idx + 1];
|
||||
if (Arg == "-o" && I != R)
|
||||
LastO = I[-1]; // Next argument (reverse iterator)
|
||||
else if (Arg.startswith("-o"))
|
||||
LastO = Arg.drop_front(2).str();
|
||||
}
|
||||
|
@ -437,12 +438,11 @@ int main(int argc, const char **argv) {
|
|||
HasMD = true;
|
||||
if (Arg == "-resource-dir")
|
||||
HasResourceDir = true;
|
||||
--Idx;
|
||||
}
|
||||
}
|
||||
// If there's no -MT/-MQ Driver would add -MT with the value of the last
|
||||
// -o option.
|
||||
tooling::CommandLineArguments AdjustedArgs = Args;
|
||||
tooling::CommandLineArguments AdjustedArgs(Args.begin(), FlagsEnd);
|
||||
AdjustedArgs.push_back("-o");
|
||||
AdjustedArgs.push_back("/dev/null");
|
||||
if (!HasMT && !HasMQ) {
|
||||
|
@ -472,6 +472,7 @@ int main(int argc, const char **argv) {
|
|||
AdjustedArgs.push_back(std::string(ResourceDir));
|
||||
}
|
||||
}
|
||||
AdjustedArgs.insert(AdjustedArgs.end(), FlagsEnd, Args.end());
|
||||
return AdjustedArgs;
|
||||
});
|
||||
AdjustingCompilations->appendArgumentsAdjuster(
|
||||
|
|
Loading…
Reference in New Issue