如果 IR 是由 clang 生成的,则教程中的 LLVM HelloWorld pass 不会 运行
The LLVM HelloWorld pass from the tutorial does not run if the IR is produced by clang
我是 LLVM/clang 的新手,正在尝试使用新的传递管理器编写我的自定义 LLVM 传递。
我的第一步是使用 official documentation 中的 HelloWorld 传递。
当我使用文档提供的文件 a.ll 和命令 ./bin/opt a.ll -passes=helloworld -S
时,它工作正常
foo
bar
; ModuleID = 'a.ll'
source_filename = "a.ll"
define i32 @foo() {
%a = add i32 2, 3
ret i32 %a
}
define void @bar() {
ret void
}
现在我已经创建了一个 C 文件 a2.c:
void test(){
}
并使用 ./bin/clang -S -emit-llvm a2.c
生成 IR
运行 a2.ll 上的前一个 opt 命令给出
; ModuleID = 'a2.ll'
source_filename = "a2.c"
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"
; Function Attrs: noinline nounwind optnone uwtable
define dso_local void @test() #0 {
entry:
ret void
}
attributes #0 = { noinline nounwind optnone uwtable "frame-pointer"="all" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
!llvm.module.flags = !{!0}
!llvm.ident = !{!1}
!0 = !{i32 1, !"wchar_size", i32 4}
!1 = !{!"clang version 13.0.0 (https://github.com/llvm/llvm-project.git 8e7df996e3054cc174b91bc103057747c8349c06)"}
我在文件开头看不到预期的“测试”,因此我的通行证不是由 PassManager 运行。
关于我的通行证有什么问题有什么想法吗?
感谢您的帮助。
[编辑]
使用 clang 标志 -O1
或更多可以解决问题,但我不明白为什么。
带有 -O0 的 clang 添加了 optnone
属性,该属性禁止通过转换过程对 IR 进行任何进一步处理。
我是 LLVM/clang 的新手,正在尝试使用新的传递管理器编写我的自定义 LLVM 传递。
我的第一步是使用 official documentation 中的 HelloWorld 传递。
当我使用文档提供的文件 a.ll 和命令 ./bin/opt a.ll -passes=helloworld -S
foo
bar
; ModuleID = 'a.ll'
source_filename = "a.ll"
define i32 @foo() {
%a = add i32 2, 3
ret i32 %a
}
define void @bar() {
ret void
}
现在我已经创建了一个 C 文件 a2.c:
void test(){
}
并使用 ./bin/clang -S -emit-llvm a2.c
运行 a2.ll 上的前一个 opt 命令给出
; ModuleID = 'a2.ll'
source_filename = "a2.c"
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"
; Function Attrs: noinline nounwind optnone uwtable
define dso_local void @test() #0 {
entry:
ret void
}
attributes #0 = { noinline nounwind optnone uwtable "frame-pointer"="all" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
!llvm.module.flags = !{!0}
!llvm.ident = !{!1}
!0 = !{i32 1, !"wchar_size", i32 4}
!1 = !{!"clang version 13.0.0 (https://github.com/llvm/llvm-project.git 8e7df996e3054cc174b91bc103057747c8349c06)"}
我在文件开头看不到预期的“测试”,因此我的通行证不是由 PassManager 运行。
关于我的通行证有什么问题有什么想法吗? 感谢您的帮助。
[编辑]
使用 clang 标志 -O1
或更多可以解决问题,但我不明白为什么。
带有 -O0 的 clang 添加了 optnone
属性,该属性禁止通过转换过程对 IR 进行任何进一步处理。