2014-01-13 4 views
0

В C++/C вы можете сделать это:LLVM-IR назначение указатель массива

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, или это сразу жалуются на проблемы с типами. Собирался погрузиться в это, но думал, что увижу, пробовал ли кто-нибудь этот конкретный пример. Будет ли я GEP A 0-м местом как i8 *, а затем B и C как i32 *. Я немного смущен, как продолжать, если это вообще возможно.

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

ОБНОВЛЕНИЕ:

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

+0

Да, исправлено. Благодарю. – redratio1

+1

Предполагая, что вы исправите бит о не инициализации '* B' и' C [0] 'и' C [1] ', все это делает, беря' unsigned int' (или 'int' соответственно), на которые указывает' B 'или' C', усечь его до размера 'char' и присвоить его слоту в массиве' A'. Вы должны получить предупреждение о потере точности, предполагая, что вы не игнорируете все предупреждения, но из-за стандартных преобразований между интегральными типами это законно, если несколько сомнительно ... – twalberg

+0

@twalberg; Спасибо, это имеет смысл/я предполагал, что, поскольку есть непрерывная память, я мог бы уйти с помещением большего массива в массив. и имеют биты, расширенные по распределению А. – redratio1

ответ

0

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

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

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

Просто имейте в виду порядок байтов, когда вы делаете такие вещи, как это.

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

2

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

+1

*« Вы не можете »* Я думаю, что это очень ограничительный язык, потому что вы можете это сделать, но имеет неопределенное поведение. – Manu343726

+0

@ Manu343726; Согласовано. Это изменилось. – haccks

+0

Хорошо, однако, если B и C были инициализированы, у него было бы четкое поведение? – redratio1

Смежные вопросы