On Wed, 19 Mar 2025 at 14:21, Marek Polacek <pola...@redhat.com> wrote: > > On Wed, Mar 19, 2025 at 12:38:31PM +0100, Thomas Schwinge wrote: > > In 2001 Subversion r40924 (Git commit > > 52a11cbfcf0cfb32628b6953588b6af4037ac0b6) > > "IA-64 ABI Exception Handling", '__cxa_bad_cast' changed from 'void *' to > > 'void' return type: > > > > --- libstdc++-v3/libsupc++/exception_support.cc > > +++ /dev/null > > @@ -1,388 +0,0 @@ > > -[...] > > -// Helpers for rtti. Although these don't return, we give them return > > types so > > -// that the type system is not broken. > > -extern "C" void * > > -__cxa_bad_cast () > > -{ > > - [...] > > -} > > -[...] > > > > --- /dev/null > > +++ libstdc++-v3/libsupc++/unwind-cxx.h > > @@ -0,0 +1,163 @@ > > +[...] > > +extern "C" void __cxa_bad_cast (); > > +[...] > > > > --- /dev/null > > +++ libstdc++-v3/libsupc++/eh_aux_runtime.cc > > @@ -0,0 +1,56 @@ > > +[...] > > +extern "C" void > > +__cxa_bad_cast () > > +{ > > + [...] > > +} > > +[...] > > > > The implicit prototype in the C++ front end however wasn't likewise > > adjusted, > > and so for nvptx we generate code for 'void *' return type: > > > > // BEGIN GLOBAL FUNCTION DECL: __cxa_bad_cast > > .extern .func (.param .u64 %value_out) __cxa_bad_cast; > > > > { > > .param .u64 %value_in; > > call (%value_in),__cxa_bad_cast; > > trap; > > // (noreturn) > > exit; > > // (noreturn) > > ld.param.u64 %r30,[%value_in]; > > } > > > > ..., which is in conflict with the library code with 'void' return type: > > > > // BEGIN GLOBAL FUNCTION DECL: __cxa_bad_cast > > .visible .func __cxa_bad_cast; > > > > // BEGIN GLOBAL FUNCTION DEF: __cxa_bad_cast > > .visible .func __cxa_bad_cast > > { > > [...] > > } > > > > ..., and we thus get execution test FAIL for 'g++.dg/rtti/dyncast2.C': > > > > error : Prototype doesn't match for '__cxa_bad_cast' in 'input file 7 > > at offset 51437', first defined in 'input file 7 at offset 51437' > > nvptx-run: cuLinkAddData failed: device kernel image is invalid > > (CUDA_ERROR_INVALID_SOURCE, 300) > > > > With this patched, we get the expected: > > > > // BEGIN GLOBAL FUNCTION DECL: __cxa_bad_cast > > -.extern .func (.param .u64 %value_out) __cxa_bad_cast; > > +.extern .func __cxa_bad_cast; > > > > { > > -.param .u64 %value_in; > > -call (%value_in),__cxa_bad_cast; > > +call __cxa_bad_cast; > > trap; > > // (noreturn) > > exit; > > // (noreturn) > > -ld.param.u64 %r30,[%value_in]; > > } > > > > ..., and execution test PASS. > > > > gcc/cp/ > > * rtti.cc (throw_bad_cast): Adjust implicit '__cxa_bad_cast' > > prototype to reality. > > --- > > gcc/cp/rtti.cc | 2 +- > > 1 file changed, 1 insertion(+), 1 deletion(-) > > > > diff --git a/gcc/cp/rtti.cc b/gcc/cp/rtti.cc > > index dcf84f17163..a10fa383f79 100644 > > --- a/gcc/cp/rtti.cc > > +++ b/gcc/cp/rtti.cc > > @@ -198,7 +198,7 @@ throw_bad_cast (void) > > fn = get_global_binding (name); > > if (!fn) > > fn = push_throw_library_fn > > - (name, build_function_type_list (ptr_type_node, NULL_TREE)); > > + (name, build_function_type_list (void_type_node, NULL_TREE)); > > } > > > > return build_cxx_call (fn, 0, NULL, tf_warning_or_error); > > LGTM, matches what I see in abi-eh.html from the itanium-cxx-abi. > > The comment above mentions libstdc++/exception.cc but I don't see that > file.
I think that was removed in 2001 by r39445 :-)