我正在编写一个生成 LLVM IR 的编译器。但我使用的辅助库 (ollvm) 仅支持三种整数类型:
i1
、i32
和 i64
。但是,我需要字符和字符串的字节 (i8
) 值。
目前,我正在尝试通过将
i8
转换为 i1
,从八个 [8 x i1]
构造一个 i8
值。
以下代码可以编译,但不会打印我期望的结果。
define i32 @main() #0 {
%arr = alloca [8 x i1], align 1
store [8 x i1] [ i1 1, i1 0, i1 0, i1 0, i1 1, i1 0, i1 0, i1 0 ], [8 x i1]* %arr
%ptr = getelementptr inbounds [8 x i1], [8 x i1]* %arr, i64 0, i64 0
%ptr2 = bitcast i1* %ptr to i8*
%result = load i8, i8* %ptr2, align 1
call void @printByte(i8 noundef %result)
ret i32 0
}
printByte
函数在C中定义如下。
void printByte(char x) {
printf("%x", x);
}
此代码打印
1
,但我希望它打印11
(00010001
的十六进制值)。
此外,除了第一个数组值之外,所有数组值都将被忽略。例如,给定
0
则打印 [0, 1, 0, 1, 1, 1, 1, 1]
,给定 1
则打印 [1, 1, 0, 1, 1, 1, 1, 1]
(仅第一个值重要)。
您能否解释一下为什么这段代码会这样工作以及如何修复它?