<html dir="ltr"><head></head><body style="text-align:left; direction:ltr;"><div>Hi Lukas,</div><div><br></div><div>Am Montag, den 28.10.2019, 13:42 +0100 schrieb Lukas Sommer via Openmp-dev:</div><blockquote type="cite" style="margin:0 0 0 .8ex; border-left:2px #729fcf solid;padding-left:1ex"><pre>Hello,</pre><pre><br></pre><pre>I'm trying to use the clang-offload-bundler to merge the results of the</pre><pre>compilation for device and host for an application using OpenMP target</pre><pre>pragmas.</pre><pre><br></pre><pre>My goal is to run a custom pass on the device code and then bundle an</pre><pre>application from the modified device code and the host code. For testing</pre><pre>purposes, I use a very simple vector addition with target offloading</pre><pre>pragmas and the "offloading" to x86_64 (LLVM/Clang release 9.0).</pre><pre><br></pre><pre>I use clang to generate LLVM IR from the application code. Then I use</pre><pre>the clang-offload-bundler to unbundle the LLVM IR for device and host. I</pre><pre>run opt and llc separately on the LLVM IR for host and device.</pre><pre><br></pre><pre>To this end, on my application code (code.c), I run the following steps:</pre><pre><br></pre><blockquote type="cite" style="margin:0 0 0 .8ex; border-left:2px #729fcf solid;padding-left:1ex"><pre>clang -fopenmp -fopenmp-targets=x86_64-unknown-linux-gnu -S -emit-llvm</pre><pre>-O3 -o bundled.ll code.c</pre><pre>clang-offload-bundler --inputs=bundled.ll</pre><pre>--outputs=host.in.ll,device.in.ll</pre><pre>--targets=host-x86_64-unknown-linux-gnu,openmp-x86_64-unknown-linux-gnu</pre><pre>--type=ll --unbundle</pre><pre>opt -o host.opt.ll -O3 host.in.ll</pre><pre>llc -o host.o -filetype=obj host.opt.ll</pre><pre>opt -o device.opt.ll -O3 device.in.ll (custom pass should be added</pre><pre>here later on)</pre><pre>llc -o device.o -filetype=obj device.opt.ll</pre></blockquote><pre><br></pre><pre>Afterwards, I tried to bundle the object files for host & device:</pre><pre><br></pre><blockquote type="cite" style="margin:0 0 0 .8ex; border-left:2px #729fcf solid;padding-left:1ex"><pre>clang-offload-bundler --inputs=host.o,device.o --outputs=app.o</pre><pre>--targets=host-x86_64-unknown-linux-gnu,openmp-x86_64-unknown-linux-gnu</pre><pre>--type=o</pre></blockquote><pre>This command completes without any warning or error. </pre><pre><br></pre><pre>I tried to invoke gcc on the output to generate the executable from the</pre><pre>object file (app.o):</pre><pre><br></pre><blockquote type="cite" style="margin:0 0 0 .8ex; border-left:2px #729fcf solid;padding-left:1ex"><pre>gcc app.o -lomp -lomptarget</pre></blockquote><pre>However, I get the following error:</pre><pre><br></pre><blockquote type="cite" style="margin:0 0 0 .8ex; border-left:2px #729fcf solid;padding-left:1ex"><pre>/usr/bin/ld:</pre><pre>app.o:(.rodata..omp_offloading.device_images[.omp_offloading.descriptor_reg.x86_64-unknown-linux-gnu]+0x10):</pre><pre>undefined reference to `.omp_offloading.entries_begin'</pre><pre>/usr/bin/ld:</pre><pre>app.o:(.rodata..omp_offloading.device_images[.omp_offloading.descriptor_reg.x86_64-unknown-linux-gnu]+0x18):</pre><pre>undefined reference to `.omp_offloading.entries_end'</pre><pre>/usr/bin/ld:</pre><pre>app.o:(.rodata..omp_offloading.descriptor[.omp_offloading.descriptor_reg.x86_64-unknown-linux-gnu]+0x10):</pre><pre>undefined reference to `.omp_offloading.entries_begin'</pre><pre>/usr/bin/ld:</pre><pre>app.o:(.rodata..omp_offloading.descriptor[.omp_offloading.descriptor_reg.x86_64-unknown-linux-gnu]+0x18):</pre><pre>undefined reference to `.omp_offloading.entries_end'</pre></blockquote><pre>Do I need to run any additional steps before going through gcc or pass</pre><pre>additional flags? Is there another way of accomplishing the desired</pre><pre>behavior?</pre></blockquote><div><br></div><div>I think you should use clang with the full -fopenmp -fopenmp-targets=x86_64-unknown-linux-gnu to build the final executable, ie</div><div> $ clang -fopenmp -fopenmp-targets=x86_64-unknown-linux-gnu app.o</div><div>If I remember correctly, the above symbols are provided by a linker script in Clang 9.0, which gcc has no clue about.</div><div><br></div><div>Please note that there have been recent changes in that area and trunk now relies on a new tool clang-offload-wrapper AFAICS (see <a href="https://github.com/llvm/llvm-project/commit/5836c356fa6e17d0e10a2f9e0e111b7236dc15fb">https://github.com/llvm/llvm-project/commit/5836c356fa6e17d0e10a2f9e0e111b7236dc15fb</a>).</div><div>As before this should be called transparently by clang, as long as it's correctly invoked with a consistent value for -fopenmp-targets.</div><div><br></div><div>I haven't tested above command, but I hope it works. Please let me know if it doesn't and I'll take a closer look!</div><div>Jonas</div><div><br></div><blockquote type="cite" style="margin:0 0 0 .8ex; border-left:2px #729fcf solid;padding-left:1ex"><pre><br></pre><pre>Thanks a lot in advance,</pre><pre><br></pre><pre>Best regards</pre><pre><br></pre><pre>Lukas</pre><pre><br></pre></blockquote></body></html>