[llvm-bugs] [Bug 48047] New: [C++] Fix generation of __cxa_atexit

via llvm-bugs llvm-bugs at lists.llvm.org
Mon Nov 2 05:21:29 PST 2020


https://bugs.llvm.org/show_bug.cgi?id=48047

            Bug ID: 48047
           Summary: [C++] Fix generation of __cxa_atexit
           Product: clang
           Version: trunk
          Hardware: PC
                OS: All
            Status: NEW
          Severity: enhancement
          Priority: P
         Component: OpenCL
          Assignee: unassignedclangbugs at nondot.org
          Reporter: anastasia.stulova at arm.com
                CC: anastasia.stulova at arm.com, llvm-bugs at lists.llvm.org

Currently global dtor callback registration stub has the prototype that ignores
pointer address spaces

i32 @__cxa_atexit(void (i8*)*, i8*, i8 addrspace(1)*)

The address space of object parameter of destructor and argument of
__cxa_atexit is not taken into account and therefore when address space appears
in the destructor or an object the generated IR is not functional.

Some ideas to fix this is proposed in https://reviews.llvm.org/D62413#1583079.

This suggests that for OpenCL we could generate a custom function (one per each
global object to be destoried). This function will be passed into func ptr
parameter of __cxa_atexit instead of dtor itself how it is done now. The new
function will contain code to invoke dtor on the right object directly i.e. for
the following example

struct S {
  ~S(){};
};

S s;

The proposed IR generated equivalent should be:

void __dtor_s(){ // The naming scheme is to be determined
  ~S(s); // NOTE if address spaces are mismatched we need a conversion. Sema
should already check its validity (?)
}

void @__cxx_global_var_init()
{
  @__cxa_atexit(__dtor_S, null, null);
}

Note that currently clang doesn't generate __dtor_s() and it passes dtor itself
as an argument to @__cxa_atexit, see https://godbolt.org/z/4soT5r

The advantage of the proposed approach is that it can work for any address
space uniformly and it makes implementation of @__cxa_atexit for various addres
spaces very straight forward. There is no need to change default ABI at all.
However it might be good to standardise what clang generates in a long term.
This works for global variables and static local destruction too both in gloabl
and constant address spaces.

The drawback is that we need to generate an extra function for each global
object. To avoid this we could introduce some sort of overloading for 
@__cxa_atexit that could take dtor function with different parameters as well
as  object argument in different address spaces. It seems like a large change
to ABI and potentially not backward compatible. There could also be some hybrid
schemes where only @__cxa_atexit with address spaces is to be mangled. However
both options makes @__cxa_atexit implementation non-trivial.

-- 
You are receiving this mail because:
You are on the CC list for the bug.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-bugs/attachments/20201102/0d87a978/attachment-0001.html>


More information about the llvm-bugs mailing list