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.
clang-tidy: warning: 'auto V' can be declared as 'const auto *V' [llvm-qualified-auto]
not useful