This is an archive of the discontinued LLVM Phabricator instance.

[AIX][Frontend] Static init implementation for AIX considering no priority
ClosedPublic

Authored by Xiangling_L on Feb 6 2020, 2:00 PM.

Details

Summary
    • Provides no piroirity supoort && disables three priority related attributes: init_priority, ctor attr, dtor attr;
  • '-qunique' in XL compiler equivalent behavior of emitting sinit and sterm functions name using getUniqueModuleId() function in LLVM (currently no support for InternalLinkage and WeakODRLinkage symbols);
  • Add testcases to emit IR sample with sinit80000000, dtor, and __sterm80000000
  • Temporarily side-steps the need to implement the functionality of llvm.global_ctors and llvm.global_dtors arrays. The uses of that functionality in this patch (with respect to the name of the functions involved) are not representative of how the functionality will be used once implemented.

Diff Detail

Event Timeline

There are a very large number of changes, so older changes are hidden. Show Older Changes
aaron.ballman added inline comments.May 2 2020, 8:00 AM
clang/lib/Sema/SemaDeclAttr.cpp
6822–6826

This change (and the others like it) should be done within Attr.td and not exposed here. You should make these attributes target-specific.

You should also update AttrDocs.td for these attributes to document that they're not supported on AIX.

clang/test/CodeGen/aix-priority-attribute.cpp
2–5

I think this test file should live in SemaCXX instead, as this is not testing the codegen behavior, but testing the semantic checking behavior.

ZarkoCA added a subscriber: ZarkoCA.May 7 2020, 7:44 AM
ZarkoCA added inline comments.
clang/lib/CodeGen/CGDeclCXX.cpp
690

I may be missing something but why do we need this now, as opposed to not needing it before? Why didn't we need to clear the CXXGlobalDtors after emitting the function function before?

clang/lib/CodeGen/ItaniumCXXABI.cpp
4435

Style guide now says no capitalization and no punctuation at the end for report_fatal_error messages.

Xiangling_L marked 7 inline comments as done.May 12 2020, 12:42 PM
Xiangling_L added inline comments.
clang/lib/CodeGen/CGDeclCXX.cpp
690

No, you didn't miss anything here. I just followed what EmitCXXGlobalInitFunc() does, which is to clear the std::vecotr once we are certain it's useless.

clang/lib/Sema/SemaDeclAttr.cpp
6822–6826

Thanks for your comments. As I mentioned in the below testcase, those three attributes actually will be supported by the follow-up patches for AIX. I will update them to report_fatal_error instead.

clang/test/CodeGen/aix-priority-attribute.cpp
2–5

Actually we will support those three attributes in the future, so the warning are placeholders waiting for the future upgrade where we do want to check the codegen results.

I agree the warnings here are confusing, I will update them with report_fatal_error.

Xiangling_L marked 3 inline comments as done.

Updated the warnings to report_fatal_error;
Update the testcases;

Fix a minor issue in the testcase

Clean clang-tidy warnings and clang-format errors

clang/test/CodeGen/static-init.cpp
14

Shouldn't this be internal?

Xiangling_L marked an inline comment as done.

Fix the linkage types;
Adjust the formatting;
Update the testcase;

Adjust mangleDynamicDestructor;
Add assertion and FIXME for getUniqueModuleId

jasonliu added inline comments.Jun 9 2020, 2:21 PM
clang/lib/AST/ItaniumMangle.cpp
5072

If I understand correctly, this function will come in pair with __cxx_global_var_init.
__cxx_global_var_init use number as suffix in the end to avoid duplication when there is more than one of those, but we are using the variable name as suffix here instead.
Do we want to use number as suffix here to match what __cxx_global_var_init does? It would help people to recognize the pairs and make them more symmetric.

clang/lib/CodeGen/CGCXXABI.h
112

Do we need this isCXXGlobalInitAndDtorFuncInternal? Looks like it's always going to return ! useSinitAndSterm() result.

clang/lib/CodeGen/CGDeclCXX.cpp
591

