Clang 如何制作LLVM';s`opt`命令优化内置函数?

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程序?我

考虑以下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程序?我如何告诉
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
}
...