[PATCH] D98824: [Tooling] Handle compilation databases containing commands with double dashes

Kadir Cetinkaya via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Fri Mar 19 00:39:47 PDT 2021


kadircet added a comment.

In D98824#2634715 <https://reviews.llvm.org/D98824#2634715>, @jnykiel wrote:

> I have addressed some of your comments. The second revision is good enough to get the tests to pass - the `injectResourceDir` change was necessary for the one clang-tidy test that started failing after leaving the `--` in. I don't feel familiar enough with clangd specifically to attempt comprehensive fixes there. The clangd issue report specifically mentions `-fsyntax-only` and `-resource-dir` as well - so while not comprehensive, the fix may be good for that too.

There are a lot more argument adjusters that look at the compile flags and they don't stop at `--` though :/ I don't think it is feasible to special case `--` in all of those loops and doesn't happen enough in practice (i.e. we see a filename that starts with `-resource-dir` or `-fsyntax-only` etc.) to justify a more complex solution. So as mentioned in the comments let's ignore these for now.



================
Comment at: clang/lib/Tooling/ArgumentsAdjusters.cpp:48
+
+      if (Arg == "--")
+        break;
----------------
we should perform this either in all or none. thinking about this again, there are a lot more things that can go wrong but they happen pretty rarely so let's just drop this change and replace the push_back below with `getInsertArgumentAdjuster("-fsyntax-only")(AdjustedArgs, "");`

copying over args once more isn't crucial here as this happen only once before parsing a translation unit, which by far dominates the latency.


================
Comment at: clang/lib/Tooling/InterpolatingCompilationDatabase.cpp:248
+    if (InsertDoubleDash)
+      Result.CommandLine.push_back("--");
     Result.CommandLine.push_back(std::string(Filename));
----------------
the condition should be a function of the `Filename`, not the compile flag we are using. as the original command might not contain the `--` but the filename might still be starting with a `-` or `/` here, right?

So i'd suggest `Filename.startswith("-") || (ClangCLMode && Filename.startswith("/"))`


================
Comment at: clang/lib/Tooling/Tooling.cpp:439
+  for (StringRef Arg : Args) {
+    if (Arg == "--")
+      break;
----------------
similar to comment above, let's just ignore this.


================
Comment at: clang/lib/Tooling/Tooling.cpp:448
+  resourceDir.append(CompilerInvocation::GetResourcesPath(Argv0, MainAddr));
+  Args = getInsertArgumentAdjuster(CommandLineArguments(1, resourceDir),
+                                   ArgumentInsertPosition::END)(Args, "");
----------------
nit:
```
Args = getInsertArgumentAdjuster(("-resource-dir=" + CompilerInvocation::GetResourcesPath(Argv0, MainAddr)).c_str())(Args, "");
```

There's an overload of `getInsertArgumentAdjuster` that takes in a `const char*`


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

https://reviews.llvm.org/D98824



More information about the cfe-commits mailing list