https://gcc.gnu.org/bugzilla/show_bug.cgi?id=119806

            Bug ID: 119806
           Summary: OpenACC, OpenMP 'target' offloading vs. C++ 'typeinfo'
                    parts
           Product: gcc
           Version: 15.0
            Status: UNCONFIRMED
          Keywords: openacc, openmp, wrong-code
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: tschwinge at gcc dot gnu.org
                CC: burnus at gcc dot gnu.org, jakub at gcc dot gnu.org
  Target Milestone: ---
            Target: GCN, nvptx

We've got cases of C++ OpenACC, OpenMP 'target' offloading code (XFAILed test
case soon to appear), where nvptx offloading linking fails due to:

    ptxas ./exceptions-throw-2.xnvptx-none.mkoffload.o, line 23; fatal   :
Initial value type mismatch
    ptxas fatal   : Ptx assembly aborted due to errors
    nvptx-as: ptxas returned 255 exit status
    nvptx mkoffload: fatal error:
[...]/powerpc64le-unknown-linux-gnu-accel-nvptx-none-gcc returned 1 exit status

It's complaining about:

    // BEGIN GLOBAL VAR DEF: _ZTI11MyException
            .weak .global .align 8 .u64 _ZTI11MyException[2] = {
generic(_ZTVN10__cxxabiv117__class_type_infoE) + 16, generic(_ZTS11MyException)
};

The players here are:

    $ c++filt _ZTI11MyException _ZTVN10__cxxabiv117__class_type_infoE
_ZTS11MyException
    typeinfo for MyException
    vtable for __cxxabiv1::__class_type_info
    typeinfo name for MyException

..., but '_ZTVN10__cxxabiv117__class_type_infoE' and '_ZTS11MyException' aren't
getting declared in this file.

This issue bears some relation to PR119734 "nvptx/C++ vs. '_ZTISt8bad_cast'
('typeinfo for std::bad_cast')", as again, '_ZTI11MyException' is only being
"referenced" within:

    /* BEGIN '.gcc_except_table'
    [...]
    .symbol_ref     _ZTI11MyException
    END '.gcc_except_table' */

It would be good if there was a way to not emit that '.extern'
'_ZTI11MyException' definition if only (fake-)referenced like this.

Here, '_ZTVN10__cxxabiv117__class_type_infoE' comes from libstdc++ (via
definition in libsupc++'s 'class_type_info.o'), and '_ZTS11MyException' would
come from the user source code -- but isn't getting defined in this file.

In contrast, the respective non-offloading, nvptx target test case (to appear
soon), gets this right, includes the 'vtable for __cxxabiv1::__class_type_info'
declaration:

    // BEGIN GLOBAL VAR DECL: _ZTVN10__cxxabiv117__class_type_infoE
            .extern .global .align 8 .u64
_ZTVN10__cxxabiv117__class_type_infoE[];

..., and includes the 'typeinfo name for MyException' definition:

    // BEGIN GLOBAL VAR DEF: _ZTS11MyException
            .weak .global .align 1 .u8 _ZTS11MyException[14] = { 49, 49, 77,
121, 69, 120, 99, 101, 112, 116, 105, 111, 110, 0 };

..., and assembles, links, executes as expected.

I suspect that we simply fail to mark up these C++ 'typeinfo' parts to be
emitted for offloading compilation?  (Via 'omp declare target' attribute, set
'offloadable' on 'symtab_node', push into 'offload_vars'?)


Quite similarly, GCN offloading linking fails due to:

    ld: error: undefined symbol: typeinfo name for MyException
    >>> referenced by
./exceptions-throw-2.xamdgcn-amdhsa.mkoffload.hsaco-exceptions-throw-2.xamdgcn-amdhsa.mkoffload.2.o:(typeinfo
for MyException)
    >>> did you mean: typeinfo for MyException
    >>> defined in:
./exceptions-throw-2.xamdgcn-amdhsa.mkoffload.hsaco-exceptions-throw-2.xamdgcn-amdhsa.mkoffload.2.o
    collect2: error: ld returned 1 exit status
    gcn mkoffload: fatal error:
[...]/x86_64-pc-linux-gnu-accel-amdgcn-amdhsa-gcc returned 1 exit status

As above, that's:

            .weak   _ZTI11MyException
            .section       
.data.rel.ro._ZTI11MyException,"awG",@progbits,_ZTI11MyException,comdat
            .align  8
            .type   _ZTI11MyException, @object
            .size   _ZTI11MyException, 16
    _ZTI11MyException:
            .8byte  _ZTVN10__cxxabiv117__class_type_infoE+16
            .8byte  _ZTS11MyException

..., which also here is only referenced from '.fake_gcc_except_table':

            .section        .fake_gcc_except_table,"e",@progbits
    [...]
            .8byte  _ZTI11MyException

As above, the players here are:

    $ c++filt _ZTI11MyException _ZTVN10__cxxabiv117__class_type_infoE
_ZTS11MyException
    typeinfo for MyException
    vtable for __cxxabiv1::__class_type_info
    typeinfo name for MyException

As above, '_ZTVN10__cxxabiv117__class_type_infoE' comes from libstdc++ (via
definition in libsupc++'s 'class_type_info.o'), and '_ZTS11MyException' would
come from the user source code, but isn't getting defined in this file.

As above, in contrast, the respective non-offloading, GCN target test case (to
appear soon), gets this right, (doesn't need a 'vtable for
__cxxabiv1::__class_type_info' declaration, but) includes the 'typeinfo name
for MyException' definition:

            .weak   _ZTS11MyException
            .section       
.rodata._ZTS11MyException,"aG",@progbits,_ZTS11MyException,comdat
            .align  16
            .type   _ZTS11MyException, @object
            .size   _ZTS11MyException, 14
    _ZTS11MyException:
            .string "11MyException"

..., and assembles, links, executes as expected.

So I suspect it's the very same underlying issue.

Reply via email to