Как создать тип массива LLVM с помощью AllocaInst?

Я хочу создать LLVM ArrayType в стеке, поэтому я хотел использовать AllocaInst (Type *Ty, Value *ArraySize=nullptr, const Twine &Name="", Instruction *InsertBefore=nullptr). Проблема в том, что я не понимаю этот интерфейс. Я догадался, что Ty будет чем-то вроде ArrayType::get(I.getType(), 4), но что мне давать за ArraySize. Кроме того, для этого требуется Value*, так что это меня сильно смутило.

Либо я неправильно понял llvm alloc, либо мне нужно указать константу llvm в качестве значения размера массива. Если мне нужно указать константу, разве это не избыточно, поскольку ArrayType содержит numElement в качестве информации.

В качестве примера строки кода, как я пытаюсь:

AllocaInst* arr_alloc = new AllocaInst(ArrayType::get(I.getType(), num)
                                       /*, What is this parameter for?*/,
                                       "",
                                       funcEntry.getFirstInsertionPt());

person Vemulo    schedule 05.02.2016    source источник


Ответы (1)


I — это тип элементов массива, таких как:

Type* I = IntegerType::getInt32Ty(module->getContext());

Затем вы можете создать ArrayType из num элементов:

ArrayType* arrayType = ArrayType::get(I, num);

Этот тип можно использовать в AllocInstr следующим образом:

AllocaInst* arr_alloc = new AllocaInst(
    arrayType, "myarray" , funcEntry
//             ~~~~~~~~~
// -> custom variable name in the LLVM IR which can be omitted,
//    LLVM will create a random name then such as %2.
);

Этот пример даст следующую инструкцию LLVM IR:

%myarray = alloca [10 x i32]

EDIT Также кажется, что вам разрешено передавать размер переменного массива в AllocInstr следующим образом:

Type* I = IntegerType::getInt32Ty(module->getContext());
auto num = 10;
auto funcEntry = label_entry;

ArrayType* arrayType = ArrayType::get(I, num);

AllocaInst* variable = new AllocaInst(
  I, "array_size", funcEntry
);

new StoreInst(ConstantInt::get(I, APInt(32, 10)), variable, funcEntry);

auto load = new LoadInst(variable, "loader", funcEntry);

AllocaInst* arr_alloc = new AllocaInst(
  I, load, "my_array", funcEntry
);
person Denis Blank    schedule 05.02.2016
comment
Я знаю об этом использовании, но есть также параметр ArraySize, который равен Value*, может быть, это непонятно из моего вопроса, но я не понял назначение этого параметра при использовании с ArrayType. - person Vemulo; 05.02.2016
comment
ошибка: нет подходящего конструктора для инициализации 'llvm::AllocaInst' - person ar2015; 22.08.2020
comment
API llvm::AllocaInst был изменен в связи с добавлением адресного пространства в конструктор: github.com/llvm/llvm-project/blob/ - person Denis Blank; 24.08.2020