phosek added a comment.

In D87928#2394913 <https://reviews.llvm.org/D87928#2394913>, @dexonsmith wrote:

> I missed this before, and it's an interesting problem.
>
> I have a few questions:
>
> - I'm not clear on the expected interaction between the current working 
> directory of the compiler and `-fsource-dir`. What happens if they're 
> different?

They're completely independent, `-fsource-dir` is only used for coverage 
mapping and macros.

> - I'm curious if you've considered other solutions that tie the source 
> directory more closely to the current working directory, such as a flag 
> `-frelative-to-working-dir`, which makes things relative to the compiler's 
> working directory. Is that too restrictive?

I think it depends on the use cases and user expectations. For example, in our 
case we have layout like this:

  /working/dir/
               sources/
                       lib/a/a.c
                       include/a/a.h
               out/
                       default/

Here `out/default` is the working directory so if we used 
`-frelative-to-working-dir`, we would end up with paths like 
`../../sources/lib/a/a.c` in the coverage mapping or macro expansions like 
`__FILE__`. While this may be acceptable for macro expansions, it's definitely 
undesirable in coverage mapping.

I can think of some potential solutions. We use could use 
`-fprofile-prefix-map=../../=` to strip the `../../` prefix. Alternatively we 
could introduce a new flags in tools like `llvm-cov` and `llvm-profdata` to 
strip the prefix during post-processing.

> - Have you looked at the similar "MakeRelative" logic in `ASTWriter.cpp`? Can 
> this logic be shared somehow?

I wasn't aware of that bit but once we decide on the approach, I'll try to 
deduplicate the logic.

> - What's the expected behaviour when building modules implicitly with 
> `-fmodules`? What value (if any) should they get for `-fsource-dir`?

Right now this flag doesn't apply to modules at all so there's no effect.

> - How should this affect the dependency output (e.g., `clang-scan-deps` and 
> `.d` files), if at all?

The same as for modules. We could consider extending it to support modules and 
dependency files as well although I'd prefer to do it separately.

> - Have you considered having `-fsource-dir` add entries to the prefix maps, 
> rather than duplicating logic?

That might be an option if we land D83154 <https://reviews.llvm.org/D83154> 
first. It wasn't clear if we're going to have both but it might make sense to 
introduce `-fprofile-prefix-map` and then build `-fsource-dir` on top.

> I am a bit concerned about mixing the concepts of "relative base path" with 
> "source directory", since the latter sounds to me like where pristine sources 
> live and that's not always the right relative base path.
>
> For example, consider a layout like this:
>
>   /working/dir/
>                sources/
>                        lib/a/a.c
>                        include/a/a.h
>                        include/a/a.td
>                build/
>                      include/lib/a/a.inc
>                      lib/a/a.o
>                toolchain/usr/
>                              bin/clang
>                              lib/clang/11.0/include/stdint.h
>                sdk/usr/include/
>                                stdint.h
>                                c++/v1/
>                                       vector
>                                       stdint.h
>
> It seems cleaner to have everything relative to `/working/dir`, not 
> `/working/dir/sources`, since you can name all compiler inputs and outputs 
> with the former. But the latter is conceptually the source directory.

Yes, I agree. Ultimately it's up to the user to decide what output they expect. 
I guess this is one advantage of using the `-frelative-to-working-dir` approach 
where it's unambiguous and user can use other flags to do additional rewriting 
if needed.

> WDYT?

Thanks for the detailed feedback!



================
Comment at: clang/lib/Lex/PPMacroExpansion.cpp:1545-1547
+      StringRef SourceDir = PPOpts->SourceDir;
+      if (!SourceDir.empty() && FN.startswith(SourceDir))
+        llvm::sys::path::make_relative(FN, SourceDir, FN);
----------------
dexonsmith wrote:
> What does this do with `-fsource-dir /a/b` for the file `/a/b.c`? (It doesn't 
> seem quite right for it to turn it into `.c` or `../b.c`...)
That's definitely undesirable. We could introduce a new function like 
`llvm::sys::path::has_prefix` to compare path components instead pure string 
comparison to avoid this issue.


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

https://reviews.llvm.org/D87928

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

Reply via email to