https://gcc.gnu.org/bugzilla/show_bug.cgi?id=106445
Bug ID: 106445 Summary: nvptx offloading: C++ constructor symbol alias getting lost Product: gcc Version: 13.0 Status: UNCONFIRMED Keywords: openmp, wrong-code Severity: normal Priority: P3 Component: target Assignee: unassigned at gcc dot gnu.org Reporter: tschwinge at gcc dot gnu.org CC: vries at gcc dot gnu.org Target Milestone: --- Target: nvptx I found this during my "GPU support for minimal C++ library" investigations, PR101544. You're not currently able to reproduce this, as it depends on a number of WIP patches, but I'm filing it for later reference. (Or, I suppose could maybe come up with a non-C++ reproducer.) I've not yet looked through the existing nvptx symbol alias issues in detail. I've also not yet tried reproducing the issue without offloading, with a nvptx target toolchain. Simple 'std::vector<int> v;' in OpenMP 'target', '-O0', host-side '-fno-exceptions', '-foffload-options=nvptx-none=-malias\ -mptx=6.3' works for GCN, but fails to compile for nvptx: ptxas ./a.xnvptx-none.mkoffload.o, line 243; error : Label expected for argument 0 of instruction 'call' ptxas ./a.xnvptx-none.mkoffload.o, line 243; error : Function '_ZNSt12_Vector_baseIiSaIiEE12_Vector_implC1Ev' not declared in this scope $ c++filt _ZNSt12_Vector_baseIiSaIiEE12_Vector_implC1Ev std::_Vector_base<int, std::allocator<int> >::_Vector_impl::_Vector_impl() Looking for '_ZNSt12_Vector_baseIiSaIiEE12_Vector_implC1Ev': For all host/device '-fdump-tree-all-raw-asmname', we only ever see: gimple_call <_ZNSt12_Vector_baseIiSaIiEE12_Vector_implC1Ev, NULL, _1> Correspondingly, for all device '-fdump-rtl-all-raw-asmname': (call (mem:QI (symbol_ref:DI ("_ZNSt12_Vector_baseIiSaIiEE12_Vector_implC1Ev") [flags 0x3] <function_decl 0x7f08a2fe0d00 __ct_comp >) [0 _ZNSt12_Vector_baseIiSaIiEE12_Vector_implC1Ev S1 A8]) In 'a.xnvptx-none.mkoffload.s' only ever: call _ZNSt12_Vector_baseIiSaIiEE12_Vector_implC1Ev, (%out_arg1); In 'a.xamdgcn-amdhsa.mkoffload.1.s' however: s_add_u32 s2, s2, _ZNSt12_Vector_baseIiSaIiEE12_Vector_implC1Ev@rel32@lo+4 s_addc_u32 s3, s3, _ZNSt12_Vector_baseIiSaIiEE12_Vector_implC1Ev@rel32@hi+4 ..., but also: .set _ZNSt12_Vector_baseIiSaIiEE12_Vector_implC1Ev,_ZNSt12_Vector_baseIiSaIiEE12_Vector_implC2Ev ..., that is, a symbol alias (C++ constructors) -- that's missing for nvptx. Looking for '_ZNSt12_Vector_baseIiSaIiEE12_Vector_implC2Ev': There is no (relevant) difference in device '-fdump-tree-all-raw-asmname' '*.094t.fixup_cfg3' and still not '*.253t.optimized'. There is no (relevant) difference in device '-fdump-rtl-all-raw-asmname' '*.254r.expand' and still not (approximately) '*.333r.final'. That is, '_ZNSt12_Vector_baseIiSaIiEE12_Vector_implC2Ev' is still present in nvptx '*.333r.final'. In 'a.xamdgcn-amdhsa.mkoffload.1.s': .type _ZNSt12_Vector_baseIiSaIiEE12_Vector_implC2Ev,@function _ZNSt12_Vector_baseIiSaIiEE12_Vector_implC2Ev: [...] .size _ZNSt12_Vector_baseIiSaIiEE12_Vector_implC2Ev, .-_ZNSt12_Vector_baseIiSaIiEE12_Vector_implC2Ev .set _ZNSt12_Vector_baseIiSaIiEE12_Vector_implC1Ev,_ZNSt12_Vector_baseIiSaIiEE12_Vector_implC2Ev In 'a.xnvptx-none.mkoffload.s': // BEGIN FUNCTION DECL: _ZNSt12_Vector_baseIiSaIiEE12_Vector_implC2Ev .func _ZNSt12_Vector_baseIiSaIiEE12_Vector_implC2Ev (.param.u64 %in_ar0); // BEGIN FUNCTION DEF: _ZNSt12_Vector_baseIiSaIiEE12_Vector_implC2Ev .func _ZNSt12_Vector_baseIiSaIiEE12_Vector_implC2Ev (.param.u64 %in_ar0) { [...] } ..., but not followed by a '.alias'. In case that's relevant (... for nvptx...): the difference for a very similar '_ZNSt6vectorIiSaIiEEC1Ev' -> '_ZNSt6vectorIiSaIiEEC2Ev' symbol alias (which does get defined for both GCN and nvptx) is that the use of '_ZNSt6vectorIiSaIiEEC1Ev' appears after definition of '_ZNSt6vectorIiSaIiEEC2Ev' and its '_ZNSt6vectorIiSaIiEEC1Ev' alias, but for the '_ZNSt12_Vector_baseIiSaIiEE12_Vector_implC1Ev' reported above, the use appears before the '_ZNSt12_Vector_baseIiSaIiEE12_Vector_implC2Ev' function and '_ZNSt12_Vector_baseIiSaIiEE12_Vector_implC1Ev' -> '_ZNSt12_Vector_baseIiSaIiEE12_Vector_implC2Ev' symbol alias definitions (the latter missing for nvptx). --- Similar issue (but different constructor) for 'std::vector<int> v(100);'.