[PATCH] D74166: [AIX][Frontend] Static init implementation for AIX considering no priority
Xiangling Liao via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Thu Jun 11 17:38:50 PDT 2020
Xiangling_L added inline comments.
================
Comment at: clang/include/clang/AST/Mangle.h:178
+ virtual void mangleDynamicDestructor(const VarDecl *D, raw_ostream &Out) = 0;
+
----------------
hubert.reinterpretcast wrote:
> I am not sure "destructor" is the right term here. This seems to be an analogue to the functions named using `mangleDynamicAtExitDestructor`, except that those rather directly perform destruction and are registered with `atexit` during initialization whereas these perform finalization and are "registered" by being called from an "sterm" function. What are the thoughts on `mangleDynamicStermFinalizer`?
`mangleDynamicDestructor` is an analogue to `mangleDynamicInitializer` actually.
>From this perspective, I think `mangleDynamicStermFinalizer` is good.
================
Comment at: clang/lib/CodeGen/CodeGenModule.h:1058
+ void AddCXXDtorEntry(llvm::FunctionCallee DtorFn) {
+ CXXGlobalDtors.emplace_back(DtorFn.getFunctionType(), DtorFn.getCallee(),
+ nullptr);
----------------
hubert.reinterpretcast wrote:
> The description of `CXXGlobalDtors` is
> > Global destructor functions and arguments that need to run on termination.
>
Currently, only Apple Kernal extension will use `AddCXXDtorEntry` to add variable destructor to CXXGlobalDtors.
An example is:
```
$cat test.cpp
class test {
int a;
public:
test(int c) {a = c;}
~test() {a = 0;}
} t(1);
$clang --driver-mode=g++ -target x86_64-apple-darwin10 -fapple-kext -flto -S -o - test.cpp
...
define internal void @_GLOBAL__D_a() #0 {
entry:
call void @_ZN4testD1Ev(%class.test* @t) #~test() {a = 0;}
ret void
}
```
Since the usage as you said below does not match with our sterm finalizer function `__cxx_global_var_destruct`, I am thinking we can either modify the name and the description of `CXXGlobalDtors` to make it also fit AIX or we can define a brand new `CXXStermFinalizers` vector and also related facility to `GenerateCXXStermFinalizerFunc` instead.
An example of modification I have in mind is:
`CXXGlobalDtorsOrStermFinalizers`
> Global destructor functions and arguments that need to run on termination;
> When UseSinitAndSterm is set, it contains sterm finalizer functions instead that need to run on unloading a shared library.
I would prefer the modification way to save a lot effort. Any thoughts on it?
================
Comment at: clang/lib/CodeGen/ItaniumCXXABI.cpp:4447
+
+ // Create __dtor function for the var decl.
+ llvm::Function *dtorStub = CGF.createAtExitStub(D, dtor, addr);
----------------
hubert.reinterpretcast wrote:
> We should probably report_fatal_error if `CXAAtExit` (the option) is true before this line. This would imply driver changes to default AIX to using `-fno-use-cxa-atexit`. An associated test file is https://github.com/llvm/llvm-project/blame/master/clang/test/Driver/cxa-atexit.cpp.
Maybe we should add `-fno-use-cxa-atexit` to driver in a follow-up patch?
================
Comment at: clang/test/CodeGen/static-init.cpp:15
+
+// CHECK: define internal void @__cxx_global_var_init() #0 {
+// CHECK: entry:
----------------
jasonliu wrote:
> #0 could be removed.
Why I chose to keep this `#0` is because to remove it, we would either remove the following `{` which I kinda feel makes the function look not nice or we need to match `#0` with regex which I think is redundant.
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D74166/new/
https://reviews.llvm.org/D74166
More information about the cfe-commits
mailing list