Код: Выделить всё
llvm::StructType* llvm_struct = llvm::StructType::create(llvm_context, struct_name);
std::vector members;
for(size_t j = 0; j != struct_data.members.size(); j++){
llvm::Type* member_type = /*get member type*/;
members.push_back(member_type);
}
llvm_struct->setBody(members)
Я пробовал использовать getelementptr пока безуспешно:
Код: Выделить всё
llvm::Value* member_index = llvm::ConstantInt::get(llvm_context, llvm::APInt(32, /*structure member index*/, true));
llvm::Value* indices[2] = {llvm::ConstantInt::get(member_index->getType(), 0), member_index};
llvm::Value* data = /*expression value*/;
return irbuilder.CreateInBoundsGEP(data, llvm::ArrayRef(indices, 2), "membtmp");
РЕДАКТИРОВАТЬ:
Хорошо, тип данных llvm::Value* — это %a_struct, который был загружен из указателя в стеке. Судя по документации, irbuilder.CreateInBoundsGEP(llvm::Value*, llvm::ArrayRef, llvm::Twine) требует, чтобы первый аргумент был указателем на структуру, а не значение самой структуры.
При копировании значения структуры в переменную в стеке выдается эта ошибка: Выражение: getOperand(0)->getType () == cast
(getOperand(1)->getType())->getElementType() && «Ptr должен быть указателем на тип Val!». Указатель, вставленный в irbuidler.CreateInBoundsGEP(...), когда возникла эта ошибка, был llvm::AllocaInst*, который был недавно выделен в стеке и содержал значение данных llvm::Value* (тип %a_struct) скопирован в него.
IR сгенерирован прямо перед вызовом irbuilder.CreateInBoundsGEP(...)< /code> со значением, скопированным в переменную в стеке:
Код: Выделить всё
define i32 @main() {
entry:
%calltmp = call %a_struct @new_a_struct()
%a_var = alloca %a_struct
store %a_struct %calltmp, %a_struct* %a_var
%a_var1 = load %a_struct, %a_struct* %a_var
%memballoctmp = alloca %a_struct
store %a_struct %a_var1, %a_struct* %memballoctmp
}
Подробнее здесь: https://stackoverflow.com/questions/407 ... re-in-llvm
Мобильная версия