2016-09-03 1 views
0

Ich möchte eine Funktion in LLVM erstellen, die einen Zeiger auf beliebigen Speicher aus Speicheranweisungen nimmt. Zum Beispiel:LLVM create function mit 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 

Hier, ich möchte, dass die Speicherbefehle zum Instrument eine Funktion mit den Speicherzeiger aufzurufen, die einmal vom Typ i32 * sind und einmal vom Typ i32 **. Ich brauche nur den "ersten Zeiger" zum Speicher und ich muss die Zeiger nicht dereferenzieren oder seine Typinformation erhalten. Also, ich brauche einen Datentyp, der void Zeiger in C ähnelt.

Wie kann ich das in LLVM?

+0

'bitcast' von i32 Gießen * bis i8 *? –

+0

Wenn es keinen void * -ähnlichen Typ gibt, dann könnte das Gießen jedes Pointers auf i8 * die beste Lösung sein. Du könntest eine Antwort geben – user2600312

Antwort

1

Hier ist ein Beispiel für beide %x und %y zu einem 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) 
Verwandte Themen