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