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

标签 c++ arrays string pointers llvm-ir

我想在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 方法来显式地为存储指令提供类型,或者使用偏移量参数(我猜这甚至没有帮助)。

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

提前致谢

最佳答案

如评论中的链接所示,解决方案是将 [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

关于c++ - 获取指向 LLVM-IR 中数组第一个元素的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37901866/

相关文章:

c++ - 如何比较catch2中的浮点

javascript - 查看数组是否有数组的最简单方法? Javascript

javascript - 当第二个数组为 0 时,无法在 JavaScript 中合并两个排序数组

c - C-检查一个字母在数组中出现多少次的功能

javascript - 将段落拆分为数组 javascript

c++ - IStorage::OpenStorage OLECHAR *pwcsName for MS Project 2010

C++ winapi将子窗口上的鼠标点击传递给父窗口

字符串的 c_str() 函数的 C++ 奇怪行为

c# - 用双引号将每个单词括起来

c# - C++ AVR 附加到 const char *