[llvm-dev] How to port symcc to clang/llvm-13?

Alberto Barbaro via llvm-dev llvm-dev at lists.llvm.org
Sat Dec 18 00:36:53 PST 2021


Hi,
I think I got confused. Just clarify: my main goal is to be able to port
symcc[1] to llvm-13.

Since I'm confused I went back to the beginning I have experimented with
and HelloWorld [2] LLVM pass. As you can see in the following paragraph all
went well:

root at eaa014e3667a:~/llvm-tutor/build# opt-13 -load-pass-plugin
./libHelloWorld.so -passes=hello-world -disable-output output.ll
(llvm-tutor) Hello from: foo
(llvm-tutor)   number of arguments: 1
(llvm-tutor) Hello from: bar
(llvm-tutor)   number of arguments: 2
(llvm-tutor) Hello from: fez
(llvm-tutor)   number of arguments: 3
(llvm-tutor) Hello from: main
(llvm-tutor)   number of arguments: 2
root at eaa014e3667a:~/llvm-tutor/build#

At this point I wanted to load directly the plugin via clang using the
-fplugin parameter but I wasn't able to do it. I tried the following
command:

root at eaa014e3667a:~/llvm-tutor/build# clang
-fpass-plugin=/root/llvm-tutor/build/libHelloWorld.so
../inputs/input_for_hello.c -o hello
root at eaa014e3667a:~/llvm-tutor/build# file hello
hello: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically
linked, interpreter /lib64/ld-linux-x86-64.so.2,
BuildID[sha1]=ba237b79f2b2bcd362e894657b1e203af914aa9c, for GNU/Linux
3.2.0, not stripped
root at eaa014e3667a:~/llvm-tutor/build#

I was expecting the same output as before where the number of parameters
were printed.

With some verbosity the interesting part was

 "/usr/lib/llvm-13/bin/clang" -cc1 -triple x86_64-pc-linux-gnu -emit-obj
-mrelax-all --mrelax-relocations -disable-free -disable-llvm-verifier
-discard-value-names -main-file-name input_for_hello.c -mrelocation-model
static -mframe-pointer=all -fmath-errno -fno-rounding-math
-mconstructor-aliases -munwind-tables -target-cpu x86-64 -tune-cpu generic
-debugger-tuning=gdb -v -fcoverage-compilation-dir=/root/llvm-tutor/build
-resource-dir /usr/lib/llvm-13/lib/clang/13.0.1 -internal-isystem
/usr/lib/llvm-13/lib/clang/13.0.1/include -internal-isystem
/usr/local/include -internal-isystem
/usr/bin/../lib/gcc/x86_64-linux-gnu/10/../../../../x86_64-linux-gnu/include
-internal-externc-isystem /usr/include/x86_64-linux-gnu
-internal-externc-isystem /include -internal-externc-isystem /usr/include
-fdebug-compilation-dir=/root/llvm-tutor/build -ferror-limit 19
-fgnuc-version=4.2.1 -fcolor-diagnostics
*-fpass-plugin=/root/llvm-tutor/build/libHelloWorld.so* -faddrsig
-D__GCC_HAVE_DWARF2_CFI_ASM=1 -o /tmp/input_for_hello-c52362.o -x c
../inputs/input_for_hello.c

symcc loads the plugin in this way:

➜  build git:(master) ✗ tail -n 8 symcc


exec $compiler                                  \
     -Xclang -load -Xclang "$pass"              \
     "$@"                                       \
     -L"$runtime_dir"                           \
     -lSymRuntime                               \
     -Wl,-rpath,"$runtime_dir"                  \
     -Qunused-arguments
➜  build git:(master) ✗



How am I supposed to load the plugin via clang so I can just have the same
output? I want to *avoid* the use of opt.

Thanks a lot for your help
Alberto


[1] https://github.com/eurecom-s3/symcc
[2] https://github.com/banach-space/llvm-tutor

Il giorno sab 18 dic 2021 alle ore 00:52 Min-Yih Hsu <minyihh at uci.edu> ha
scritto:

