我想在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 *而不是string)代码上发出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
看起来非常相似imho,但不一样。
Clang使字符串成为全局常量(希望不需要),使用getelementptr的offset参数并将类型i8 *赋予store指令。
不幸的是,我无法找到任何API方法来明确地为store指令提供类型,或者使用offset参数(我猜这甚至都没有帮助。)
所以最后我的问题是:如何正确获取指向第一个数组元素并存储它的指针?
提前致谢
答案 0 :(得分:0)
与评论中的链接一样,解决方法是将[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