<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/153517>153517</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
clang-offload-wrapper creating broken .o file
</td>
</tr>
<tr>
<th>Labels</th>
<td>
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
ZuseZ4
</td>
</tr>
</table>
<pre>
Currently on llvm 21.1.0 rc3: https://github.com/rust-lang/rust/commit/3fb4be20c1f41b32697224abd10be814102466ed
I am working on reproducing the behavior of clang's offloading pipeline in rustc. As part of that, I run clang on a minimal openmp (kernel mode) example, and look at the output from `-save-temps`, `--dry-run` and `-###`. I figured the first steps out, so I am now especially looking at the clang-linker-wrapper which seems to be doing plenty of things.
I started compiling the c++ example file via `myclang++ -fuse-ld=lld -fopenmp -fopenmp-offload-mandatory --offload-arch=gfx90a omp_bare.cpp -o bare -save-temps`. myclang is based on the same llvm commit as rustc.
So far I generated a `lib.ll` (host, x86-64) and a `device.ll` (target amdgcn-amd-amdhsa) file from the same rust source file "lib.rs", using rustc.
I then run the following 3 commands, which I got from the clang invocation above (slightly cleaned up)
```
clang-offload-packager -o host.out --image=file=device.ll,triple=amdgcn-amd-amdhsa,arch=gfx90a,kind=openmp
clang-21 -cc1 -triple x86_64-unknown-linux-gnu -S -dumpdir asdf -save-temps=cwd -disable-free -clear-ast-before-backend -main-file-name lib.rs -mrelocation-model pic -pic-level 2 -pic-is-pie -mframe-pointer=all -fmath-errno -ffp-contract=on -fno-rounding-math -mconstructor-aliases -funwind-tables=2 -target-cpu x86-64 -tune-cpu generic -debugger-tuning=gdb -ferror-limit 19 -fopenmp -fopenmp-offload-mandatory -fgnuc-version=4.2.1 -fskip-odr-check-in-gmf -fembed-offload-object=host.out -fopenmp-targets=amdgcn-amd-amdhsa -faddrsig -D__GCC_HAVE_DWARF2_CFI_ASM=1 -o host.s -x ir lib.ll
clang-21 -cc1as -triple x86_64-unknown-linux-gnu -filetype obj -main-file-name lib.rs -target-cpu x86-64 -dwarf-version=5 -mrelocation-model pic -o host.o host.s
```
So far, so good. I now have `device.ll host.o host.out host.s lib.ll`. The last step of the clang offload invocation is (again slightly simplified)
```
clang-linker-wrapper --should-extract=gfx90a --device-linker=amdgcn-amd-amdhsa=-lompdevice --host-triple=x86_64-unknown-linux-gnu --linker-path=/path/rust/build/x86_64-unknown-linux-gnu/lld/bin/ld.lld --hash-style=gnu --eh-frame-hdr -m elf_x86_64 -pie -dynamic-linker -o bare /lib/../lib64/Scrt1.o /lib/../lib64/crti.o /path/gcc/x86_64/12/crtbeginS.o -L/path/gcc/x86_64/12 -L/path/gcc/x86_64/12/../../../../lib64 -L/lib/../lib64 -L/usr/lib64 -L/lib -L/usr/lib host.o -lstdc++ -lm -lomp -lomptarget -lgcc_s -lgcc -lpthread -lc -lgcc_s -lgcc /path/gcc/x86_64/12/crtendS.o /lib/../lib64/crtn.o
```
It gives
```
ld.lld: error: host-amdgcn-amd-amdhsa-gfx90a.o:1: malformed number: '
>>> ; ModuleID = 'lib-openmp-amdgcn-amd-amdhsa-gfx90a.bc'
>>> ^
clang: error: ld.lld command failed with exit code 1 (use -v to see invocation)
```
Inspecting the `host-amdgcn-amd-amdhsa-gfx90a.o` file (where does it even get generated?) shows that it's just our `device.ll` file, which we started with. The clang-linker-wrapper somehow creates a copy and incorrectly names it a .o file.
If I append `--save-temps` and `--dry-run` to the clang-linker-wrapper invocation above, I get the following output:
```
"/path/prog/llvm/bin/clang" --no-default-config -o bare.amdgcn.gfx90a.img --target=amdgcn-amd-amdhsa -mcpu=gfx90a -flto -Wl,--no-undefined host-amdgcn-amd-amdhsa-gfx90a.o -Wl,--save-temps -Xlinker -lompdevice
"/path/rust/build/x86_64-unknown-linux-gnu/lld/bin/ld.lld" {some-args}
```
It already fails at the clang invocation, since `host-amdgcn-amd-amdhsa-gfx90a.o` is an incorrectly named device.ll file. `clang-linker-wrapper` also must create that file in some way before calling clang, but does so in a way that's not printed by `--dry-run`.
I'll add more details later.
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJykWMtu4zoS_RplU6AgUX4kCy_ScXsmwNzNZDB3cDcBRZYkdihSICk7_vtBUZLz7m7gAu60YpGs16lThxEh6NYi7rL1t2y9vxJj7Jzf_TUG_Gt1VTt13t2N3qON5gzOgjHHHniZl3kBXlZZdQtdjEPIqtuMHzJ-aHXsxjqXrs_4wY8hMiNsOz9n_CBd32t6qJp6VSMvZNmsyrrim5st5ytRq7Ko8bpclQVfbTaosuI2K27vQfRwcv5J25b88Dh4p0ZJv8YOocZOHLXz4BqQk8VtANc0xglFiwY9oNEWQVsgV2QOtwEG4SNtiZ2IGb-De_CjnQ4gKwJ6bXUvDLgBbT9Axq-f0Fs00DuFGb8BfBb9YJA2C6vAOPcEIiaf3BiHMULjXQ_ZpmBBHJFF7IeQbQraQF8y5c_MjzbbFOkA-i7j1fzZFDncQ6Pb0aNKhzbahwgh4hDIAB0THKT0WHcCDANKLYw5J1co8tmbFBQz2j6hZycvhgE9nDotOwiIfYDooEZQLmXLoI3nKTPatiFfqhCi8BEVSNcP2izZlxn_lvFvSzKg0QbhqAVF05_neqQVrBkDMqOyam-MAtbMiV0e2Fwy1gurRHT-DOzynfCyy6p92zzfFAJcPzzWwmMuhwGYA3qGt0nOYbYOOkAtAiqqKnkcRI8TmCdAgggzLKZIs-L2wUEjPNxDixa9oKhTQEbXuTFUr4xfdy6kGjxfb9hmRYCgIqZ1Co9a4svSKHyLEUSvWmmZ6BX964KgTSlhCSgX58gbCG70cs5nxjmZ9iHjnEyOgdJ_cRpSfWKHNmE4YcUZ4060qkphCqsC7Zyqfg-tiy9G5zzZo5MiagJ_7Y5k9ToY3XbU_9KgsKhgHDJ-M-dpU8yf4nZC2FKsQcgn0aKn0lCWcjdGYEz3osWs2lNIWbV_SRK_i14P6ctPUnT3pvYZv3vSlkA0oWbyZbLPS2BSlsCm46gyj5sVG-2TdSdLDTA-s9aOwB6AqbEflPYggmreYKfay5MCpnQQtUHWeERgFL9nIkRWY-M8slrIJ7QKWC-0ZRQSswlYqU7Aeo9mTicjwjAwaAls0JIZPKIBPv2iAxs0AusbL3pkg9M2oqdMGAOs6UXsGHpvHbCmGZh0NnohI8VvgTXWMe9GSzzHaC2wXjoboh9ldJ4Jo0XAQL1nT9oqFikmipEDm1DJ5DDOGAYWR4vpiwR8clhhPbYtenqlbUt1UDWwBr13nhlNDVTe_F43N60dJTuiD9rZrNqvcp6XwJrwpAfmlGeyQ_nEtGVt35CNvkZ1OcjVPzAF_gKpxdYUSfgMP8AaoZQPugW2f3z8x93d4z9v__v9cf_n7b8P_PHucP94-_BHVu3LC1oDsGfQHuZu_wgwEX4DYgSJeB4QXP3jS5R8UgJ1Er55laT1l1hammv2-l1LThw2D4nWOUXjhOZEJ6i3X5EULOe8NOuSCLgwXg7_6RCMmCfQNB8W6phL9JpCdCD-EK3QFi4sEnQ_GN1oVDOLfKCQd0OKsdC50SiGzwvs5xHA2OT_vONT6qj2zLh-mBYCYxQUu1DN16VbvBhEJOLJ-CE9XYRMPWqjMn746oSMH0xaUGtLzypPA491InQsxHMyP1nCjk2N3ykPrAc0zeN0LEy8oM5W9EQayaXLsKNjdZ3xQ55PjzSBDg_SxzJ3X7yVPurp5RxOK-UliowfSj4tqrHV9iF3wP71k7Xw89eL8Xc_ki_TzvceTt-OwX9Y9u7NAldmQlSL_mCmh1Tt6ec8cZlppXwM0__AzBA7j0IBM_Ldu19mBa16-Flqbe7eIZqmcoRWH_F9b06IIAWdaDRJacLmBwizCe25y6rbkpb1wjTO96jAjn2NaWvGt3R-9X36QFZ9gz-cGg3e7yGr9rTA6JrNZPmlkVp-OGn9fenMN87OiJ6FBTRCG1Rw0rEDfNYRpFMIJRHAGBDYkQRmQHzFDx_7_96Sfo2Lrsw2xa9SsikWdXR96tCTgMUAOgIe0QKV_yLfsupAWit07hSS4ge6iGwD_CCp5Ub_QbUlkXIRTCe8yF-KciLDTxkruB47dwLpUUQMIEC64ZykobbSeY-SmJCmQPJVQO6SsUVnN6TohwHnC8FbVXu5J7y-O0T3tcp_L-qmmw7l5q1KnC4sdJV7h2ESnEtnDN61iduO_YXcZoXPgTHrmMJGjCaSTGlo4k5slU9FzOfK6b4FNo--z0d2L4fxFdU3Jjpgf5JQTFZGq7DRJEd_AZHLppckAvvfQqUvs2FKPbwJ9u9wPeUj234jLDDh25Bt959ygzDERufUQOHNbe1Nq9xB0Fb-bk_oAMJ-AJuCl3mf4EanfQaZhDITHPTUGhOMp5ZJzUbj3PUIJ3GGSQqDFCZdB2co3EE9xqkXg6P1Ii2e7tnbANZFGDzJXAX1-T2alzYgzjIglIKebCiMKUdGRPT5ldpV6qa6EVe4K7frdVlVZbm-6nacF2ol5Uqu6zXfVuJms1rVNzdFU_J1XSK_0jte8HVxXa6KYn1drfNKXZc3Asvt9WZdXm-32arAXmiTE8pz59srHcKIu3JdrcvtlRE1mpD-ZMK5xROktwSc9f7K72gTq8c2ZKvC6BDDyzFRR4O7txelpUtTlimFtXdPaBdKuBq92f3kbyxzIyajg3dJHvND8ijQ5JpcPu74_wMAAP__rtvebQ">