2017-02-15 57 views
1

我有我想要生成C++以下IR代碼:如何使用整數列表在LLVM中初始化整數數組?

@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 

我知道我可以使用這些代碼行初始化數組爲全零:

ConstantAggregateZero* const_array_2 = ConstantAggregateZero::get(ArrayTy_0); 
    GArray->setInitializer(const_array_2); 

怎麼辦我將LLVM中的數組初始化爲值列表?

回答

2

您可以創建一個常數初始化列表:

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

+0

謝謝!使用'ConstantArray'和'ConstantDataArray'有什麼區別? – Shuzheng

+0

好像ConstantDataArray「基本上是一樣的,除了只支持有限範圍的成員類型」(1/2/4/8字節類型 - 例如'int'或'float'或'double') - 是的,你可以在這種情況下使用它 - 我的描述適用於任何類型[除了當然'getIntegerValue'不起作用,如果你有一個非Integer類型] –

+0

謝謝,非常有幫助! – Shuzheng