Clang 如何制作LLVM';s`opt`命令优化内置函数?
考虑以下C程序:Clang 如何制作LLVM';s`opt`命令优化内置函数?,clang,llvm,llvm-clang,Clang,Llvm,Llvm Clang,考虑以下C程序: #include <stdlib.h> int main() { int * ptr = malloc(8); *ptr = 14; return 4; } 对malloc的调用消失了,因为它是clang知道的一个内置函数。 如果我们运行clang-S-emit llvm-O1-fno builtin,我们将: clang不知道什么是malloc,必须让电话留在家里 如何使用LLVM的opt命令从第二个LLVM程序到第一个LLVM程序?我
#include <stdlib.h>
int main() {
int * ptr = malloc(8);
*ptr = 14;
return 4;
}
对malloc
的调用消失了,因为它是clang
知道的一个内置函数。
如果我们运行clang-S-emit llvm-O1-fno builtin
,我们将:
clang
不知道什么是malloc
,必须让电话留在家里
如何使用LLVM的
opt
命令从第二个LLVM程序到第一个LLVM程序?我如何告诉opt
使用clang
显然拥有的内置函数知识?在这个特定示例中,问题是clang-fno-builtin
将生成LLVM代码,该代码使用nobuiltin
显式标记对内置函数的调用,即属性#3={nobuiltin“无内置”}
通常情况下,可以通过pass
-targetlibinfo
猜测哪些内置函数可用。必须小心地以正确的参数和返回类型声明和使用内置函数,否则LLVM将(正确地)声明和使用内置函数无法识别它们是内置的。您必须运行正确的过程。每次过程后,-print after all选项都会打印IR;您可以研究输出,找出哪个过程会造成叮当声的不同,然后使用opt运行该过程。谢谢,普通的InstCombine
过程会删除对malloc
的调用。打印whic通过-debug pass=Arguments
完成h个过程,无论是否使用-fno内置
都会给出完全相同的输出。
...
; Function Attrs: norecurse nounwind readnone uwtable
define dso_local i32 @main() local_unnamed_addr #0 !dbg !7 {
call void @llvm.dbg.value(metadata i32* undef, metadata !13, metadata !DIExpression()), !dbg !15
ret i32 4, !dbg !16
}
...
...
; Function Attrs: nounwind uwtable
define dso_local i32 @main() local_unnamed_addr #0 !dbg !14 {
%1 = call noalias i8* @malloc(i64 8) #3, !dbg !22
%2 = bitcast i8* %1 to i32*, !dbg !22
call void @llvm.dbg.value(metadata i32* %2, metadata !20, metadata !DIExpression()), !dbg !23
store i32 14, i32* %2, align 4, !dbg !24, !tbaa !25
ret i32 4, !dbg !29
}
...