On 3/24/25 7:02 AM, Thomas Schwinge wrote:
Hi!

On 2025-03-21T15:46:01+0100, I wrote:
On 2025-03-19T14:25:49+0000, Jonathan Wakely <jwakely....@gmail.com> wrote:
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: [...]

--- 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.

[...] I've now pushed to trunk branch:
commit 618c42d23726be6e2086d452d6718abe5e0daca8
"C++: Adjust implicit '__cxa_bad_cast' prototype to reality", [...]

So, a similar problem exists for '__cxa_bad_typeid'.  See the attached
"[WIP] C++: Adjust implicit '__cxa_bad_typeid' prototype to reality" for
what seemed to be the corresponding patch for that one.  However, that
isn't sufficient; we run into internal errors like:

     [...]/g++.dg/rtti/typeid1.C: In function 'int main()':
     [...]/g++.dg/rtti/typeid1.C:9:12: error: lvalue required as unary '&' 
operand

I got lost in the C++ front end code trying to understand how to resolve
this mismatch.  Anyone able to advise, please?

This addition seems to resolve it:

From f70662ddca467079cdb2bd3c8144d164e94a6268 Mon Sep 17 00:00:00 2001
From: Jason Merrill <ja...@redhat.com>
Date: Mon, 24 Mar 2025 13:32:55 -0400
Subject: [PATCH] ptr

---
 gcc/cp/rtti.cc | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/gcc/cp/rtti.cc b/gcc/cp/rtti.cc
index a55b8611cda..353996206f5 100644
--- a/gcc/cp/rtti.cc
+++ b/gcc/cp/rtti.cc
@@ -255,7 +255,7 @@ get_void_tinfo_ptr (tree type)
    otherwise return the static type of the expression.  */
 
 static tree
-get_tinfo_decl_dynamic (tree exp, tsubst_flags_t complain)
+get_tinfo_ptr_dynamic (tree exp, tsubst_flags_t complain)
 {
   tree type;
   tree t;
@@ -295,7 +295,7 @@ get_tinfo_decl_dynamic (tree exp, tsubst_flags_t complain)
     /* Otherwise return the type_info for the static type of the expr.  */
     t = get_tinfo_ptr (type);
 
-  return cp_build_fold_indirect_ref (t);
+  return t;
 }
 
 static bool
@@ -365,7 +365,7 @@ build_typeid (tree exp, tsubst_flags_t complain)
       exp = cp_build_fold_indirect_ref (exp);
     }
 
-  exp = get_tinfo_decl_dynamic (exp, complain);
+  exp = get_tinfo_ptr_dynamic (exp, complain);
 
   if (exp == error_mark_node)
     return error_mark_node;
@@ -379,7 +379,7 @@ build_typeid (tree exp, tsubst_flags_t complain)
   else
     mark_type_use (initial_expr);
 
-  return exp;
+  return cp_build_fold_indirect_ref (exp);
 }
 
 /* Generate the NTBS name of a type.  If MARK_PRIVATE, put a '*' in front so that
-- 
2.49.0

Reply via email to