2017-02-15 23 views
1

Я следующий ИК-код, который я хочу, чтобы генерировать C++ для:Как инициализировать целочисленный массив в 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' не работает, если у вас есть нецелый тип] –

+0

Спасибо, очень полезно! – Shuzheng