aaron.ballman added a comment.

In D139774#4040057 <https://reviews.llvm.org/D139774#4040057>, @vedgy wrote:

> In D139774#4039975 <https://reviews.llvm.org/D139774#4039975>, @aaron.ballman 
> wrote:
>
>> Oh that is a good point! Apologies for not noticing that earlier -- that 
>> makes me wonder if a better approach here is to add a `std::string` to the 
>> `CIndexer` class to represent the temp path to use.
>
> I have suggested the possibility in this review:
>
>> A copy of user-provided temporary directory path buffer can be stored in 
>> class `CIndexer`. But this API in //llvm/Support/Path.h// would stay fragile.
>
> So the question is whether the LLVM API or `CIndexer` should store the buffer.

My goal is to not modify the LLVM path APIs at all.

> The only possible caller of `system_temp_directory()` used by libclang is 
> `llvm::sys::fs::createUniquePath()`. This helper function is called by 
> `createUniqueEntity()`, which in turn is called by several other helper 
> functions, all in //llvm/lib/Support/Path.cpp//. Here is a backtrace from 
> KDevelop built against LLVM at this review's branch:
>
>   ....
>   #6 0x00007fb3717cc1b7 in (anonymous namespace)::TempPCHFile::create () at 
> llvm-project/llvm/include/llvm/ADT/Twine.h:233
>   #7 clang::PrecompiledPreamble::Build(clang::CompilerInvocation const&, 
> llvm::MemoryBuffer const*, clang::PreambleBounds, clang::DiagnosticsEngine&, 
> llvm::IntrusiveRefCntPtr<llvm::vfs::FileSystem>, 
> std::shared_ptr<clang::PCHContainerOperations>, bool, 
> clang::PreambleCallbacks&) (Invocation=..., MainFileBuffer=0x7fb35000a360, 
> Bounds=Bounds@entry=..., Diagnostics=..., VFS=..., 
> PCHContainerOps=std::shared_ptr<clang::PCHContainerOperations> (use count 5, 
> weak count 0) = {...}, StoreInMemory=false, Callbacks=...) at 
> llvm-project/clang/lib/Frontend/PrecompiledPreamble.cpp:421
>   #8 0x00007fb3717234a8 in 
> clang::ASTUnit::getMainBufferWithPrecompiledPreamble(std::shared_ptr<clang::PCHContainerOperations>,
>  clang::CompilerInvocation&, llvm::IntrusiveRefCntPtr<llvm::vfs::FileSystem>, 
> bool, unsigned int) (this=0x7fb3505c44d0, 
> PCHContainerOps=std::shared_ptr<clang::PCHContainerOperations> (use count 5, 
> weak count 0) = {...}, PreambleInvocationIn=..., VFS=..., 
> AllowRebuild=<optimized out>, MaxLines=0) at 
> /usr/include/c++/12.2.0/bits/unique_ptr.h:191
>   #9 0x00007fb371729bd6 in 
> clang::ASTUnit::LoadFromCompilerInvocation(std::shared_ptr<clang::PCHContainerOperations>,
>  unsigned int, llvm::IntrusiveRefCntPtr<llvm::vfs::FileSystem>) 
> (this=0x7fb3505c44d0, 
> PCHContainerOps=std::shared_ptr<clang::PCHContainerOperations> (use count 5, 
> weak count 0) = {...}, PrecompilePreambleAfterNParses=<optimized out>, 
> VFS=...) at llvm-project/clang/lib/Frontend/ASTUnit.cpp:1685
>   #10 0x00007fb37172e359 in clang::ASTUnit::LoadFromCommandLine(char const**, 
> char const**, std::shared_ptr<clang::PCHContainerOperations>, 
> llvm::IntrusiveRefCntPtr<clang::DiagnosticsEngine>, llvm::StringRef, bool, 
> clang::CaptureDiagsKind, 
> llvm::ArrayRef<std::pair<std::__cxx11::basic_string<char, 
> std::char_traits<char>, std::allocator<char> >, llvm::MemoryBuffer*> >, bool, 
> unsigned int, clang::TranslationUnitKind, bool, bool, bool, 
> clang::SkipFunctionBodiesScope, bool, bool, bool, bool, 
> llvm::Optional<llvm::StringRef>, std::unique_ptr<clang::ASTUnit, 
> std::default_delete<clang::ASTUnit> >*, 
> llvm::IntrusiveRefCntPtr<llvm::vfs::FileSystem>) (ArgBegin=<optimized out>, 
> ArgEnd=<optimized out>, 
> PCHContainerOps=std::shared_ptr<clang::PCHContainerOperations> (empty) = 
> {...}, Diags=..., ResourceFilesPath=..., OnlyLocalDecls=false, 
> CaptureDiagnostics=clang::CaptureDiagsKind::All, RemappedFiles=..., 
> RemappedFilesKeepOriginalName=true, PrecompilePreambleAfterNParses=1, 
> TUKind=clang::TU_Complete, CacheCodeCompletionResults=true, 
> IncludeBriefCommentsInCodeCompletion=false, AllowPCHWithCompilerErrors=true, 
> SkipFunctionBodies=clang::SkipFunctionBodiesScope::None, 
> SingleFileParse=false, UserFilesAreVolatile=true, ForSerialization=false, 
> RetainExcludedConditionalBlocks=false, ModuleFormat=..., 
> ErrAST=0x7fb36effd2d8, VFS=...) at 
> llvm-project/clang/lib/Frontend/ASTUnit.cpp:1822
>   #11 0x00007fb37104e462 in clang_parseTranslationUnit_Impl(CXIndex, char 
> const*, char const* const*, int, llvm::ArrayRef<CXUnsavedFile>, unsigned int, 
> CXTranslationUnit*) (CIdx=0x55dbe16c9360, source_filename=<optimized out>, 
> command_line_args=<optimized out>, num_command_line_args=<optimized out>, 
> unsaved_files=..., options=781, out_TU=0x7fb35ca7f630) at 
> /usr/include/c++/12.2.0/bits/stl_vector.h:987
>   #12 0x00007fb37104f2b4 in operator() (__closure=0x7fb37a7b6f40) at 
> llvm-project/clang/tools/libclang/CIndex.cpp:3976
>   #13 
> llvm::function_ref<void()>::callback_fn<clang_parseTranslationUnit2FullArgv(CXIndex,
>  char const*, char const* const*, int, CXUnsavedFile*, unsigned int, unsigned 
> int, CXTranslationUnitImpl**)::<lambda()> >(intptr_t) 
> (callable=callable@entry=140408830783296) at 
> llvm-project/llvm/include/llvm/ADT/STLFunctionalExtras.h:45
>   #14 0x00007fb3729cc6e0 in llvm::function_ref<void ()>::operator()() const 
> (this=<synthetic pointer>) at 
> llvm-project/llvm/include/llvm/ADT/STLFunctionalExtras.h:68
>   #15 llvm::CrashRecoveryContext::RunSafely(llvm::function_ref<void ()>) 
> (this=<optimized out>, Fn=...) at 
> llvm-project/llvm/lib/Support/CrashRecoveryContext.cpp:433
>   #16 0x00007fb3729cc724 in RunSafelyOnThread_Dispatch(void*) 
> (UserData=0x7fb37a7b6e80) at 
> llvm-project/llvm/lib/Support/CrashRecoveryContext.cpp:514
>   #17 0x00007fb3729cc19a in llvm::thread::Apply<void (*)(void*), (anonymous 
> namespace)::RunSafelyOnThreadInfo*, 0> (Callee=std::tuple containing = {...}) 
> at llvm-project/llvm/include/llvm/Support/thread.h:42
>   #18 llvm::thread::GenericThreadProxy<std::tuple<void (*)(void*), (anonymous 
> namespace)::RunSafelyOnThreadInfo*> > (Ptr=0x55dbe3921080) at 
> llvm-project/llvm/include/llvm/Support/thread.h:50
>   #19 llvm::thread::ThreadProxy<std::tuple<void (*)(void*), (anonymous 
> namespace)::RunSafelyOnThreadInfo*> >(void*) (Ptr=0x55dbe3921080) at 
> llvm-project/llvm/include/llvm/Support/thread.h:60
>   #20 0x00007fb3e909f8fd in () at /usr/lib/libc.so.6
>   #21 0x00007fb3e9121a60 in () at /usr/lib/libc.so.6

Thank you for this trace, that helps identify where I think this functionality 
should live, which is `CIndexer`

At a point where we have a `CIndexer` object, we eventually call 
`ASTUnit::LoadFromCommandLine()` and `ASTUnit` has a member `FileSystemOptions 
FileSystemOpts`, and `FileSystemOptions` has a `std::string` for the working 
directory to use. I think we should store the temp directory in here as well, 
and when `ASTUnit::getMainBufferWithPrecompiledPreamble()` build the preamble, 
it can pass that information along to `TempPCHFile` to avoid needing to ask the 
system for the temp directory. This does mean we store two copies of the string 
(one in `CIndexer` and one in `FileSystemOptions`, but I think the improved 
ownership semantics for the C API makes that duplication somewhat reasonable.

Does this idea seem plausible to you?


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D139774

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

Reply via email to