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
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.