[PATCH] D95099: [clang-scan-deps] : Support -- in clang command lines.
Sylvain Audi via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Thu Jan 21 13:39:04 PST 2021
saudi updated this revision to Diff 318304.
saudi marked 5 inline comments as done.
saudi added a comment.
Updated for suggested modifications
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D95099/new/
https://reviews.llvm.org/D95099
Files:
clang/lib/Tooling/Tooling.cpp
clang/test/ClangScanDeps/Inputs/regular_cdb.json
clang/tools/clang-scan-deps/ClangScanDeps.cpp
Index: clang/tools/clang-scan-deps/ClangScanDeps.cpp
===================================================================
--- clang/tools/clang-scan-deps/ClangScanDeps.cpp
+++ clang/tools/clang-scan-deps/ClangScanDeps.cpp
@@ -421,14 +421,18 @@
bool HasMQ = false;
bool HasMD = false;
bool HasResourceDir = false;
+ auto FlagsEnd = llvm::find(Args, "--");
+
// 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];
+ if (FlagsEnd != Args.begin()) {
+ // Reverse scan, starting at the end or at the element before "--".
+ for (auto RB = llvm::make_reverse_iterator(FlagsEnd), RI = RB,
+ RE = Args.rend();
+ RI != RE; ++RI) {
+ StringRef Arg = *RI;
if (LastO.empty()) {
- if (Arg == "-o" && It != Args.rbegin())
- LastO = Args[Idx + 1];
+ if (Arg == "-o" && RI != RB)
+ LastO = RI[-1]; // Next argument (reverse iterator)
else if (Arg.startswith("-o"))
LastO = Arg.drop_front(2).str();
}
@@ -440,12 +444,11 @@
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) {
@@ -475,6 +478,7 @@
AdjustedArgs.push_back(std::string(ResourceDir));
}
}
+ AdjustedArgs.insert(AdjustedArgs.end(), FlagsEnd, Args.end());
return AdjustedArgs;
});
AdjustingCompilations->appendArgumentsAdjuster(
Index: clang/test/ClangScanDeps/Inputs/regular_cdb.json
===================================================================
--- clang/test/ClangScanDeps/Inputs/regular_cdb.json
+++ clang/test/ClangScanDeps/Inputs/regular_cdb.json
@@ -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"
}
]
Index: clang/lib/Tooling/Tooling.cpp
===================================================================
--- clang/lib/Tooling/Tooling.cpp
+++ clang/lib/Tooling/Tooling.cpp
@@ -435,13 +435,22 @@
static void injectResourceDir(CommandLineArguments &Args, const char *Argv0,
void *MainAddr) {
// Allow users to override the resource dir.
- for (StringRef Arg : Args)
+ // Don't search/inject past "--", as the subsequent arguments are only file
+ // names.
+ auto FlagsEnd = Args.end();
+ for (auto B = Args.begin(), I = B, E = Args.end(); I != E; ++I) {
+ StringRef Arg = *I;
+ if (Arg == "--") {
+ FlagsEnd = I;
+ break;
+ }
if (Arg.startswith("-resource-dir"))
return;
+ }
// If there's no override in place add our resource dir.
- Args.push_back("-resource-dir=" +
- CompilerInvocation::GetResourcesPath(Argv0, MainAddr));
+ Args.insert(FlagsEnd, "-resource-dir=" + CompilerInvocation::GetResourcesPath(
+ Argv0, MainAddr));
}
int ClangTool::run(ToolAction *Action) {
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D95099.318304.patch
Type: text/x-patch
Size: 3664 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20210121/3074edea/attachment-0001.bin>
More information about the cfe-commits
mailing list