在LLVM-IR中获取数组的第一个元素指针

4
我希望在LLVM-IR中实现一个字符串类型,我的计划如下:
当声明一个字符串变量时,为i8*分配内存。
当变量初始化时,将字符串存储在某个地方,将指向第一个元素的指针存储在先前分配的地址处,并在成员变量中保存字符串的长度。
问题在于,我无法获取指向第一个元素的指针。 使用IRBuilder(C++ API),我已经创建了以下代码:
  %str2 = alloca i8*
  %1 = alloca [4 x i8]
  store [4 x i8] c"foo\00", [4 x i8]* %1
  %2 = getelementptr [4 x i8], [4 x i8]* %1, i32 0
  store [4 x i8]* %2, i8** %str2

但是在此调用 llc 会产生以下错误:
error: stored value and pointer type do not match
  store [4 x i8]* %2, i8** %str2
        ^

使用clang在同一(char *而不是字符串)代码上进行llvm-ir发射时,它会发出以下内容:
%str2 = alloca i8*, align 8
store i8* %str, i8** %1, align 8
store i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str, i32 0, i32 0), i8** %str2, align 8

我认为这两者非常相似,但并不完全相同。

Clang让字符串成为全局常量(希望这并非必须),使用getelementptr的偏移参数,并给存储指令一个i8*类型。

不幸的是,我没有找到任何API方法来明确地给存储指令指定类型,或使用偏移参数(即使使用可能也无济于事)。

所以最终我的问题是:如何正确获取指向数组第一个元素的指针并将其存储?

提前感谢您的回答。


在这里查看如何将字符串存储在堆栈上的答案:http://stackoverflow.com/questions/37101965/create-local-string-using-llvm/37103913#comment61836647_37103913 - Frank C.
数小时的研究,我就是找不到那个。感谢您指引我去那里! - Ragnar1349
1个回答

2

如评论中的链接所述,解决方案是将[n x i8]*位转换为i8*

%str2 = alloca i8*
%1 = alloca [4 x i8]
store [4 x i8] c"foo\00", [4 x i8]* %1
%2 = bitcast [4 x i8]* %1 to i8*
store i8* %2, i8** %str2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接