LLVM IR:初始化并投射 [20 x i8]

LLVM IR: initialize and cast [20 x i8]

我正在尝试按以下方式初始化并转换多个 LLVM IR 变量:

store i64 %content, i64* %5
%tt2 = load i64, i64* %5
%ttt2 = trunc i64 %tt2 to i32

虽然这看起来微不足道并且工作正常,但我不得不为 [20 * i8] 类型的变量做同样的事情。类似于:

store [20 x i8] %content, [20 x i8]* %5
%tt2 = load [20 x i8], [20 x i8]* %5
%ttt2 = trunc [20 x i8] %tt2 to i32

目前我在第三行收到以下错误消息:

invalid cast opcode for cast from [20 x i8] to i32

任何人都可以阐明这个问题吗?谢谢!

您可以 trunc 从一个整数到另一个整数,但不能从数组到整数。这就是 trunc 的定义方式——如果输入不是 int,那么 trunc 需要做一些与 "drop the higher-order bits and preserve the lower-order bits".

明显不同的事情

我认为最常见的方法是转换指针,然后从一个已经与您想要的类型相匹配的指针 load/store load/store。

(请注意,%ttt2 等不是 LLVM 变量,它们是 LLVM 值。它们永远不会变化。)