[PATCH] D95099: [clang-scan-deps] : Support -- in clang command lines.

2021-04-17 Thread Alexandre Ganea via Phabricator via cfe-commits
This revision was automatically updated to reflect the committed changes.
Closed by commit rG488a19d00cba: [clang-scan-deps] Support double-dashes in 
clang command lines (authored by saudi, committed by aganea).

Changed prior to commit:
  https://reviews.llvm.org/D95099?vs=318304=338329#toc

Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D95099/new/

https://reviews.llvm.org/D95099

Files:
  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
@@ -418,14 +418,15 @@
 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 @@
   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 @@
 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/tools/clang-scan-deps/ClangScanDeps.cpp
===
--- clang/tools/clang-scan-deps/ClangScanDeps.cpp
+++ clang/tools/clang-scan-deps/ClangScanDeps.cpp
@@ -418,14 +418,15 @@
 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 @@
   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 @@
 AdjustedArgs.push_back(std::string(ResourceDir));
   }
 }
+AdjustedArgs.insert(AdjustedArgs.end(), 

[PATCH] D95099: [clang-scan-deps] : Support -- in clang command lines.

2021-02-03 Thread Duncan P. N. Exon Smith via Phabricator via cfe-commits
dexonsmith accepted this revision.
dexonsmith added a comment.
This revision is now accepted and ready to land.

LGTM!


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D95099/new/

https://reviews.llvm.org/D95099

___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D95099: [clang-scan-deps] : Support -- in clang command lines.

2021-02-01 Thread Sylvain Audi via Phabricator via cfe-commits
saudi added a comment.

Ping!


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D95099/new/

https://reviews.llvm.org/D95099

___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D95099: [clang-scan-deps] : Support -- in clang command lines.

2021-01-21 Thread Sylvain Audi via Phabricator via cfe-commits
saudi added inline comments.



Comment at: clang/test/ClangScanDeps/Inputs/regular_cdb.json:12-16
 {
   "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"
 }

dexonsmith wrote:
> It's not obvious to me how this exercises the new `-resource-dir` logic. Can 
> you walk me through it?
clang tools like `clang-scan-deps` may edit the provided clang command line, 
especially to override the resource directory with their own default value in 
case it is not found as an argument.

This patch avoids inserting new arguments after `--`, since they would be 
wrongly interpreted as extra input files.

By adding `--` in this test, we broadly verify that no argument inserted by 
`clang-scan-deps` is treated as an extra input file. `-resource-dir` is merely 
one possible case. 

Note that `-resource-dir` case is a bit special: `clang-scan-deps` will first 
try to force its value using the result of `clang -print-resource-dir`  (see 
`ClangScanDeps.cpp`).
Yet, this heuristic may fail (and it does in this clang-scan-deps test, where 
the clang command is not given as an absolute path). In that case `ClangTool` 
will also try to add `-resource-dir` (see `Tooling.cpp`).





Comment at: clang/tools/clang-scan-deps/ClangScanDeps.cpp:480
 }
+AdjustedArgs.insert(AdjustedArgs.end(), ArgsEnd, Args.end());
 return AdjustedArgs;

dexonsmith wrote:
> Can we use `AdjustedArgs.append(LastFlag, Args.end())` here?
`AdjustedArgs` is of type `tooling::CommandLineArguments` which inherits from 
`std::vector`, it doesn't have `append()`.


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D95099/new/

https://reviews.llvm.org/D95099

___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D95099: [clang-scan-deps] : Support -- in clang command lines.

