获取指向 LLVM-IR 中数组第一个元素的指针
Posted
技术标签:
【中文标题】获取指向 LLVM-IR 中数组第一个元素的指针【英文标题】:Get pointer to first element of array in LLVM-IR 【发布时间】:2016-06-18 21:36:47 【问题描述】:我想在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 的 offset 参数并将类型 i8* 赋予 store 指令。
不幸的是,我找不到任何 API 方法来显式地为 store 指令指定类型,或者使用 offset 参数(我猜这甚至没有帮助)。
所以最后我的问题是:如何正确获取指向第一个数组元素的指针并存储它?
提前致谢
【问题讨论】:
在这里查看答案,了解如何在堆栈上存储字符串***.com/questions/37101965/… 数小时的研究,我只是没有发现。谢谢你指点我! 【参考方案1】:正如评论中的链接,解决方案是将 [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
【讨论】:
以上是关于获取指向 LLVM-IR 中数组第一个元素的指针的主要内容,如果未能解决你的问题,请参考以下文章