用clang已经有一段时间了,可以clang -fno-builtin -emit-llvm -c hello.c
用来防止llvm内置函数的生成,比如llvm.memset
.
最近,我用 DragonEgg 切换到 gcc,因为要构建的程序最初设计为使用 gcc 编译。我在网上搜索,但没有找到有关如何设置 DragonEgg 参数的任何信息。
谁能给我一些帮助?欢迎任何提示或参考。谢谢!
我自己想出了一种使用gcc
+DragonEgg
来实现类似效果的方法。
gcc -S -c -O0 -fplugin=$(DRAGONEGG_SO) -fplugin-arg-dragonegg-emit-ir hello.c -o hello.bc
opt -O3 -disable-simplify-libcalls hello.bc -o hello.bc
$(DRAGONEGG_SO)
是路径dragonegg.so
。
基本上 LLVM 内在函数是由优化 pass 添加的instcombine
。使用-disable-simplify-libcalls
,可以防止 LLVM 内在函数在instcombine
.
该方法还应该适用llvm-gcc
于生成没有 LLVM 内在函数的 LLVM IR。