On 3/19/25 7:38 AM, 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.
OK.
---
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);