> Both links you provided are for Clang plugin not LLVM plugin. Examples of
> clang plugins including modifying AST or registering custom `#pragma`
> directives.
>
> To my best understanding your original question was asking about LLVM
> plugin, which works on LLVM IR.
>
> Best,
> -Min
>
> On Dec 17, 2021, at 2:56 PM, Alberto Barbaro <barbaro.alberto at gmail.com>
> wrote:
>
> Hi Min-Yih,
> thanks for your email. I have searched online on how to build clang
> plugins and I found [1]. I wanted to use the example that prints all the
> function names but, despite the fact that I followed the instructions, I
> could not compile it :)
>
> I searched again and I found [2] and hopefully In this case I could build
> and run the basic hello-world example. I then tried to just replace the
> HelloWorld.cpp with the example that print the functions names but no luck.
> I compile but I have an error message. The following paragraph shows the
> entire test:
>
> ➜  build git:(main) ✗ make
> Scanning dependencies of target HelloWorld
> [ 50%] Building CXX object CMakeFiles/HelloWorld.dir/HelloWorld.cpp.o
> [100%] Linking CXX shared library libHelloWorld.so
> [100%] Built target HelloWorld
> ➜  build git:(main) ✗ clang-13 -cc1 -load ./libHelloWorld.so -plugin
> hello-world $CLANG_TUTOR_DIR/test/HelloWorld-basic.cpp
> ➜  build git:(main) ✗ $Clang_DIR/bin/clang -cc1 -load ./libHelloWorld.so
> -plugin hello-world $CLANG_TUTOR_DIR/test/HelloWorld-basic.cpp
> (clang-tutor)  file:
> /home/alberto/Desktop/projects/llvm/clang-tutor//test/HelloWorld-basic.cpp
> (clang-tutor)  count: 3
> ➜  build git:(main) ✗ cd ..
> ➜  HelloWorld git:(main) ✗ wget
> https://raw.githubusercontent.com/llvm/llvm-project/main/clang/examples/PrintFunctionNames/PrintFunctionNames.cpp
> --2021-12-17 06:45:54--
> https://raw.githubusercontent.com/llvm/llvm-project/main/clang/examples/PrintFunctionNames/PrintFunctionNames.cpp
> Resolving raw.githubusercontent.com (raw.githubusercontent.com)...
> 185.199.110.133, 185.199.109.133, 185.199.108.133, ...
> Connecting to raw.githubusercontent.com (raw.githubusercontent.com)|185.199.110.133|:443...
> connected.
> HTTP request sent, awaiting response... 200 OK
> Length: 4504 (4.4K) [text/plain]
> Saving to: ‘PrintFunctionNames.cpp’
>
> PrintFunctionNames.cp 100%[========================>]   4.40K  --.-KB/s
>  in 0s
>
> 2021-12-17 06:45:54 (11.3 MB/s) - ‘PrintFunctionNames.cpp’ saved
> [4504/4504]
>
> ➜  HelloWorld git:(main) ✗ mv HelloWorld.cpp HelloWorld.cpp.backup
> ➜  HelloWorld git:(main) ✗ mv PrintFunctionNames.cpp HelloWorld.cpp
> ➜  HelloWorld git:(main) ✗ rm -rf build
> ➜  HelloWorld git:(main) ✗ take build
> ➜  build git:(main) ✗ cmake ../
> -- The C compiler identification is GNU 10.2.1
> -- The CXX compiler identification is GNU 10.2.1
> -- Detecting C compiler ABI info
> -- Detecting C compiler ABI info - done
> -- Check for working C compiler: /usr/bin/cc - skipped
> -- Detecting C compile features
> -- Detecting C compile features - done
> -- Detecting CXX compiler ABI info
> -- Detecting CXX compiler ABI info - done
> -- Check for working CXX compiler: /usr/bin/c++ - skipped
> -- Detecting CXX compile features
> -- Detecting CXX compile features - done
> -- Performing Test Terminfo_LINKABLE
> -- Performing Test Terminfo_LINKABLE - Success
> -- Found Terminfo: /usr/lib/x86_64-linux-gnu/libtinfo.so
> -- Found ZLIB: /usr/local/lib/libz.so (found version "1.2.11")
> -- Configuring done
> -- Generating done
> -- Build files have been written to:
> /home/alberto/Desktop/progetti/llvm/clang-tutor/HelloWorld/build
> ➜  build git:(main) ✗ make
> Scanning dependencies of target HelloWorld
> [ 50%] Building CXX object CMakeFiles/HelloWorld.dir/HelloWorld.cpp.o
> [100%] Linking CXX shared library libHelloWorld.so
> [100%] Built target HelloWorld
> ➜  build git:(main) ✗ $Clang_DIR/bin/clang -cc1 -load ./libHelloWorld.so
> -plugin hello-world $CLANG_TUTOR_DIR/test/HelloWorld-basic.cpp
> error: unable to find plugin 'hello-world'
> ➜  build git:(main) ✗
>
> Any idea on how to solve it? I think a little github repo with an example
> on how to do it as standalone project would be beneficial to others as well.
>
> Thanks a lot for all
> Alberto
>
> [1] https://clang.llvm.org/docs/ClangPlugins.html
> [2] https://github.com/banach-space/clang-tutor
>
> Il giorno ven 17 dic 2021 alle ore 01:11 Min-Yih Hsu <minyihh at uci.edu> ha
> scritto:
>
>> It’s a lot easier to load custom pass plugins into clang with the new
>> PassManager actually:
>> ```
>> clang -fpass-plugin=<path to plugin> ...
>> ```
>> Note that <path to plugin> needs to be an absolute path.
>>
>> -Min
>>
>> On Dec 17, 2021, at 6:38 AM, Alberto Barbaro via llvm-dev <
>> llvm-dev at lists.llvm.org> wrote:
>>
>> Hi all,
>> Few days ago I have discovered the symcc[1] project. This project, via an
>> llvm pass, is able to modify the IR code and to inject calls to a backend
>> which allows symbolic execution. I can use it with clang/llvm 11 but not
>> with the version 13.
>>
>> I was wondering if maybe the new pass manager uses llvm passes in a
>> different way .. so I have created a small pass which injects a call to
>> printf in each function and I'm able to use it via opt. Now my question is:
>> is it possible to run the same pass via clang and just obtain the modified
>> IR code? I'd like to avoid to use opt if not mandatory. Is it possible to
>> do it or the new pass manager forces me to use opt?
>>
>> How would you fix this situation in symcc?
>>
>> If someone could tell me how to load a ModulePass in clang-13 would be
>> great.
>>
>> Thanks a lot
>> Alberto
>>
>> [1] https://github.com/eurecom-s3/symcc
>>
>> _______________________________________________
>> LLVM Developers mailing list
>> llvm-dev at lists.llvm.org
>> https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
>>
>>
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20211218/4f1ec05e/attachment-0001.html>


More information about the llvm-dev mailing list