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

    <tr>
        <th>Summary</th>
        <td>
            [clang] module should not emit module initializer if it is not used in the module
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            clang
      </td>
    </tr>

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

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

<pre>
    ```cpp
//mymodule.cppm
module;

export module mymodule;
```
```cpp
//main.cc
import mymodule;

int main(){}
```
```
clang++ --precompile mymodule.cppm -std=c++26 -Ofast -o mymodule.gcm
clang++ -o main main.cc -std=c++26 -Ofast -fmodule-file=mymodule.gcm -fuse
-ld=lld
warning: the form '-fmodule-file=<BMI-path>' is deprecated for standard C++ named modules;consider to use
      '-fmodule-file=<module-name>=<BMI-path>' instead [-Weager-load-cxx-named-modules]
1 warning generated.
ld.lld: error: undefined symbol: initializer for module mymodule
>>> referenced by C:/Users/unlvs/AppData/Local/Temp/main-c847e4.o:(_GLOBAL__sub_I_main.cc)
clang++: error: linker command failed with exit code 1 (use -v to see invocation)
```
The asm it generates will "jmp     _ZGIW8mymodule". However, GCC does not emit that after my complaint before. If the module has global variables, it should emit no symbol.
```
        .text
        .def    @feat.00;
        .scl    3;
        .type   0;
        .endef
        .globl  @feat.00
.set @feat.00, 0
        .file   "main.cc"
        .def    main;
        .scl    2;
        .type   32;
        .endef
        .globl  main # -- Begin function main
        .p2align        4, 0x90
main:                                   # @main
.seh_proc main
# %bb.0:
        pushq   %rbp
        .seh_pushreg %rbp
        subq    $32, %rsp
        .seh_stackalloc 32
        leaq    32(%rsp), %rbp
        .seh_setframe %rbp, 32
        .seh_endprologue
        callq   __main
        xorl    %eax, %eax
        addq    $32, %rsp
        popq    %rbp
        retq
        .seh_endproc
 # -- End function
        .def    _GLOBAL__sub_I_main.cc;
        .scl    3;
        .type   32;
        .endef
        .p2align        4, 0x90                         # -- Begin function _GLOBAL__sub_I_main.cc
_GLOBAL__sub_I_main.cc:                 # @_GLOBAL__sub_I_main.cc
# %bb.0:
        jmp     _ZGIW8mymodule # TAILCALL
                                        # -- End function
        .section        .ctors,"dw"
        .p2align        3, 0x0
        .quad   _GLOBAL__sub_I_main.cc
        .section        .drectve,"yni"
        .addrsig
        .addrsig_sym _GLOBAL__sub_I_main.cc
```

```
g++ -c mymodule.cppm -Ofast -std=c++26 -fmodules-ts
g++ -o main main.cc mymodule.o -Ofast -std=c++26 -fmodules-ts
```

```
g++ -c mymodule.cppm -Ofast -std=c++26 -fmodules-ts
g++ -S main.cc mymodule.o -Ofast -std=c++26 -fmodules-ts
g++: warning: mymodule.o: linker input file unused because linking not done

        .file   "main.cc"
        .text
        .section        .text.startup,"x"
        .p2align 4
        .globl  main
        .def    main;   .scl    2;      .type   32;     .endef
        .seh_proc       main
main:
.LFB0:
        subq    $40, %rsp
        .seh_stackalloc 40
        .seh_endprologue
        call    __main
        xorl    %eax, %eax
        addq    $40, %rsp
        ret
        .seh_endproc
        .def    __main; .scl    2;      .type   32;     .endef
        .ident  "GCC: (GNU) 15.0.0 20240629 (experimental)"
```

