Currently clang does not emit device template variables
instantiated only in host functions, however, nvcc is
able to do that:
https://godbolt.org/z/fneEfferY
This patch fixes this issue by refactoring and extending
the existing mechanism for emitting static device
var ODR-used by host only. Basically clang records
device variables ODR-used by host code and force
them to be emitted in device compilation. The existing
mechanism makes sure these device variables ODR-used
by host code are added to llvm.compiler-used, therefore
they are guaranteed not to be deleted.
This patch also fixes non-ODR-use of static device
variables by host code causing static device variables
emitted.
Revisiting my comment from https://reviews.llvm.org/D102237#inline-967732
I think this can be combined with the if (SemaRef.LangOpts.CUDA) above.
Unless I'm missing something obvious, what we have now is
if (SemaRef.LangOpts.CUDA) { <vars> if (Var && Var->hasGlobalStorage()) { } }You've mentioned that they can't be combined because of an else, but there's no else in the if (Var && Var->hasGlobalStorage()) as far as I can see, and <vars> could be moved inside it.