<div dir="ltr"><div dir="ltr"><br></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Mon, Jul 22, 2019 at 8:41 PM Heiko via llvm-dev <<a href="mailto:llvm-dev@lists.llvm.org">llvm-dev@lists.llvm.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex">Hi,<br>
<br>
I am trying to convert a compile-time legacy module<br>
pass (so) to a link-time pass. I am using ArchLinux amd64<br>
with LLVM 8.0.0 but looking for a way to support llvm 3.8 up to current.<br>
<br>
To keep things simple, i am just counting modules, functions, basic blocks.<br>
For compile time usage I used 'clang -Xclang -load -Xclang mypass.so ...'.<br>
That is working as expected.<br>
<br>
In llvm/Transforms/IPO/PassManagerBuilder.h I looked for a suitable value<br>
in enum ExtensionPointTy, but found nothing for running at linking time.<br></blockquote><div><br></div><div>One has been added a few weeks ago I believe.</div><div><br></div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex">
<br>
Next I tried to use<br>
clang -flto -fuse-ld=gold -Xclang -load -Xclang mypass.so ...'<br>
but then the pass is also run once per translation unit not once at link <br>
time.<br>
<br>
Since the linker does not know '-load', I am now using<br>
clang -flto -fuse-ld=gold -Xlinker -plugin -Xlinker mypass.so ...<br>
with the effect that the linker cannot find symbol llvm::ModulePass <br>
while loading mypass.so<br></blockquote><div><br></div><div>I suspect you can't do that with gold, you need to instead link your pass into the LLVM LTO plugin for Gold.</div><div><br></div><div>LLD may be able to load your pass though, I don't know it there is a command line flag for this though.</div><div><br></div><div>-- </div><div>Mehdi</div><div><br></div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex">
<br>
"/usr/bin/ld.gold" -pie --eh-frame-hdr -m elf_x86_64 -dynamic-linker <br>
/lib64/ld-linux-x86-64.so.2 -o test-instr <br>
/usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/9.1.0/../../../../lib64/Scrt1.o <br>
/usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/9.1.0/../../../../lib64/crti.o <br>
/usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/9.1.0/crtbeginS.o <br>
-L/usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/9.1.0 <br>
-L/usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/9.1.0/../../../../lib64 <br>
-L/usr/bin/../lib64 -L/lib/../lib64 -L/usr/lib/../lib64 <br>
-L/usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/9.1.0/../../.. <br>
-L/usr/bin/../lib -L/lib -L/usr/lib -plugin /usr/bin/../lib/LLVMgold.so <br>
-plugin-opt=mcpu=x86-64 -plugin-opt=O3 -plugin ../mypass.so <br>
/tmp/test-instr-4f23de.o -lgcc --as-needed -lgcc_s --no-as-needed -lc <br>
-lgcc --as-needed -lgcc_s --no-as-needed <br>
/usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/9.1.0/crtendS.o <br>
/usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/9.1.0/../../../../lib64/crtn.o<br>
/usr/bin/ld.gold: error: ../mypass.so: could not load plugin library: <br>
../mypass.so: undefined symbol: _ZN4llvm10ModulePassD2Ev<br>
clang-8: error: linker command failed with exit code 1 (use -v to see <br>
invocation)<br>
<br>
The goal is using ḿodule, function, basic block iterators<br>
like before but just at a global scope.<br>
<br>
Any help/hint is appreciated.<br>
Many thanks and best regards, Heiko<br>
<br>
<br>
_______________________________________________<br>
LLVM Developers mailing list<br>
<a href="mailto:llvm-dev@lists.llvm.org" target="_blank">llvm-dev@lists.llvm.org</a><br>
<a href="https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev" rel="noreferrer" target="_blank">https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev</a><br>
</blockquote></div></div>