[llvm-dev] llvm-link: why link '@llvm.global_ctors' into dest file even it's not used in dest file?

Ronan KERYELL via llvm-dev llvm-dev at lists.llvm.org
Thu Jan 3 20:38:10 PST 2019

>>>>> On Thu, 3 Jan 2019 15:15:15 -0800, Mehdi AMINI via llvm-dev <llvm-dev at lists.llvm.org> said:

    Mehdi> Hi,
    Mehdi> On Wed, Jan 2, 2019 at 2:52 PM Fangqing Du via llvm-dev <llvm-dev at lists.llvm.org> wrote:

    >  Hi all,

    >  Recently I do some jobs based on llvm-link tool.  I wonder
    > why link '@llvm.global_ctors' into dest file, even it's not
    > used in dest file?

    Mehdi> This is a "magic" global variable:
    Mehdi> https://llvm.org/docs/LangRef.html#the-llvm-global-ctors-global-variable

    Mehdi> It is implicitly used by the loader of the program before
    Mehdi> entering main().

    Mehdi> Think about how a C++ global variable constructor can
    Mehdi> register itself and the "destination file" you're mentionning
    Mehdi> can query this registry.

But it is true that the dead-code elimination phases could remove it
when not used...

    >  And how can I remove it?

    Mehdi> Like other global variables? You need to transform the module
    Mehdi> yourself before linking it (if you believe it is safe to do
    Mehdi> so).

In our SYCL compiler I wrote a pass to remove it:

Look at
https://github.com/triSYCL/triSYCL/blob/master/doc/architecture.rst for
some context.

More information about the llvm-dev mailing list