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

Alberto Barbaro via llvm-dev llvm-dev at lists.llvm.org
Sat Dec 18 23:17:39 PST 2021


Hello,
Thanks a lot, I'll try it now!

Alberto

Il giorno dom 19 dic 2021 alle ore 02:37 Douglas Chen [陳鍵源] <
dougpuob at gmail.com> ha scritto:

> Hi Alberto:
>
> You are right, llvm-tutor. I am happy to share my change with you. I also
> put the patch file with complete change in this mail.
>
> ``` cpp
> llvm::PassPluginLibraryInfo getHelloWorldPluginInfo() {
>   return {LLVM_PLUGIN_API_VERSION, "HelloWorld", LLVM_VERSION_STRING,
>           [](PassBuilder &PB) {
>             errs() << "registerPipelineStartEPCallback" << "\n";
>             PB.registerPipelineStartEPCallback(
>               [](ModulePassManager &MPM, OptimizationLevel Level) {
>                  FunctionPassManager FPM;
>                  FPM.addPass(HelloWorld());
>
>  MPM.addPass(createModuleToFunctionPassAdaptor(std::move(FPM)));
> });
>          }};
> }
> ```
>
> ``` bash
> ❯ $LLVM_DIR/bin/clang --version
> clang version 14.0.0 (https://github.com/llvm/llvm-project.git
> eb052f6b8f787847827f9cc9ff8e09f954cb0a44)
> Target: x86_64-unknown-linux-gnu
> Thread model: posix
> InstalledDir: /home/dougpuob/petzone/llvm/installed/main/debug//bin
>
> ❯ 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
>
> ❯ cat /home/dougpuob/petzone/llvm/testdata/20211218--symcc/input.c
> #include <stdio.h>
>
> int main() {
>         printf("Hello Input !!! \n");
>         return 0;
> }⏎
>
>
> ❯ $LLVM_DIR/bin/clang \
>
>  -fpass-plugin=/home/dougpuob/petzone/llvm/testdata/20211218--symcc/llvm-tutor.git/build/libHelloWorld.so
>  \
>            /home/dougpuob/petzone/llvm/testdata/20211218--symcc/input.c
> CodeGenOpts.PassPlugins
> PassPlugin::Load()
> registerPipelineStartEPCallback
> registerPipelineStartEPCallback()
> (llvm-tutor) Hello from: main
> (llvm-tutor)   number of arguments: 0
> (llvm-tutor)    Opcode : alloca
> (llvm-tutor)    Opcode : store
> (llvm-tutor)    Opcode : call
> (llvm-tutor)    Opcode : ret
> ```
>
> -- Douglas Chen
>
>
> On Sun, Dec 19, 2021 at 1:14 AM Alberto Barbaro <barbaro.alberto at gmail.com>
> wrote:
>
>> Hi Douglas,
>> Just be clear, did you modify the helloworld example from llvm-tutor not
>> clang-tutor right?
>>
>> Would you mind to share the entire code, the clang full command and
>> output? It'd help me to solve a lot of time.
>>
>> Imo it could be added to the website as a tutorial.
>>
>> Thanks
>> Alberto
>>
>>
>> On Sat, Dec 18, 2021, 17:26 Douglas Chen [陳鍵源] <dougpuob at gmail.com>
>> wrote:
>>
>>> Hi Min:
>>>
>>> I am interested in the discussion. I modified the code from clang-tutor
>>> to register with `PassPipeline::registerPipelineStartEPCallback`. The
>>> plugin can be loaded with clang with `-fpass-plugin=<path to plugin>`
>>> option. Thank you for your suggestions and help.
>>>
>>> -- Douglas Chen
>>>
>>>
>>> On Sat, Dec 18, 2021 at 5:03 PM Min-Yih Hsu via llvm-dev <
>>> llvm-dev at lists.llvm.org> wrote:
>>>
>>>>
>>>>
>>>> On Dec 18, 2021, at 4:36 PM, Alberto Barbaro <barbaro.alberto at gmail.com>
>>>> wrote:
>>>>
>>>> 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
>>>>
>>>>
>>>> Correct, that is expected, `-fplugin` is for Clang plugin not LLVM pass
>>>> plugin.
>>>>
>>>> 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.
>>>>
>>>>
>>>> The HelloWorld example you mentioned is using
>>>> `llvm::PassBuilder::registerPipelineParsingCallback`. Passes registered in
>>>> this way are not visible to clang.
>>>> More specifically, if you registered a Pass via `
>>>> registerPipelineParsingCallback`, you need to call
>>>> `PassBuilder::parsePassPipeline` with a textual pass pipeline description.
>>>> But clang doesn’t use that function at all. The opt tool is using it (via
>>>> the `—passes` flag) though.
>>>>
>>>> Try to use other `PassPipline` registration functions like
>>>> `PassPipeline::registerPipelineStartEPCallback` or
>>>> `PassPipeline::registerOptimizerLastEPCallback`.
>>>>
>>>> Also, when the optimization level is set to -O0 (which is the default
>>>> one), every IR function is annotated with `optnone`, which prevents a
>>>> function from being visited by any LLVM Pass. So be sure to add `-Xclang
>>>> -disable-O0-optnone` flag on clang to turn this off (or using optimization
>>>> levels other than -O0).
>>>>
>>>> Best,
>>>> -Min
>>>>
>>>>
>>>> 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
>>>>>>
>>>>>>
>>>>>>
>>>>>
>>>> _______________________________________________
>>>> 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/20211219/090cb8bc/attachment-0001.html>


More information about the llvm-dev mailing list