Michael137 wrote:

> It looks like this is working for all other kinds of structured binding 
> because `EmitDeclare(BindingDecl*, ...)` emits a proper `DILocalVariable` for 
> them. But it skips `BindingDecl`s that have a holding variable for some 
> reason. Perhaps a cleaner approach would be to make it handle that case too, 
> and leave the holding variables themselves as artificial?

Yea that would be ideal. I was thinking of doing this, but wasn't quite sure 
how to best re-architect the codegen for structured bindings to make this 
happen.

We currently emit debug-info for structured bindings in 2 steps. The 
[`DecompositionDecl` itself gets codegen'd 
first](https://github.com/llvm/llvm-project/blob/c6e69b041a7e6d18463f6cf684b10fd46a62c496/clang/lib/CodeGen/CGDecl.cpp#L165).
 Which is what calls into `CGDebugInfo::EmitDeclare(BindingDecl*, ...)`. This 
creates a debug-info entry for the unnamed decomposition pair. But then 
[`CodeGenFunction::EmitDecl` calls `EmitVarDecl` for each holding 
var](https://github.com/llvm/llvm-project/blob/c6e69b041a7e6d18463f6cf684b10fd46a62c496/clang/lib/CodeGen/CGDecl.cpp#L169).
 This then goes through various layers of codegen until we hit 
`CGDebugInfo::EmitDeclare(VarDecl*,...)`. Hence we bail out early in the case 
of tuple-like bindings in step 1, and defer to 
`CGDebugInfo::EmitDeclare(VarDecl*)` to emit debug-info for each individual 
holding var.

So at some point in the code-gen process we need to bail out early in the case 
of structured bindings. AFAICT we have two options:
1. Detect the fact that we're dealing with holding vars [before calling 
`CGDebugInfo::EmitDeclare(VarDecl*)` 
](https://github.com/llvm/llvm-project/blob/c6e69b041a7e6d18463f6cf684b10fd46a62c496/clang/lib/CodeGen/CGDecl.cpp#L1680-L1682).
 And just emit all the debug-info for a decomposition in 
`CGDebugInfo::EmitDeclare(BindingDecl*, ...)`
2. OR, detect that we're emitting holding vars in 
`CGDebugInfo::EmitDeclare(BindingDecl*, ...)`, and emit the debug-info for them 
in `CGDebugInfo::EmitDeclare(VarDecl*, ...)`. Which is what the current patch 
is doing.

Any preferences here? Or maybe I'm missing a better approach

https://github.com/llvm/llvm-project/pull/100355
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to