如何在 LLVM IR 中将 `[8 x i1]` 转换为 `i8`

问题描述 投票:0回答:0

我正在编写一个生成 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]
(仅第一个值重要)。

您能否解释一下为什么这段代码会这样工作以及如何修复它?

c clang llvm llvm-ir
© www.soinside.com 2019 - 2024. All rights reserved.