LLVM IR:初始化和强制转换[20 x i8]

LLVM IR:初始化和强制转换[20 x i8],llvm,llvm-ir,Llvm,Llvm Ir,我尝试以以下方式初始化并强制转换许多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

我尝试以以下方式初始化并强制转换许多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
目前,我在第三行收到以下错误消息:

[20 x i8]
i32的转换操作码无效


有人能解释一下这个问题吗?谢谢

您可以
trunc
从一个int到另一个int,但不能从数组到int。这就是
trunc
的定义-如果输入不是int,那么trunc需要做与“删除高阶位并保留低阶位”明显不同的事情

我认为最常见的方法是强制转换指针,然后从已经匹配要加载/存储的类型的指针加载/存储


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

您可以
trunc
从一个int到另一个int,但不能从数组到int。这就是
trunc
的定义方式-如果输入不是int,那么trunc需要执行与int明显不同的操作“删除高阶位并保留低阶位”

我认为最常见的方法是强制转换指针,然后从已经匹配要加载/存储的类型的指针加载/存储


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

谢谢你的评论。你能详细说明一下如何
转换指针,然后从该指针加载/存储吗?
?非常感谢!你试图
加载
,然后
trunc
加载的值。你可以
位转换
指针(
%5
)到<代码> i32*< /代码>然后>代码>加载<代码>,它给你一个<代码> i32 < /C>。如果使用C++ API,<代码> Casist:::Cube(Casist::BasCaster,……/代码)我知道…谢谢!我直接在LLVM IR上工作(用我自己的Python脚本来处理它的字符串表示)。让我看看它是如何工作的!谢谢你的评论arnt。你能详细说明一下如何
转换指针,然后从该指针加载/存储吗?
?非常感谢!你尝试
加载
,然后
trunc
加载的值。你可以
位转换
指针(
%5
)对于<代码> i32*< /Cord>,然后<代码>加载<代码>,它给出了<代码> i32 。如果使用C++ API,<代码> Casist::/Cube(Casist::BasCaster,……/代码)我知道…谢谢!我直接在LLVM IR上工作(用我自己的Python脚本处理它的字符串表示)。让我看看它是如何工作的!