jansvoboda11 added inline comments.

================
Comment at: clang/lib/Frontend/CompilerInvocation.cpp:677
+  SwapOpts(Res);
+  bool Success2 = Parse(Res, GeneratedArgs1, Diags);
+
----------------
saudi wrote:
> Hello,
> 
> I encountered crashes on Windows targets, related to this line, when rebasing 
> https://reviews.llvm.org/D80833, where `CodeGenOpts::CommandLineArgs` is read 
> later in the compilation process.
> 
> When the function exits, `GeneratedArgs1` is destroyed but 
> `Res.getCodeGenOpts().CommandLineArgs` still references its contents. The 
> code has changed since this patch was submitted, but the logic remains the 
> same in more recent code.
> 
> Note that the bug doesn't happen when round-trip is skipped, as 
> `CommandLineArgs` then refers to `ArgV` which content is valid for the entire 
> compiler run.
> 
> As a solution I considered allowing `CodeGenOptions` to optionally own the 
> memory by introducing `BumpPtrAllocator CodeGenOptions::CommandLineArgsAlloc`.
>  However it has drawbacks:
>  - need to customize `CodeGenOptions` copy constructor/operator,
>  - lifetime for copies of `CodeGenOptions::CommandLineArgs` (e.g. to other 
> structures) would be bound to the lifetime of the original `CodeGenOptions` 
> object.
>  
> Another solution (slower) would be to use 2 dummy `CompilerInvocation` to 
> perform the round-trip test, and use the regular arguments on the main 
> instance. It would change the behavior since the main instance currently uses 
> `GeneratedArgs1`.
> 
> WDYT?
> Hello,
> 
> I encountered crashes on Windows targets, related to this line, when rebasing 
> https://reviews.llvm.org/D80833, where `CodeGenOpts::CommandLineArgs` is read 
> later in the compilation process.
> 
> When the function exits, `GeneratedArgs1` is destroyed but 
> `Res.getCodeGenOpts().CommandLineArgs` still references its contents. The 
> code has changed since this patch was submitted, but the logic remains the 
> same in more recent code.
> 
> Note that the bug doesn't happen when round-trip is skipped, as 
> `CommandLineArgs` then refers to `ArgV` which content is valid for the entire 
> compiler run.

Hi, you're right, I can see the lifetime issues here.

> As a solution I considered allowing `CodeGenOptions` to optionally own the 
> memory by introducing `BumpPtrAllocator CodeGenOptions::CommandLineArgsAlloc`.
>  However it has drawbacks:
>  - need to customize `CodeGenOptions` copy constructor/operator,
>  - lifetime for copies of `CodeGenOptions::CommandLineArgs` (e.g. to other 
> structures) would be bound to the lifetime of the original `CodeGenOptions` 
> object.

Instead of introducing `BumpPtrAllocator` in `CodeGenOptions` and dealing with 
custom copy constructor/assignment, I think it should be possible to use an 
owning type (e.g. `std::vector<std::string>>`), WDYT? That's the approach we 
generally take in `CompilerInvocation` members.

> Another solution (slower) would be to use 2 dummy `CompilerInvocation` to 
> perform the round-trip test, and use the regular arguments on the main 
> instance. It would change the behavior since the main instance currently uses 
> `GeneratedArgs1`.

Referring to `ArgV` instead of `GeneratedArgs1` should be fine too, since they 
are guaranteed to be semantically equivalent anyways.

> WDYT?

I think both approaches are valid, but I think the cleanest solution would be 
to drop `CodeGenOptions::CommandLineArgs` entirely. It's one of the few cases 
where `CompilerInvocation` points to memory owned by someone else. (I thought 
this only happens in `PreprocessorOptions::RemappedFileBuffers`, but I stand 
corrected.) Whenever clients need the original command-line, they can call 
`CompilerInvocation::generateCC1CommandLine` and get semantically equivalent 
list of cc1 arguments. Would that work for you use-case?


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D94472

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

Reply via email to