[PATCH] D92160: [clang] Fix wrong FDs are used for files with same name in Tooling
Ella Ma via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Wed Dec 9 22:55:52 PST 2020
OikawaKirie added a comment.
Replies from the original author Hao Zhang <zhanghao19 at ios.ac.cn>
(Sorry for the wrong email address in the previous reply.)
--------------------------------------------------------------
Thanks for your reply.
I noticed this problem when I was using clang-check to analyze a project which had a `compile_commands.json`. A simplified test case is provided in the patch.
As far as I know this problem only happens in `clang/lib/Tooling/Tooling.cpp`. (as @OikawaKirie has explained)
However, it is more likely a bug in `FileManager`, since `FileManager` is not aware that whether the current working directory has been changed or not.
One solution could be to add an API, such as `notifyCurrentWorkingDirectoryChange`. Clients call if necessary. (Similar to the 3rd one in your alternative solution). Now the question is what to do in `notifyCurrentWorkingDirectoryChange`:
- In my solution, I use a pretty straightforward approach, which is to have an individual cache (for `FileEntry` and any other related things) for each working directory, and switch caches between working directories.
- In your alternative solution, if I standerstand it correctly, `dropRelativePaths` is called in `notifyCurrentWorkingDirectoryChange`. All those `FileEntry` which are based on relative paths are dropped from the cache. I think this is a good idea, especially for keeping `FileManager` simple. However I'm not sure how many files are based on relative paths. If `dropRelativePaths` drops too many files and the working directory is switched back to a previous one (this could happen when analyzing with a `compile_commands.json`), it might result in many cache misses, thus involving more system calls to open files.
There was an another solution I have ever tried, without things like `notifyCurrentWorkingDirectoryChange`. The solution is still straightforward, which is to use absolute path (instead of filename) to query/store a `FileEntry` from/to the cache. Actually I have tried this before but it ended up with lots of test cases failed. I don't know where I did wrong. If you think this approach is okay, I will continue working on this, and it might take some time.
I'm still not sure which solution is more suitable, or if there is a better one. Any suggestions are welcome!
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D92160/new/
https://reviews.llvm.org/D92160
More information about the cfe-commits
mailing list