如何使用整数列表在LLVM中初始化整数数组?

4

我有以下的红外线代码,希望生成C++代码:

@gArray = global [10 x i32] [i32 3, i32 4, i32 5, i32 6, i32 0, i32 0, i32 0, i32 0, i32 12, i32 0], align 16

我知道我可以使用以下代码将数组初始化为全零:
```c++ int arr[10] = {0}; ```
这个语法会自动将数组中所有元素初始化为零。
    ConstantAggregateZero* const_array_2 = ConstantAggregateZero::get(ArrayTy_0);
    GArray->setInitializer(const_array_2);

我该如何在LLVM中将数组初始化为值列表?
1个回答

5
你可以创建一个常量初始化列表:
std::vector<llvm::Constant*> values;
...
/* Make the value 42 appear in the array - ty is "i32" */
llvm::Constant* c = llvm::Constant::getIntegerValue(ty, 42);
values.push_back(c);
... // Add more values here ... 
llvm::Constant* init = llvm::ConstantArray::get(arrayTy_0, values);
GArray->setInitializer(init);

这段代码(以及前面的20行左右)创建了一个全局结构体,并对其进行初始化: https://github.com/Leporacanthicus/lacsap/blob/master/expr.cpp#L2585 这里还有另一个示例使用`setInitializer` - 再次说明,它不是数组而是结构体,但在概念上数组和结构体并没有太大区别: https://github.com/Leporacanthicus/lacsap/blob/master/expr.cpp#L3376 也可以参考以下链接(例如): http://llvm.org/docs/doxygen/html/classllvm_1_1ConstantArray.html

谢谢!使用ConstantArrayConstantDataArray有什么区别? - Shuzheng
似乎ConstantDataArray“本质上是相同的,但仅支持有限范围的成员类型”(1/2/4/8字节类型-例如intfloatdouble)-是的,在这种情况下,您可以使用它-我的描述适用于任何类型[当然,如果您有非整数类型,则getIntegerValue无法工作]。 - Mats Petersson
谢谢,非常有帮助! - Shuzheng

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