2021-01-21 Thread Sylvain Audi via Phabricator via cfe-commits
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 , 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) {


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 

[PATCH] D95099: [clang-scan-deps] : Support -- in clang command lines.

2021-01-21 Thread Duncan P. N. Exon Smith via Phabricator via cfe-commits
dexonsmith added a comment.

Thanks for splitting this out! The looks good, just a few nits in line below. I 
also have a question about the test.




Comment at: clang/lib/Tooling/Tooling.cpp:440
+  // names.
+  auto ArgsEnd = Args.end();
+  for (auto I = Args.begin(), E = Args.end(); I != E; ++I) {

I think another name that doesn't sound like a synonym of `Args.end()` would be 
more clear. Maybe `LastFlag` or `FlagsEnd`?



Comment at: clang/test/ClangScanDeps/Inputs/regular_cdb.json:12-16
 {
   "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"
 }

It's not obvious to me how this exercises the new `-resource-dir` logic. Can 
you walk me through it?



Comment at: clang/tools/clang-scan-deps/ClangScanDeps.cpp:424
 bool HasResourceDir = false;
+auto ArgsEnd = llvm::find(Args, "--");
+

I think it'd be a bit clearer to name this `LastFlag` or `LastOption` or 
`FlagsEnd` or something, since this is not the last argument, just the last 
flag/option. Especially helpful on the last usage below when referencing the 
range from `ArgsEnd` to `Args.end()`.



Comment at: clang/tools/clang-scan-deps/ClangScanDeps.cpp:427
 // We need to find the last -o value.
 if (!Args.empty()) {
+  // Reverse scan, starting at the end or at the element before "--".

Should this condition be instead check for `LastFlag != Args.begin()`?



Comment at: clang/tools/clang-scan-deps/ClangScanDeps.cpp:430
+  auto ArgsRBegin = llvm::make_reverse_iterator(ArgsEnd);
+  for (auto It = ArgsRBegin; It != Args.rend(); ++It) {
+StringRef Arg = *It;

Nit: since you're touching this line anyway, would be nice to update it to 
follow the usual LLVM style of calling `rend()` just once instead of on every 
iteration:
```
for (auto RB = llvm::make_reverse_iterator(LastFlag), RI = RB, RE = Args.rend();
 RI != RE; ++RI) {
```
Up to you, but I find the initialism `RI` a bit more indicative of a reverse 
iterator... this patch touches every use so you could rename it without pulling 
in any extra diff. If you prefer the names you have that's fine too though.

Also, if you narrow the scope of `RB` / `ArgsRBegin` you can probably reduce 
nesting by deleting the redundant `if`, but that'd be nice to commit separately 
(in a follow up?) to avoid cluttering up this patch with NFC indentation 
changes.



Comment at: clang/tools/clang-scan-deps/ClangScanDeps.cpp:434
+  if (Arg == "-o" && It != ArgsRBegin)
+LastO = *(It - 1); // Next argument (reverse iterator)
   else if (Arg.startswith("-o"))

Does `RI[-1]` work here? Personally I find `x[y]` more clear than `*(x + y)`.



Comment at: clang/tools/clang-scan-deps/ClangScanDeps.cpp:480
 }
+AdjustedArgs.insert(AdjustedArgs.end(), ArgsEnd, Args.end());
 return AdjustedArgs;

Can we use `AdjustedArgs.append(LastFlag, Args.end())` here?


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D95099/new/

https://reviews.llvm.org/D95099

___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D95099: [clang-scan-deps] : Support -- in clang command lines.

2021-01-21 Thread Sylvain Audi via Phabricator via cfe-commits
saudi updated this revision to Diff 318214.
saudi added a comment.

Bugfixes on the use of the iterator.


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,17 @@
 bool HasMQ = false;
 bool HasMD = false;
 bool HasResourceDir = false;
+auto ArgsEnd = 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];
+  // Reverse scan, starting at the end or at the element before "--".
+  auto ArgsRBegin = llvm::make_reverse_iterator(ArgsEnd);
+  for (auto It = ArgsRBegin; It != Args.rend(); ++It) {
+StringRef Arg = *It;
 if (LastO.empty()) {
-  if (Arg == "-o" && It != Args.rbegin())
-LastO = Args[Idx + 1];
+  if (Arg == "-o" && It != ArgsRBegin)
+LastO = *(It - 1); // Next argument (reverse iterator)
   else if (Arg.startswith("-o"))
 LastO = Arg.drop_front(2).str();
 }
@@ -440,12 +443,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(), ArgsEnd);
 AdjustedArgs.push_back("-o");
 AdjustedArgs.push_back("/dev/null");
 if (!HasMT && !HasMQ) {
@@ -475,6 +477,7 @@
 AdjustedArgs.push_back(std::string(ResourceDir));
   }
 }
+AdjustedArgs.insert(AdjustedArgs.end(), ArgsEnd, 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 , 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 ArgsEnd = Args.end();
+  for (auto I = Args.begin(), E = Args.end(); I != E; ++I) {
+StringRef Arg = *I;
+if (Arg == "--") {
+  ArgsEnd = 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(ArgsEnd, "-resource-dir=" + CompilerInvocation::GetResourcesPath(
+  Argv0, MainAddr));
 }
 
 int ClangTool::run(ToolAction *Action) {


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,17 @@
 bool HasMQ = false;
 bool HasMD = false;
 bool HasResourceDir = false;
+auto ArgsEnd = 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];
+  // Reverse scan, starting at the end or at the element before "--".
+  auto ArgsRBegin = llvm::make_reverse_iterator(ArgsEnd);
+  for (auto It = ArgsRBegin; It != Args.rend(); ++It) {
+StringRef Arg = *It;
 if (LastO.empty()) {
-  if (Arg == "-o" && It != Args.rbegin())
-LastO = Args[Idx + 1];
+  if (Arg == "-o" && It != ArgsRBegin)
+   

[PATCH] D95099: [clang-scan-deps] : Support -- in clang command lines.

2021-01-20 Thread Sylvain Audi via Phabricator via cfe-commits
saudi created this revision.
saudi added reviewers: arphaman, jkolek, Bigcheese, kousikk, dexonsmith, hans.
saudi added a project: clang.
Herald added a subscriber: tschuett.
saudi requested review of this revision.
Herald added a subscriber: cfe-commits.

This fixes argument injection when clang command line contains "--" in the 
argument.

Previously, the arguments were injected at the end of the command line. It 
could be added after `--`, and be interpreted as input file paths.

This fix is needed for a subsequent patch, D92191 



Repository:
  rG LLVM Github Monorepo

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,20 @@
 bool HasMQ = false;
 bool HasMD = false;
 bool HasResourceDir = false;
+auto ArgsEnd = 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];
+  auto ArgsRBegin = llvm::make_reverse_iterator(ArgsEnd);
+  // Reverse scan, starting at the end or at the element before "--".
+  if (ArgsEnd != Args.end() && ArgsRBegin != Args.rend())
+++ArgsRBegin;
+
+  for (auto It = ArgsRBegin; It != Args.rend(); ++It) {
+StringRef Arg = *It;
 if (LastO.empty()) {
   if (Arg == "-o" && It != Args.rbegin())
-LastO = Args[Idx + 1];
+LastO = *(It - 1); // Next argument (reverse iterator)
   else if (Arg.startswith("-o"))
 LastO = Arg.drop_front(2).str();
 }
@@ -440,12 +446,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(), ArgsEnd);
 AdjustedArgs.push_back("-o");
 AdjustedArgs.push_back("/dev/null");
 if (!HasMT && !HasMQ) {
@@ -475,6 +480,7 @@
 AdjustedArgs.push_back(std::string(ResourceDir));
   }
 }
+AdjustedArgs.insert(AdjustedArgs.end(), ArgsEnd, 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 , 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 ArgsEnd = Args.end();
+  for (auto I = Args.begin(), E = Args.end(); I != E; ++I) {
+StringRef Arg = *I;
+if (Arg == "--") {
+  ArgsEnd = 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(ArgsEnd, "-resource-dir=" + CompilerInvocation::GetResourcesPath(
+  Argv0, MainAddr));
 }
 
 int ClangTool::run(ToolAction *Action) {


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,20 @@
 bool HasMQ = false;
 bool HasMD = false;
 bool HasResourceDir = false;
+auto ArgsEnd = 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 !=