// File: /workspace/github_c_makefile_star2_O0/thiagok00[P]INF1715-Compilers/TabelaSimbolos.c
// Function: tipa_expchamada
static void tipa_expchamada(Simbolo *s,Exp *e, int nivelEscopo) {
  Simbolo *aux = NULL;
  ExpL *explist = NULL;
  ParametroL *paramlist = NULL;;

  //achando definicao da funcao
  aux = proc_no_func(s,e->u.expchamada.idFunc);
  if (aux != NULL) {
    e->u.expchamada.def = aux->u.f;
    e->tipo = aux->u.f->tiporet;
  }
  else {
    printf("[Erro] funcao %s nao declarada\n",e->u.expchamada.idFunc);
    exit(1);
  }
  //comparando parametros da chamada(explist) com a declaracao(paramlist)
  paramlist = e->u.expchamada.def->params;
  explist = e->u.expchamada.params;
  while (explist != NULL) {
    if (paramlist == NULL){
      printf("[Erro] argumentos a mais em chamada de \"%s\"\n",e->u.expchamada.idFunc);
      exit(1);
    }
    tipa_expressao(s,explist->e,nivelEscopo);
    if (explist->e->tipo->tag != paramlist->tipo->tag) {
      printf("[Erro] tipo de parametro na chamada de funcao \"%s\" inesperado\n",e->u.expchamada.idFunc);
      exit(1);
    }
    if(explist->e->tipo->tag == base){
      int resp = cmp_tipo_base(explist->e->tipo,paramlist->tipo);
      //se tipo da chamada for menos expressivo faz a conversao para tipo mais expressivo
      if (resp < 0){
        Exp *expas = promove_tipo(explist->e,paramlist->tipo->tipo_base);
        expas->u.expnewas.exp = explist->e;
        explist->e = expas;
      }
      //se tipo da chamada for mais expressivo da erro de tipagem
      else if (resp > 0) {
        printf("[Erro] tipo de parametro na chamada de funcao \"%s\" inesperado\n",e->u.expchamada.idFunc);
        exit(1);
      }
    }
    else if (cmp_tipo_array(explist->e->tipo,paramlist->tipo) != 0) {
      printf("[Erro] tipo de parametro na chamada de funcao \"%s\" inesperado\n",e->u.expchamada.idFunc);
      exit(1);
    }
    explist = explist->prox;
    paramlist = paramlist->prox;
  }
  if (paramlist != NULL) {
    printf("[Erro] faltou argumentos em chamada de \"%s\"\n",e->u.expchamada.idFunc);
    exit(1);
  }
  return;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x40, %rsp
movq %rdi, -0x8(%rbp)
movq %rsi, -0x10(%rbp)
movl %edx, -0x14(%rbp)
movq $0x0, -0x20(%rbp)
movq $0x0, -0x28(%rbp)
movq $0x0, -0x30(%rbp)
movq -0x8(%rbp), %rdi
movq -0x10(%rbp), %rax
movq 0x18(%rax), %rsi
callq 0x7290
movq %rax, -0x20(%rbp)
cmpq $0x0, -0x20(%rbp)
je 0x6dac
movq -0x20(%rbp), %rax
movq 0x8(%rax), %rcx
movq -0x10(%rbp), %rax
movq %rcx, 0x20(%rax)
movq -0x20(%rbp), %rax
movq 0x8(%rax), %rax
movq (%rax), %rcx
movq -0x10(%rbp), %rax
movq %rcx, 0x8(%rax)
jmp 0x6dcc
movq -0x10(%rbp), %rax
movq 0x18(%rax), %rsi
leaq 0x3b3c(%rip), %rdi      # 0xa8f7
movb $0x0, %al
callq 0x10a0
movl $0x1, %edi
callq 0x1190
movq -0x10(%rbp), %rax
movq 0x20(%rax), %rax
movq 0x10(%rax), %rax
movq %rax, -0x30(%rbp)
movq -0x10(%rbp), %rax
movq 0x10(%rax), %rax
movq %rax, -0x28(%rbp)
cmpq $0x0, -0x28(%rbp)
je 0x6f54
cmpq $0x0, -0x30(%rbp)
jne 0x6e1a
movq -0x10(%rbp), %rax
movq 0x18(%rax), %rsi
leaq 0x3b0e(%rip), %rdi      # 0xa917
movb $0x0, %al
callq 0x10a0
movl $0x1, %edi
callq 0x1190
movq -0x8(%rbp), %rdi
movq -0x28(%rbp), %rax
movq (%rax), %rsi
movl -0x14(%rbp), %edx
callq 0x6310
movq -0x28(%rbp), %rax
movq (%rax), %rax
movq 0x8(%rax), %rax
movl (%rax), %eax
movq -0x30(%rbp), %rcx
movq (%rcx), %rcx
cmpl (%rcx), %eax
je 0x6e65
movq -0x10(%rbp), %rax
movq 0x18(%rax), %rsi
leaq 0x3af0(%rip), %rdi      # 0xa944
movb $0x0, %al
callq 0x10a0
movl $0x1, %edi
callq 0x1190
movq -0x28(%rbp), %rax
movq (%rax), %rax
movq 0x8(%rax), %rax
cmpl $0x0, (%rax)
jne 0x6ef9
movq -0x28(%rbp), %rax
movq (%rax), %rax
movq 0x8(%rax), %rdi
movq -0x30(%rbp), %rax
movq (%rax), %rsi
callq 0x6580
movl %eax, -0x34(%rbp)
cmpl $0x0, -0x34(%rbp)
jge 0x6ecf
movq -0x28(%rbp), %rax
movq (%rax), %rdi
movq -0x30(%rbp), %rax
movq (%rax), %rax
movl 0x4(%rax), %esi
callq 0x6610
movq %rax, -0x40(%rbp)
movq -0x28(%rbp), %rax
movq (%rax), %rcx
movq -0x40(%rbp), %rax
movq %rcx, 0x10(%rax)
movq -0x40(%rbp), %rcx
movq -0x28(%rbp), %rax
movq %rcx, (%rax)
jmp 0x6ef7
cmpl $0x0, -0x34(%rbp)
jle 0x6ef5
movq -0x10(%rbp), %rax
movq 0x18(%rax), %rsi
leaq 0x3a60(%rip), %rdi      # 0xa944
movb $0x0, %al
callq 0x10a0
movl $0x1, %edi
callq 0x1190
jmp 0x6ef7
jmp 0x6f37
movq -0x28(%rbp), %rax
movq (%rax), %rax
movq 0x8(%rax), %rdi
movq -0x30(%rbp), %rax
movq (%rax), %rsi
callq 0x66f0
cmpl $0x0, %eax
je 0x6f35
movq -0x10(%rbp), %rax
movq 0x18(%rax), %rsi
leaq 0x3a20(%rip), %rdi      # 0xa944
movb $0x0, %al
callq 0x10a0
movl $0x1, %edi
callq 0x1190
jmp 0x6f37
movq -0x28(%rbp), %rax
movq 0x8(%rax), %rax
movq %rax, -0x28(%rbp)
movq -0x30(%rbp), %rax
movq 0x18(%rax), %rax
movq %rax, -0x30(%rbp)
jmp 0x6de8
cmpq $0x0, -0x30(%rbp)
je 0x6f7b
movq -0x10(%rbp), %rax
movq 0x18(%rax), %rsi
leaq 0x3a19(%rip), %rdi      # 0xa983
movb $0x0, %al
callq 0x10a0
movl $0x1, %edi
callq 0x1190
addq $0x40, %rsp
popq %rbp
retq
nopw %cs:(%rax,%rax)