LLVM-IR中store指令编译报错求助:clang提示expected type
解决clang编译LLVM-IR时store指令的"expected type"错误
执行clang test2.ll编译LLVM-IR代码时,出现如下错误:
test2.ll:8:18: error: expected type store i32 0, ptr %1, align 4
即便是clang自身通过-S -emit-llvm -O0 -g0生成的IR也无法编译。
错误原因
问题出在IR代码中使用的ptr类型——这是LLVM 12及后续版本引入的统一指针类型,但你当前使用的clang版本不兼容该语法,或者编译时未匹配对应的LLVM版本。旧版LLVM/IR要求明确写出指针的具体类型(比如i32*),而非通用的ptr。
修复方案
有两种可行的解决方式:
方法1:替换ptr为具体指针类型
将所有ptr替换为对应变量的指针类型(这里alloca的是i32,所以指针类型为i32*),修改后的完整IR代码如下:
; ModuleID = 'Module' source_filename = "Module" 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" define i32 @main() { %1 = alloca i32, align 4 %2 = alloca i32, align 4 %3 = alloca i32, align 4 %4 = alloca i32, align 4 %5 = alloca i32, align 4 store i32 0, i32* %1, align 4 store i32 100, i32* %2, align 4 store i32 10, i32* %3, align 4 store i32 2, i32* %4, align 4 %6 = load i32, i32* %2, align 4 %7 = load i32, i32* %3, align 4 %8 = add nsw i32 %6, %7 %9 = load i32, i32* %4, align 4 %10 = sub nsw i32 %9, 2 %11 = sub nsw i32 %8, %10 store i32 %11, i32* %5, align 4 ret i32 0 }
修改后重新执行clang test2.ll即可正常编译。
方法2:使用匹配版本的clang
如果你的IR是用LLVM 12+版本的clang生成的,确保编译时使用同版本或更高版本的clang。比如用clang 12生成的IR,就用clang 12来编译,此时无需修改IR代码,直接运行clang test2.ll即可。
内容的提问来源于stack exchange,提问作者Roy
相关产品推荐
相关产品推荐