Also, I do think gcc just reuses -c option and .o file which is a better choice plus clang should be compatible with GCC
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJy8V0tv67oR_jX0ZiBBpvzSwovYuU4DpL2LnosLdGNQ5EjiORSpQ1KJ019fUJJt-ZHctAdoYMQWH998wxnOfGLOyVIjrsl8Q-aPE9b6yti1t9w6aVFMciPe12SR9B_eNCR5JMkDoTtCd_V7bUSrMOZNU_cT_QBJN8O67j8eGmM99HNw3HVedIS_ery2xqSOOe-HZN1D3mD1s9pDWE7oitCMLDdk-fi5rf6RK6ZLQjeEbiCKGovc1I0cce48hch5QdJH3q-kC4h-L5jzEJnzwpLXdzBNRwsGVz4GKnqUqJDBt8cxKkRF67DHjlTYrpToH9-Y1VKXJH0AXyEUxtZA6PIajaTbzd-fo4b5iqS_EboE6UBgcJd5FGEfOM-0YFbAdqCuWY1iCKEj6YYb7aRAC97AiQ90f_dNDgMBJ1i9S0M7j0wAmW-iP5GVaCNlmIj44dDtE9HR_nwI5xQGn6FEjTbQj_sZJeJwLukDoLXGhh-tFlhIjQLce50bFcakll4yJf-NtvP7Okf7LAl8wwcsFmhRcxSQv8OWpCE3_3BoHaG7VqvX8P3QNI_MM0J3L4YzRejuG9bNkMERX82WOItNt3e1f3r5ffPwst-7Nt8_7485TrOb5LlwRUn9Ay1wU9dMCyiYVCjgTfoK8CA9cCMQpkDoqnUI0WuIkkMEqV8NZ14afTJxdQW-VQjM1SD96UgdvEmlgFD6vW5Iku3_9fT85-p0RJTG8Dfzhq9oCd3C03YLwqADbTxgLT34inlghUcL9Xvg3CgWbmiOhbEYw3PRpetw9BVzUCqTMwWvzEqWh3jTbSDkKtMq0YNqM0Qxvn-xkyz2ePDnJ4EFSTIySwpkPk6SUcnIYscVSbL0Ysy_N0iS7HIh6g7n-BiIqkvYbi526GE0SLcwItZdiiQjlJ7iTa-JduXrliK9RzGlX-HYVR5CU4gi2GApNRSt5iEX-lp52tBQpmSpSZLNOuKHbODecxpu-ad_wQyZJWfc2GG1b6zhY1thEZ3neZyEy3C037Su-tkdz9zmzegAAkLrKoslXM25Nu93zFIaKIdpd7XVecZ_MKUMh_R82grZz_4EQ6vodtHsCHFt3aEvLKvxOEm3Y6huCWrRWKNM2eJpgjOlgpH9_uKcD8aq3k1kh8Fk-HWcZ0J85lRjmjunZNH_vMdoaJvH-P8WisYQ_evM-6AkffG6fJ6Ld1Lr0xy6TdUP2HUWPmJ-m7FDfn4G9kF23iuBHdy3h-eX7cPLy7gTfu2ifBgPh8NAFnNvQo_ZEkrF20W5OB9p2h_pqND8bJn4OKL37AiL3L9ib-ldywtTTAjrZHkzsHfv9aeBuSnOdwZPGolfq61BE91opUFjuMi7K4grmXXCM_8F2P-b8z9_je5IJYxk4BlqpBqkbloPoQlBq1sXtAxyFoRCWBDEVGjdwmi8cP0vG9dlvx0lVZiInWfWt02fWYd7KQyz-03rw9Z42RSvS9BN8Tm2oAvYoacNXeplt7m47efGMkv-urGEspZ8rR_8Sju4S8Wi_6Tuj6r7_n89PilQ-z76T9sgfYO8fPrHH4RmMJ3HSZwATegsWdAszOChQStr1D5I4Owc8Hv36kE5E5x6BmHAV1L_gJJz-N46DxZbhy7cMdN0LSAo3tj0CfxWSV6F9xcGOfogMXllJEdoVOugk89H2Zhjpz2Zl3nYGLTy03Y7EetUZGnGJrieLqfZMkuT2XRSrWc4zxbT5WI1TzOer6ZiteILnLN5thCLRTqdyHXn7jKZJknYGU_nq0WBq-VikebzxWpKZgnWTKpYqdc6NracSOdaXGdLOptNFMtRue7Fm9JB59PwDm7XYX2Ut6Ujs0RJ590ZwUuvurf1fsf88SibBydPonsYHr_fyCKIaNkr8-7eSz1S3pPWqnXlfeP61xpCd6X0VZvH3NSE7gKH4StqrPmO3BO661wKbz29V69r-p8AAAD___r-tM0">