const for UseSinitAndSterm variable?

630

flip this for an early return?

680

We might want to avoid this string copy construction if possible.

clang/lib/CodeGen/CodeGenModule.h
20

Is this Attr.h needed somewhere in this file?

400

nit: UserSinitAndSterm -> UseSinitAndSterm?
and we do not have that property here.
Suggestion:
when getCXXABI().useSinitAndSterm() return true.

clang/lib/CodeGen/ItaniumCXXABI.cpp
4437

In this implementation we do not seem to have __srterm functions. I think we should refer to __dtor instead.

4470

Srterm is not used in this implementation.
Suggestion:
guard.hasDtorCalled

4472

I think we need a better naming for this and make it consistent with the end block below.
As it is for now, destruct.check is confusing, as we are not checking anything here and we are just going to call destructor directly in this block.

clang/test/CodeGen/static-init.cpp
10

Would it be better to test static init for at least two global variable?
Testing only one global variable does not show the whole picture of AIX static init.

jasonliu added inline comments.Jun 10 2020, 7:50 AM
clang/lib/CodeGen/CGDeclCXX.cpp
304

Is there a valid case that unatexit.getCallee() returns a type which could not be cast to llvm::Function?
i.e. Could we use cast instead of dyn_cast?

-fregister_global_dtors_with_atexit does not seem to work properly in current implementation.
We should consider somehow disabling/report_fatal_error it instead of letting it generate invalid code on AIX.

clang/lib/CodeGen/CGDeclCXX.cpp
599

I think report_fatal_error is more appropriate here? Since we know some case will trigger this, and we do not want those case to silently pass in non-assertion mode?

clang/lib/CodeGen/ItaniumCXXABI.cpp
4443

This comment is confusing.
This is not emitting __sterm function, this is emitting __cxx_global_var_destruct functions. And again, we do not have __srterm function in this implementation.

4459

nit: this is not sterm function.

Xiangling_L marked 17 inline comments as done.

Address the comments

clang/lib/AST/ItaniumMangle.cpp
5072

This is somewhere I am kinda on the fence. Personally, I think embed decl name in the cxx_global_var_destruct_ / cxx_global_vat_init_ as mangleDynamicAtExitDestructor does is more helpful for the user to debug the static init.
I am not sure if we want to give up that benefit and be consistent with current __cxx_global_vat_init_ using number suffix or do we want to replace number suffix by decl name for __cxx_global_vat_init_ as well.

clang/lib/CodeGen/CGCXXABI.h
112

AFAIK, not all platforms which use sinit and sterm have external linkage sinit/sterm functions. And also since for 7.2 AIX we are considering change sinit/sterm to internal linkage symbols, I seperate this query out.

clang/lib/CodeGen/CGDeclCXX.cpp
304

I used cast instead of dyn_cast before Diff 9 actually, and then I noticed that clang-tidy gave error and asked me to use dyn_cast instead. Cannot recall what the error says though...

clang/lib/CodeGen/CodeGenModule.h
20

Oops..this is something I forgot to remove. Good catch!

clang/lib/CodeGen/ItaniumCXXABI.cpp
4472

Thanks, I will try destruct.call instead.

jasonliu added inline comments.Jun 10 2020, 7:24 PM
clang/lib/CodeGen/CGCXXABI.h
112

I would prefer to create the query in the patch when we actually need it. With what we have right now, it seems redundant.

clang/lib/CodeGen/CGDeclCXX.cpp
630

It looks like one of the UseSinitAndSterm is redundant. We could have something like:

UseSinitAndSterm ? llvm::twine("__sinit80000000_clang_") + GlobalUniqueModuleId : llvm::twine("_GLOBAL__sub_I_") + getTransformedFileName(getModule())

which minimize the use of std::string?
If this is too long, then we could separate them into if statement just like what we have in EmitCXXGlobalDtorFunc, or use a lambda.

680

Could we assert !GlobalUniqueModuleId.empty() here?
Right now, it solely relies on EmitCXXGlobalInitFunc to run before EmitCXXGlobalDtorFunc to get GlobalUniqueModuleId initialized properly. I think it makes sense to put an assert here to make sure it stays in that case in the future.

687

This could go inside of the if (UseSinitAndSterm).

clang/lib/CodeGen/ItaniumCXXABI.cpp
4470

"guard.hasDtor" does not reflect what the meaning. Maybe matching with the variable name would make sense: "guard.needsDestruct" or just "needsDestruct"?

clang/test/CodeGen/static-init.cpp
15

#0 could be removed.

clang/lib/CodeGen/ItaniumCXXABI.cpp
4437

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.

clang/lib/CodeGen/CGDeclCXX.cpp
563

Consider having the SmallString<128> buffer passed in and returning a StringRef backed by that buffer.

clang/lib/CodeGen/CodeGenModule.h
1052

What is "the C++ global destructor function"? Based on the comment on CXXGlobalDtors it has something to do with termination of the program. The existing usage is limited and consistent: This is a facility used when even atexit is not available.

1054

The description of CXXGlobalDtors is

Global destructor functions and arguments that need to run on termination.

clang/lib/CodeGen/ItaniumCXXABI.cpp
4491

The purpose of the specific interface does not appear to match its usage here (see my other comment). This function is meant to be called on unloading a shared library. The usual termination path calls destructors via atexit.

clang/include/clang/AST/Mangle.h
175

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?

clang/lib/AST/ItaniumMangle.cpp
5072

Not every dynamically initialized non-local variable of static storage duration requires non-trivial destruction. These don't actually pair with __cxx_global_var_init; rather, they pair with the calls to atexit and the functions whose addresses are passed to atexit.

clang/lib/CodeGen/CGDeclCXX.cpp
304

If we expect cast to be okay, then we should use it without the if.

In Diff 8, an if is used with cast (thus a clang-tidy error make sense):

if (llvm::Function *unatexitFn = cast<llvm::Function>(unatexit.getCallee()))
Xiangling_L marked 21 inline comments as done.

Address another round of reviews;

clang/include/clang/AST/Mangle.h
175

mangleDynamicDestructor is an analogue to mangleDynamicInitializer actually.

From this perspective, I think mangleDynamicStermFinalizer is good.

clang/lib/CodeGen/CodeGenModule.h
1054

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?

clang/lib/CodeGen/ItaniumCXXABI.cpp
4437

Maybe we should add -fno-use-cxa-atexit to driver in a follow-up patch?

clang/test/CodeGen/static-init.cpp
15

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.

clang/lib/CodeGen/CGDeclCXX.cpp
292

Please add a comment explaining the meaning of the zero and non-zero return values.

596

I don't think we should capitalize "sinit" and "sterm" in comments. Indeed, there's a comment below where they are not capitalized.

629–630

The first sentence does not apply unconditionally in the status quo of this patch. Perhaps keep the original comment completely with something like:

// When not using sinit and sterm functions:
// ...
631

Can this part be committed in a separate patch? It does not appear to have dependencies on other parts of this patch and has the appearance of being a possible change for other platforms.

670

Following from my previous comments on CXXGlobalDtors, I am not convinced that __sterm functions match the role.

690

If this is another drive-by fix, can we put it in a separate patch?

803–805

This change would not belong in this function if its scope remains the generation of a "GlobalDtorsFunc" (based on my understanding of the latter).

clang/lib/CodeGen/ItaniumCXXABI.cpp
4435

s/unimplemented on AIX yet/not yet implemented on AIX/;

4457

Suggestion:
Create the finalization action associated with a variable.

4470

I don't think this is a real "guard variable". I think the comments need to explain this (including scare quotes for "guard variable".

clang/lib/AST/ItaniumMangle.cpp
5068

I believe these are actually paired with the __dtor_ functions. The prefix can be __finalize_.

clang/lib/CodeGen/CGDeclCXX.cpp
563

FileName should be a reference?

630

The binding of the second sentence in relation to "not using sinit and sterm" is not clear in this new version. I still recommend introducing a "block" with a colon.

632

Use a SmallString for FuncName.

633

Move Storage into the else block and use it only for calling getTransformedFileName.

clang/lib/CodeGen/CGDeclCXX.cpp
803–805

Please assert that Arg == nullptr iff we're dealing with sinit/sterm.

clang/lib/CodeGen/CodeGenModule.h
1054

I'm fine with renaming but it should include renaming the associated fuctions.

clang/lib/CodeGen/ItaniumCXXABI.cpp
4437

I'm okay with that.

clang/lib/CodeGen/CGDeclCXX.cpp
670

This function is to be renamed.

683

The called function is to be renamed.

clang/lib/CodeGen/CodeGenModule.h
1053

This function is to be renamed.

clang/lib/CodeGen/ItaniumCXXABI.cpp
4450

This function is to be renamed.

4462

Term, being a short form for "termination", the variable name does not match the purpose based on the terminology within the Clang context.

4479

This comment is not helpful. It does not say which action is associated with which state.

clang/test/CodeGen/aix-constructor-attribute.cpp
2 ↗(On Diff #270267)

Please split on the | with the new line beginning with FileCheck indented two spaces in relation to the previous line. Apply throughout.

jasonliu added inline comments.Jun 12 2020, 6:42 AM
clang/test/CodeGen/static-init.cpp
6

Looks like the non-inline comments are easier to get ignored and missed, so I will copy paste the non-inlined comment I previously had:

-fregister_global_dtors_with_atexit does not seem to work properly in current implementation.
We should consider somehow disabling/report_fatal_error it instead of letting it generate invalid code on AIX.
clang/test/CodeGen/static-init.cpp
10

I suggest adding also one each of the following:

  • a dynamic initialization of a non-local variable of type int
  • a constinit initialization of a non-local variable with non-constant destruction
clang/lib/CodeGen/CGDeclCXX.cpp
786

This function is to be renamed.

clang/lib/CodeGen/CodeGenModule.h
400

Minor nit: s/set/is set/;

Xiangling_L marked 35 inline comments as done.
Xiangling_L edited the summary of this revision. (Show Details)

Address another round of reviews;

clang/lib/CodeGen/CGDeclCXX.cpp
631

Sure. I will create a NFC patch for this part and try to commit it first. But so far, I think I can keep this part in this patch just for review purpose to make the patch look nicer?

683

Any suggestions here about how to represent the functionality of __sterm and _GLOBAL__D_a into one word? Cannot think of a good name...

Actually I am wondering do we need to rename the Destruct part? The __sterm and _GLOBAL__D_a do destruct the object by calling sterm finalizers and object destructors?

690

Sure, I will put it in the above mentioned clean-up NFC patch as well.

786

I will try GenerateCXXGlobalDestructFunc based on the thoughts as I also mentioned elsewhere that the __sterm and _GLOBAL__D_ function do destruct the object by calling sterm finalizers and object destructors.

Any suggestions or concerns about this renaming? Or do we really need to rename this one?

clang/lib/CodeGen/ItaniumCXXABI.cpp
4457

I don't get your point, can you elaborate on this a little bit?

clang/test/CodeGen/static-init.cpp
6

Thanks for doing so!

The semantic of global_dtors here on AIX is __sterm function, which we are never gonna register with __atexit. I am thinking we can disable it in a follow-up driver patch with the handling of -fno-use-cxa-atexit.

hubert.reinterpretcast marked an inline comment as done.Jun 12 2020, 6:22 PM
hubert.reinterpretcast added inline comments.
clang/lib/CodeGen/CGDeclCXX.cpp
631

Sure; you'd need the new patch to exist before rebasing on it anyway. We can leave the rebasing to the commit or later in the review.

683

Being clear in the naming of the function helps to signal its purpose to future maintainers. The sterm finalizers are unlikely to be understood from Destruct (it implies plain destruction a bit too much). Maybe "cleanup"?

786

I think "cleanup" works here too.

clang/lib/CodeGen/ItaniumCXXABI.cpp
4457

This is my suggestion for the comment (to replace "Create a variable destruction function").

clang/test/CodeGen/static-init.cpp
27

Okay, the restricted scope of this patch seems to landed in a place where how the llvm.global_dtors array will be handled is not indicated...

The backend should implement the semantics of the IR construct. When handling said array in the IR, it seems the method to handle the requisite semantics would be to generate an alias (with the appropriate linkage for the linker to pick it up) that is named using the __sinit/__sterm convention. Which is to say that at least some part of the naming should eventually move into the LLVM side and out of Clang.

Please update the description of this patch to indicate that:

  • The llvm.global_ctors and llvm.global_dtors functionality has not yet been implemented on AIX.
  • This patch temporarily side-steps the need to implement that functionality.
  • The apparent uses of that functionality in this patch (with respect to the name of the functions involved) are not representative of how the functionality will be used once implemented.
clang/test/CodeGen/static-init.cpp
6

The semantic of global_dtors is not limited to the __sterm functions associated with C++ cleanup actions. With respect to user-declared __attribute__((__destructor__)) functions, the option could improve the interleaving of those cleanup actions with cleanup actions registered by user-declared __attribute__((__constructor__)) functions.

This provides that rationale for separating the __sterm functions associated with the C++ cleanup actions from the other "destructor" functions.

clang/lib/CodeGen/CGDeclCXX.cpp
277

s/atexit has wrong parameter type/Argument to atexit has a wrong type/;

301

s/unatexit has wrong parameter type/Argument to unatexit has a wrong type/;

632

Replace the call to toNullTerminatedStringRef and the assignment with a call to toVector.

633

CreateGlobalInitOrDestructFunction currently calls Create with llvm::GlobalValue::InternalLinkage and also calls SetInternalFunctionAttributes. Setting ExternalLinkage after-the-fact seems brittle.

640

Replace the call to toNullTerminatedStringRef and the assignment with a call to toVector.

670

I think "cleanup" works here too.

677–678

s/Create our global destructor function/Create our global cleanup function/;

797

s/dtors/cleanups/;

clang/lib/CodeGen/CodeGenModule.h
471

Near duplicate comment line.

472

s/finalizers/finalizer/;
s/it contains/it instead contains/;

473

s/instead that need to run/, which also run/;

1053

s/a destructor/an sterm finalizer/;
s/global destructor/global cleanup/;

1054

s/Dtor/StermFinalizer/;

1448

s/destructs/performs cleanup associated with/;

clang/lib/CodeGen/ItaniumCXXABI.cpp
4441

There should not be period at the end of a report_fatal_error message.

4445

s/and/and (as appropriate)/;

4470

The "and the related [ ... ]" part is ambiguous in terms of describing unatexit versus the actions generated here.

Suggestion:
[ ... ] returns a value of 0, meaning that the cleanup is still pending (and we should call the __dtor function).

4471

Remove the "Otherwise [ ... ]".

4474

Does this fit on one line?

4482

Please add a test for a static local. Note the branch_weights. I do not believe the branch_weights associated with guarded initialization for a static local (what the called function is meant to deal with) is necessarily appropriate for a branch associated with finalization-on-unload.

clang/lib/Sema/SemaDeclAttr.cpp
6824

s/unsupported on AIX yet/is not yet supported on AIX/;

6836

s/unsupported on AIX yet/is not yet supported on AIX/;

7068

s/unsupported on AIX yet/is not yet supported on AIX/;

clang/lib/CodeGen/ItaniumCXXABI.cpp
4475

There are uses of CreateIsNull with snake_case; this is the only camelCase instance.

clang/test/CodeGen/static-init.cpp
15

Minor nit: Don't use a semicolon after a namespace definition. Apply throughout.

clang/test/CodeGen/static-init.cpp
27

I think the llvm.global_ctors usage is also more extensive here (and not symmetric on the finalization side):

struct C {
  C(int) {}
  ~C() {}
};

C c0 = 42;
template <typename T> C c = 42;
inline C c1 = 42;

int main(void) {
  (void) &c<int>;
}
Xiangling_L edited the summary of this revision. (Show Details)Jun 15 2020, 4:46 PM
Xiangling_L marked 35 inline comments as done.

Renamed some functions;
Add one more test;
etc.

clang/lib/CodeGen/ItaniumCXXABI.cpp
4482

Thank you for pointing this out. I will adjust the function name to EmitCXXGuardedInitOrDestructBranch later to match our usage.

In terms of branch_weights, this is something I am not familiar with. So please correct me if I am wrong. Some of my superficial thoughts would be are we able to apply branch_weights on a branch associated with finalization-on-unload? Should it be set as nullptr, because we would not know how many times we will call __sterm(and each sterm finalizer contained)?

BTW, I will add a testcase for a static local and we can update the branch_weights part later along with the reviews.

clang/test/CodeGen/static-init.cpp
6

Yeah, I agree that the semantic of global_dtors should contain both __sterm and __attribute__((__destructor__)) dtors. And we do need some rationale to separate __sterm and those other destructor functions out for AIX.

However, I doubt the -fregister_global_dtors_with_atexit option is something we should use. Cuz dtors with __attribute__((__destructor__)) actually are equivalent to __dtor functions in AIX's semantic which need to be registered with __atexit. However, we shouldn't register __sterm with __atexit. So it seems this option does not work well for AIX either we set it to true or false, and we need to figure something else out when we start supporting __attribute__((__destructor__)) and __attribute__((__constructor__))?

27

Yes, we should definitely test template variable(and other WeakODR linkage symbols) and inline variable. However, this patch hasn't covered these aspects yet. My plan was to set the basic frame using this patch, and have some small follow-up patches to clean up the implementation. Do you think we should cover these in this patch as well? I kinda feel it's already a bit big one..

clang/lib/CodeGen/ItaniumCXXABI.cpp
4482

I don't think we want to generate branch_weights. We already expect __sterm to be called rarely. Just changing the function name is not going to help though. A caller would need to indicate which of "init" or "destruct" is intended.

clang/test/CodeGen/static-init.cpp
6

Yes, we should look further into this when __attribute__((__destructor__)) is supported.

The difference between atexit-registered functions and __sterm functions is in whether or not they are run when unloading a module (which termination also does).

Thanks for your observation re: the similarity between __attribute__((__destructor__)) functions and the __dtor functions. Thinking about it a bit, the level of similarity is rather tied to the option in question. If we choose to register using atexit, we need to consider introducing the corresponding unatexit. This means that even when the option in question is active, we will produce entries into the global_dtors array at the IR level.

27

The patch is already limited in scope in such a way that covering the WeakODR linkage cases would not fit well. I'm fine with handling them later. There may be work specific for these with respect to the symmetry between the initialization and the finalization.

jasonliu added inline comments.Jun 17 2020, 7:58 AM
clang/lib/CodeGen/CGDeclCXX.cpp
699

Correct me if I'm wrong...
GlobalUniqueModuleId will always get “initialized" in EmitCXXGlobalInitFunc. And EmitCXXGlobalInitFunc will always run before EmitCXXGlobalCleanUpFunc in CodeGenModule::Release(). So in theory, we do not need to initialize it again in here.
If we could not assert (!GlobalUniqueModuleId.empty()) here, that tells me in EmitCXXGlobalInitFunc we effectively get an empty string after GlobalUniqueModuleId = GlobalUniqueModuleId.substr(1);. So something is not right?

clang/lib/CodeGen/CodeGenModule.h
470

Word after ; should not be Capitalize. We should use small case, or change this to ..
I would prefer changing it to ..

clang/test/CodeGen/static-init.cpp
138

Is checking this Attrs necessary?

153

I think we used to have dso_local marked on sinit and sterm function in previous diff. Now they are gone. What's the reason for removing them?

jasonliu added inline comments.Jun 17 2020, 8:45 AM
clang/lib/CodeGen/CGDeclCXX.cpp
805

nit: trailing whitespace

clang/test/CodeGen/static-init.cpp
27

nit: trailing whitespace in this line.
struct Test4 {

Xiangling_L marked 11 inline comments as done.
Xiangling_L edited the summary of this revision. (Show Details)

Remove trailing spaces;
Update the testcase;
Adjust the EmitGuardedInitBranch function;

Xiangling_L added inline comments.Jun 17 2020, 7:14 PM
clang/lib/CodeGen/CGDeclCXX.cpp
699

Actually GlobalUniqueModuleId will not always get “initialized" in EmitCXXGlobalInitFunc. In some cases, only __sterm will be generated for the var decl.
e.g.
The static local variable won't be inited before main() but when called at the first time.

struct Test4 {
  Test4();
    ~Test4();
  };

  void f() {
    static Test4 staticLocal;
  }
clang/test/CodeGen/static-init.cpp
138

I missed to delete this line. Thanks for pointing it out.

153

dso_local affects calls to the function in terms of how the compiler will do the optimization on the call. Since we won't be generating any calls to the function (the linker arranges for the calls to happen indirectly), marking them dso_local does not help any. So I think it doesn't really matter if we put dso_local here.

Xiangling_L marked an inline comment as done.

Adjust the patch corresponding to D81972;

Fix the previous bad version;

jasonliu added inline comments.Jun 18 2020, 7:40 AM
clang/lib/CodeGen/CGDeclCXX.cpp
340

Do we need to change/complicate the interface for this function, just to do a call to Builder.CreateCondBr()?
Could we call that function directly from where it's needed?

629–630

This comment does not apply well on top of this early return for some platform. I think you could move it to current line 665?

Xiangling_L marked 3 inline comments as done.

Removed a redundant header file;
Addressed comments;

clang/lib/CodeGen/CGDeclCXX.cpp
340

Sure, we can. Thank you for your suggestion. I was hoping to use one function to synthesize the guarded init or destruct branch. But I think it seems better if we wait for further more usage of guarded destruct branch to do so and not complicate stuff in this patch.

jasonliu accepted this revision.Jun 18 2020, 10:14 AM

LGTM. But I suggest to wait for @hubert.reinterpretcast to have another scan at this before landing.

This revision is now accepted and ready to land.Jun 18 2020, 10:14 AM
hubert.reinterpretcast marked an inline comment as done.

Thanks; LGTM with minor nit.

clang/lib/CodeGen/CodeGenModule.h
1053

Minor nit: "a sterm" should be "an sterm" if "sterm" is pronounced like "es-term".

clang/test/CodeGenCXX/aix-static-init.cpp
188 ↗(On Diff #271747)

Just a comment: The finalization order of static locals in relation to non-locals cannot (using the mechanisms available) be guaranteed to be consistent with the reverse order of initialization. I don't think that there is a clearly "correct" order, so "whatever falls out" is probably okay.

Xiangling_L edited the summary of this revision. (Show Details)Jun 19 2020, 4:52 AM
This revision was automatically updated to reflect the committed changes.
Xiangling_L marked an inline comment as done.

@rjmccall

FYI this diff appears to be breaking a ptrauth test on apple/swift/master-next (clang/test/CodeGenCXX/ptrauth-static-destructors.cpp).

Investigating this further.

@rjmccall

FYI this diff appears to be breaking a ptrauth test on apple/swift/master-next (clang/test/CodeGenCXX/ptrauth-static-destructors.cpp).

Investigating this further.

Looks like this was addressed in:

https://github.com/apple/llvm-project/commit/8e8176c0bee7215b397d78cfff6e617cfc50e248

and
https://github.com/apple/llvm-project/commit/4292b7edfcf0672da076a0b4e3d4fde8b2672359#diff-75a7118d42116297f6a0b1a0fd020604