theosirian / nanilang

Repositório para o Trabalho de Implementação de Linguagens de Programação
MIT License
3 stars 2 forks source link

Fix parâmetros pass #5

Closed GChicha closed 5 years ago

GChicha commented 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
}