Closed GChicha closed 5 years ago
Acho que achei a solução
Com base nessa resposta do stack eu gerei o llvm do seguinte código em C:
void a(int a[], int b) { a[b]; }
Que é igual a seguinte IR do llvm:
define dso_local void @a(i32*, i32) #0 { %3 = alloca i32*, align 8 %4 = alloca i32, align 4 store i32* %0, i32** %3, align 8 store i32 %1, i32* %4, align 4 %5 = load i32*, i32** %3, align 8 %6 = load i32, i32* %4, align 4 %7 = sext i32 %6 to i64 %8 = getelementptr inbounds i32, i32* %5, i64 %7 %9 = load i32, i32* %8, align 4 ret void }
Então percebi que tem de alocar os parametros da função e os carai, e sempre que for usar eles tem de realizar o load dos mesmo.
Quanto a função GEP mudei para inbound, não sei o que isso causa.
Um exemplo do resultado que estamos gerado.
Código em nanilang:
def main(v[]: int; a: int): int { var x = v[a] : int; }
IR LLVM:
define i64 @main(i64*, i64) { entry: %param = alloca i64* store i64* %0, i64** %param %param1 = alloca i64 store i64 %1, i64* %param1 %x = alloca i64 %flat = load i64, i64* %param1 %loaded_param = load i64*, i64** %param %arr = getelementptr inbounds i64, i64* %loaded_param, i64 %flat %flat2 = load i64, i64* %arr store i64 %flat2, i64* %x }
Acho que achei a solução
Com base nessa resposta do stack eu gerei o llvm do seguinte código em C:
Que é igual a seguinte IR do llvm:
Então percebi que tem de alocar os parametros da função e os carai, e sempre que for usar eles tem de realizar o load dos mesmo.
Quanto a função GEP mudei para inbound, não sei o que isso causa.
Um exemplo do resultado que estamos gerado.
Código em nanilang:
IR LLVM: