<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=https://github.com/llvm/llvm-project/issues/87142>87142</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            Get unexpected static variable initialization order when use -flto=full
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            new issue
      </td>
    </tr>

    <tr>
      <th>Assignees</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Reporter</th>
      <td>
          akemihomura0105
      </td>
    </tr>
</table>

<pre>
    ## problem
use the following command to compile:
**clang++ -stdlib=libstdc++ --gcc-toolchain=/opt/tool/gcc-9.1.0/ -flto=full main.cpp a.cpp -g -fpic && ./a.out**
and get a coredump.
![image](https://github.com/llvm/llvm-project/assets/43955018/be35848f-0bb9-4ad3-8e3c-0b177c40251a)
MyClass::ptr is a unexpected nullptr.

MyClass::ptr, boom are in the same compile unit, and MyClass:ptr is defined previous than the boom variable, so MyClass::ptr should be initialize before the boom initialize. However, in this case, boom is initialize before MyClass::ptr. I don't know it's gcc-toolchain bug or clang bug.
Here is the source code:
```
// a.h
class A
{
    public:
        static A& getInstance()
 {
            static A t;
            return t;
        }
 virtual int fun() const
        {
            return 42;
 };
};
class MyClass
{
    public:
        const static inline A* ptr = &A::getInstance();  // should be initialize before MyClass::ptr, am I wrong?
};

// a.cpp
#include "a.h"
static auto boom = MyClass::ptr->fun();  // MyClass::ptr is nullptr, initialize before MyClass::ptr.

// main.cpp
#include <iostream>
int main()
{
}
```
Here is some part of the assemble code:

```0000000000001c30 <__cxx_global_var_init.1>:
    1c30:       55      push   %rbp
    1c31:       48 89 e5                mov %rsp,%rbp
    1c34:       48 8b 3d 3d 24 00 00    mov    0x243d(%rip),%rdi # 4078 <_ZN7MyClass3ptrE>
    1c3b:       48 8b 07                mov (%rdi),%rax
    1c3e:       5d                      pop    %rbp
    1c3f:       ff 20                   jmpq   *(%rax)

0000000000001c60 <__cxx_global_var_init.2>:
    1c60:       55                      push %rbp
    1c61:       48 89 e5                mov    %rsp,%rbp
    1c64:       0f b6 05 15 24 00 00    movzbl 0x2415(%rip),%eax        # 4080 <_ZGVN7MyClass3ptrE>
    1c6b:       84 c0                   test   %al,%al
 1c6d:  74 02                   je     1c71 <__cxx_global_var_init.2+0x11>
    1c6f:       5d                      pop %rbp
    1c70:       c3                      retq   
    1c71:       48 8d 3d 08 24 00 00    lea    0x2408(%rip),%rdi        # 4080 <_ZGVN7MyClass3ptrE>
 1c78:  e8 e3 00 00 00          callq  1d60 <__cxa_guard_acquire@plt>
 1c7d:  85 c0                   test   %eax,%eax
    1c7f:       74 ee   je     1c6f <__cxx_global_var_init.2+0xf>
    1c81:       e8 2a 00 00 00  callq  1cb0 <_ZN1A11getInstanceEv>
    1c86:       48 8d 05 43 23 00 00    lea    0x2343(%rip),%rax        # 3fd0 <_ZZN1A11getInstanceEvE1t>
 1c8d:  48 89 05 e4 23 00 00    mov    %rax,0x23e4(%rip)        # 4078 <_ZN7MyClass3ptrE>
    1c94:       48 8d 3d e5 23 00 00    lea 0x23e5(%rip),%rdi        # 4080 <_ZGVN7MyClass3ptrE>
    1c9b:       5d      pop    %rbp
    1c9c:       e9 cf 00 00 00          jmpq   1d70 <__cxa_guard_release@plt>
```

## environment
**clang++ version**:
clang version 19.0.0git (https://github.com/llvm/llvm-project.git 33d804c6c2786cbbbc13743060f08d679941e0a4)
Target: x86_64-unknown-linux-gnu
Thread model: posix
InstalledDir: /usr/local/bin

** lld version **
LLD 19.0.0 (compatible with GNU linkers)

** llvm compile command **
cmake -B build -S llvm -DCMAKE_CXX_COMPILER=clang++ -DCMAKE_C_COMPILER=clang -DLLVM_ENABLE_LTO=Thin -DLLVM_ENABLE_LLD=ON -DLLVM_ENABLE_LIBCXX=ON -DCMAKE_BUILD_TYPE=Release -DLLVM_ENABLE_PROJECTS="clang;clang-tools-extra;libc;lld;lldb" -DLLVM_ENABLE_RUNTIMES="libunwind;libcxxabi;libcxx;compiler-rt" -DLLVM_TARGETS_TO_BUILD=X86 -DCLANG_DEFAULT_CXX_STDLIB=libc++ -DCLANG_DEFAULT_LINKER=lld -DCLANG_DEFAULT_RTLIB=compiler-rt -DCLANG_DEFAULT_UNWINDLIB=libunwind -DLLVM_ENABLE_LLD=ON

** linux kernal version **
5.10.134-15.1.al8.x86_64

**gcc version**
gcc (GCC) 9.1.0

here is the code zip
[tmp.zip](https://github.com/llvm/llvm-project/files/14810745/tmp.zip)

</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJycWFuT2rgS_jWaly67ZMk3HuYBxjA7Z8lka0L25OwLJcsyaCNfIsszbH79KdkGDDi3pSgulrr76_6-li2xppG7Uoh7FCxQkNyx1uwrfc8-i0Luq6LVDHs4uEur7J97RCgiFGpdpUoUCCcIz9tGgNkLyCulqjdZ7oBXRcHKDExlf9ZSCUTn_WRE7JsrVu4QWSCyAKcxmZIpoomSaWMyfrzu7Dh3TFUpvmeyRDRBZFXVBpGVvYjIyo7PXM_FiKzAyZWpEE3yVikomCxdXtfAuk9nB05eSw6IhIiE4CKyYm7Vmh5Nj8wC3gkDDHilRdYWtXuE7KFgIQu2EyhIEIn3xtSNzYisLApp9m3q8qpAZKXU6_HLqXX1t-AWL2saYRpEVj6dBQH2YkRWqaBB7Me5g9N05vgso04sKHdw6kUR9zEJPIbIrIfw7p8HxZouJp3XRoNsgEFbikMtuBEZlK1StdFHxJNGiDxAWlUFMC1Alh1nDSvEkSNoS2nsJFuJs_EQLhO5LEUGtRavsmobMHvW--h8vjItWaqEtW8quAHc7KtWZZDayNJIpuRXAanIKy3OTs5DLvxWvYlX0YHusMoGOGvEKQnZTHi6DuvCE2RViUhk4HNZvYFNMGrgQlmQtjuoNHSitH-GKv4mbJ2avk5Vq7mtVDaScoiH9yATqwZg7r7_zy0SOM6NFv0PAIC6TZXkJz8wvBrDjOQwtwrdCfNUNoaVXCASn3QAF36uDcEgOjGshWl1OTGIomS48Cq1aZkCWRrI27IPCbwqG3Nt8u0APjlHsK6Pf8a_-6Icafrp0nRIjnnKUslS2DrNwUoL0cQ29rxn_bZydAEwkPM9FU61CyvgCd50Ve4QXd1mc0U8r-vjFSpLrtpMACLEKoKQfmRIgbWm6mVswV9HdhBdnlgYw59aBobO7_vkh_0wgfu4Vt5Cpw-yaowWrEB02Q9bgViDsShPBJ70dNUZx0ZqqkJAzbSBKu-6yq6LRaqu--rSx_jlcYotru2WHw7bnapSpravTG9t6q5nYY6lY6d3F2ZBAAjP6rbZWxGTQKf1xTSvn-bHEM9ABGN1W8Oieu2smhqRhwlz_2yeAs3sm_iAsX0P5gCAD8SnWVe6QMvaFrD3lkmwd1UfR3GX3V_P0cAcrY1enqo_REvH0XA0DTbuHZ-DsMOFEzEUJoPbly1VVcN0qfLeMM-B4AnDv4v6S2c4HzCww1kp3ecloeF3CCW3hIZnQqdxW4pvUYc_QfCQ7jc4DgeOcQ5pCDgAL7jm-GuqOo694JZjwQ6ncB3VcZ_3X49_fpfscCA79oFPlduIxvTAmeojMTXYezzMeuPIB0ymuBLQR4m875FAFvjgedfA8h8L6LaK0UAfp9NWWphOPWOTEXVdZ-H4ovBKMBiaC8fTzfWLhfd4FPcxRQyCDqEwPsPkTKkvAF52Vi_b7lqmsy3jX1qpBfJxrcyFz4GMOPgRk8K2zCCai0rkJzqFuOAvzH_EX35FX-ydMiTsnOEoN54OhXr25p43uq0uX699hWOGcAA-BUKnGKI-nWDosjVong2BJyIvvYuaxtm4rXEAwr-IPGrrrqYWgvDHEC618VPr78y_EqQIbtLtAk0sA_9CjX3M9NRt31ucZ3xgdQY8n9DtsDh7WXSjWy2UsM_Xl7q9fsY9PiNY8KJ8lboqC1Gab-3tXoVupH3-7saOK3n_oD2MgTdzsYt30sAvb61ca0VpFmOfh5xEccjTNOUejXyKQ5zjOAuj2cz3BGb-6S60YXonDKJzOMThNvSdtrR7g9JRsmwPzq5sh3l7LVgGRZUJZWfXVSOHfuwEqZTIEqntECKrttEWXcXtOrxKZXlZse5pVanslPZ467leJ0MZbA3sdowZaZ-L3qTZw-PzR1Cy_Cx0c3UnPbl9LU6buOPee-yfF-yzAGcBaStVBs6H3sRJHt7Nf19uHz592j68f_fH03r5gmhysTk_TrmZAE6yXv_5brt8ni_Wy-168x7RZLOX5fXAOkE0ef98fflp8fDp03GkD7L4-LROtpv__bFENHnp9Xhl9sfL-_8sHzYfutMA0iOli-6729A1jjgYzRBdKJly-6Wy_jNFhFw5e_n4vHl6txycKZm25Zsss8H4cGCpPP22UfoKa0ebka_N_OVxufmw3bzv8SOafIpDm9N6_vy4TZar-cf1pqvxh02yflr0Bx38XOCLeeun59-7IlutXA--bHr7EZKbOR-f__v0fI7Tp_QNTqa0ZHsAPgtdMjWp1cD1sOtR3_EC13OZit2-i2597Ti_WgC6QXsZkfjx4cEuv_35zch2P9p1220BfJXHrUmwMEXt2v__7hgml0o0iKw8P_Zw5AeIrI4Oj311l93TbEZn7E7ce5HnRTHGAb7b32eRJ2Zeynw_5sTzU5KGWTrLGaEZo34c3cl7gomPKcU4JBHFbi6IyKMMzwQPgjCKkY9FwaRyLSq30rs72TStuI8jzyd3iqVCNd0RHCGleINu0O4bg-RO33eZpO2uQT5WsjHN2YuRRon7R2HG50HDPvN4KnPeGjJjCa10JjS87UUJre2x0dnZXavV_S-XtkNra9tl8_8AAAD__6AYnSE">