Как получить значение члена структуры в LLVM?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Как получить значение члена структуры в LLVM?

Сообщение Anonymous »

Итак, я создал такой тип структуры:

Код: Выделить всё

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
}
Кроме того, должен быть лучший способ доступа к членам %a_var без его дублирования (при этом поддерживая такие выражения, как a_struct_var1.member + a_struct_var2.member< /code> на языке).

Подробнее здесь: https://stackoverflow.com/questions/407 ... re-in-llvm
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»