Назначение указателя массива LLVM-IR

В C ++ / C вы можете сделать это:

unsigned char A[12];
unsigned int *B;
int *C;
B = malloc(sizeof(unsigned int));
C = malloc(2*sizeof(int));
A[0] = *B;
A[4] = *C;
//Then go on to access A byte by byte.

Мне было интересно, возможно ли это в LLVM-IR, или он сразу же будет жаловаться на проблему с типами. Собирался погрузиться в это, но подумал, посмотрю, попробует ли кто-нибудь этот конкретный пример. Могу ли я получить 0-е местоположение A как i8 *, а затем B и C как i32 *. Я немного запутался, что делать дальше, если это вообще возможно.

Спасибо заранее

ОБНОВИТЬ:

Хорошо, если бы я вместо этого добавил инициализацию для * B и C [0], C [1], изменится ли ответ для LLVM-IR / C / C ++?

0

Решение

LLVM имеет bitcast инструкция, которая часто используется для преобразования одного типа указателя в другой тип указателя — например, i32* в i8*,

Так, например, если вы хотите получить доступ к 3-му байту 4-байтового числа, выполнение следующих действий совершенно законно:

%bytes = bitcast i32* %num to i8*
%third_byte = getelementptr i8* %bytes, i32 2

Просто имейте в виду, что вы делаете что-то подобное.

И да, вы можете использовать эту технику для получения указателей на определенные места в массиве и store а также load значения оттуда, что позволяет вам дублировать весь ваш пример.

0

Другие решения

Нет. Это также невозможно в C / C ++. Не следует присваивать неинициализированную переменную другой переменной. Это вызывает неопределенное поведение. *B а также *c неинициализированы.

2

По вопросам рекламы [email protected]