Thread overview
Linux LTO with lld from llvm 9
Oct 04, 2019
Newbie2019
Oct 04, 2019
kinke
Oct 10, 2019
Newbie2019
Oct 10, 2019
kinke
Oct 10, 2019
kinke
Oct 12, 2019
Newbie2019
Oct 04, 2019
David Nadlinger
October 04, 2019
If I link without druntime, can I use lld from linux ?

when I link with gold I get this error:

ld-new: fatal error: LLVM gold plugin has failed to create LTO module: Unknown attribute kind (62) (Producer: 'LLVM9.0.0' Reader: 'LLVM 8.0.1')
clang-8: error: linker command failed with exit code 1 (use -v to see invocation)

I try rebuild the ld-new, but seems not fix the problem.

I guess lld is a better link since it from llvm team,  how can i use it with ldc or clang for LTO and linux ?
October 04, 2019
On Friday, 4 October 2019 at 03:06:19 UTC, Newbie2019 wrote:
> If I link without druntime, can I use lld from linux ?

Should work, independent from whether you link with or without druntime. If you have clang and lld installed, specify `-gcc=clang -linker=lld` in the LDC cmdline; when linking with clang directly, use `-fuse-ld=lld`.

> ld-new: fatal error: LLVM gold plugin has failed to create LTO module: Unknown attribute kind (62) (Producer: 'LLVM9.0.0' Reader: 'LLVM 8.0.1')
> clang-8: error: linker command failed with exit code 1 (use -v to see invocation)

The problem here is that the produced bitcode is v9, but the gold plugin is from LLVM v8.0.1. LDC v1.18.0-beta2 features the v9 gold plugin; it'll probably also work when updating your clang to v9.
October 04, 2019
On 4 Oct 2019, at 4:06, Newbie2019 via digitalmars-d-ldc wrote:
> when I link with gold I get this error:
>
> ld-new: fatal error: LLVM gold plugin has failed to create LTO module: Unknown attribute kind (62) (Producer: 'LLVM9.0.0' Reader: 'LLVM 8.0.1')
> clang-8: error: linker command failed with exit code 1 (use -v to see invocation)

Seems like you are trying to use LTO with LDC built against LLVM 9.0, but the linker plugin (probably from clang) is built against LLVM 8.0? The plugin [1] is separate from the linker itself.

ld.gold should generally work fine. Perhaps others can chime in as to what the current situation with LLD on Linux is; I haven't tried it recently.

 — David


[1] https://llvm.org/docs/GoldPlugin.html
October 10, 2019
On Friday, 4 October 2019 at 09:54:44 UTC, kinke wrote:
> The problem here is that the produced bitcode is v9, but the gold plugin is from LLVM v8.0.1. LDC v1.18.0-beta2 features the v9 gold plugin; it'll probably also work when updating your clang to v9.

Thanks for the explain.  I add `-gcc=clang -linker=lld --plugin=/opt/build/llvm/build/lib/libLTO.so --flto-binary=/opt/build/llvm/build/lib/libLTO.so` to ldc,  but ldc2 not pass libLTO.so into clang,  and the ld.lld still run with  `-plugin /usr/bin/../lib/LLVMgold.so`.  how could I use the new builded libLTO.so instead LLVMgold.so ?


On Friday, 4 October 2019 at 14:50:26 UTC, David Nadlinger wrote:
> Seems like you are trying to use LTO with LDC built against LLVM 9.0, but the linker plugin (probably from clang) is built against LLVM 8.0? The plugin [1] is separate from the linker itself.
>
> ld.gold should generally work fine. Perhaps others can chime in as to what the current situation with LLD on Linux is; I haven't tried it recently.

Thanks for the explain.


October 10, 2019
On Thursday, 10 October 2019 at 08:44:32 UTC, Newbie2019 wrote:
> On Friday, 4 October 2019 at 09:54:44 UTC, kinke wrote:
>> The problem here is that the produced bitcode is v9, but the gold plugin is from LLVM v8.0.1. LDC v1.18.0-beta2 features the v9 gold plugin; it'll probably also work when updating your clang to v9.
>
> Thanks for the explain.  I add `-gcc=clang -linker=lld --plugin=/opt/build/llvm/build/lib/libLTO.so --flto-binary=/opt/build/llvm/build/lib/libLTO.so` to ldc,  but ldc2 not pass libLTO.so into clang,  and the ld.lld still run with  `-plugin /usr/bin/../lib/LLVMgold.so`.  how could I use the new builded libLTO.so instead LLVMgold.so ?

Since v1.17, LDC doesn't specify the plugin anymore when linking with LLD, as it shouldn't need it. So looks like your clang is adding a plugin path. You can explicitly add it with `-L-plugin=/opt/build/llvm/build/lib/libLTO.so` (`-plugin` is for LLVM/clang plugins) in the LDC cmdline (and make sure to specify `-flto=<thin|full>`). If you don't succeed, try with `-linker=gold`, where the plugin path is added by LDC automatically.
October 10, 2019
On Thursday, 10 October 2019 at 18:53:22 UTC, kinke wrote:
> If you don't succeed, try with `-linker=gold`, where the plugin path is added by LDC automatically.

And, more importantly, the linker definitely uses that plugin with matching LLVM version; LLD might ignore it and so use its LLVM, which is apparently v8 in your case.
October 12, 2019
On Thursday, 10 October 2019 at 18:56:31 UTC, kinke wrote:
> And, more importantly, the linker definitely uses that plugin with matching LLVM version; LLD might ignore it and so use its LLVM, which is apparently v8 in your case.

I rebuild ldc with lld & llvm9, it can generate the binary with clang8.

with  -linker=gold, or with  -L-plugin=.   make the link pass 2 or 3 plugin to link.

 /opt/local/bin/ld.lld -z now -z relro --hash-style=gnu --eh-frame-hdr -m elf_x86_64 -static -o tests_ng2.exe /usr/bin/../lib/gcc/x86_64-alpine-linux-musl/9.2.0/../../../crt1.o /usr/bin/../lib/gcc/x86_64-alpine-linux-musl/9.2.0/../../../crti.o /usr/bin/../lib/gcc/x86_64-alpine-linux-musl/9.2.0/crtbeginT.o -Llib -L/opt/build/lib -L/usr/bin/../lib/gcc/x86_64-alpine-linux-musl/9.2.0 -L/usr/bin/../lib/gcc/x86_64-alpine-linux-musl/9.2.0/../../../../x86_64-alpine-linux-musl/lib -L/usr/bin/../lib/gcc/x86_64-alpine-linux-musl/9.2.0/../../.. -L/usr/bin/../lib -L/lib -L/usr/lib -plugin /usr/bin/../lib/LLVMgold.so -plugin-opt=mcpu=x86-64 -z now -z noexecstack -z text /opt/d/tests_ng2.o -plugin /usr/lib/LLVMgold.so -plugin-opt=mcpu=x86-64 -plugin-opt=O0 -plugin-opt=-function-sections -plugin-opt=-data-sections -plugin=/opt/build/llvm/build/lib/libLTO.so -lng2 -lncursesw -lrt -lpthread -lm -ldl -lpthread --start-group -lgcc -lgcc_eh --end-group /usr/bin/../lib/gcc/x86_64-alpine-linux-musl/9.2.0/crtend.o /usr/bin/../lib/gcc/x86_64-alpine-linux-musl/9.2.0/../../../crtn.o --gc-sections -plugin-opt=O3 -lssl -lcrypto -lc -lgcc

the generate binary md5 hash seems is same when pass multi plugin.