2016-09-03 2 views
0

Я хочу создать функцию в LLVM, которая берет указатель на произвольную память из инструкций магазина. Например:LLVM create function with void pointer arg

%x = alloca i32, align 4 
%z = alloca i32*, align 8 
store i32 123, i32* %x, align 4 
store i32* %x, i32** %z, align 8 

Здесь я хочу инструмент инструкции магазин для вызова функции с указателями памяти, которые когда-то типа I32 * и один раз типа I32 **. Мне нужен только «первый указатель» в памяти, и мне не нужно переоценивать указатели или получать информацию о типе. Итак, мне нужен тип данных, который похож на указатели void в C.

Как это сделать в LLVM?

+0

'bitcast' от I32 * до i8 *? –

+0

Если не существует типа типа void *, то лучшим решением будет литье каждого указателя на i8 *. Вы можете сделать ответ – user2600312

ответ

1

Вот пример литья как %x и %y к void*

%x = alloca i32, align 4 
    %y = alloca i32*, align 8 
    store i32 123, i32* %x, align 4 
    store i32* %x, i32** %y, align 8 

    ; Convert x to void* 

    %1 = bitcast i32* %x to i8* 
    call void @instrument(i8* %1) 

    ; Convert y to void* 

    %2 = load i32*, i32** %y, align 8 
    %3 = bitcast i32* %2 to i8* 
    call void @instrument(i8* %3)