// File: /workspace/github_c_makefile_star2_O0/pocari[P]compilerbook-9cc/codegen.c
// Function: gen_addr
static void gen_addr(Node *node) {
  // switchの警告を消すpragma
  #pragma clang diagnostic ignored "-Wswitch"
  switch(node->kind) {
    case ND_VAR:
      printfln("  # gen_addr start (var_name: %s, var_type: %s)", node->var->name, node->var->is_local ? "local" : "global");
      printfln("  # gen_addr-ND_VAR start");
      // compound_literaruの場合 この アドレス参照時のvarノードで初めて初期化されるので、そのチェック
      // &(int) { 1 } みたいなケース
      if (node->init) {
        gen(node->init);
      }
      if (node->var->is_local) {
        printfln("  mov rax, rbp");
        printfln("  sub rax, %d", node->var->offset);
        printfln("  push rax");
      } else {
        // global変数の場合は単にそのラベル(=変数名)をpushする
        printfln("  push offset %s", node->var->name);
      }
      printfln("  # gen_addr-ND_VAR end");
      printfln("  # gen_addr end");
      return;
    case ND_DEREF:
      printfln("  # gen_addr start (var_name: none)");
      printfln("  # gen_addr-ND_DEREF start");
      gen(node->lhs);
      printfln("  # gen_addr-ND_DEREF stop");
      printfln("  # gen_addr end");
      return;
    case ND_MEMBER:
      printfln("  # gen_addr start (struct-member: %s)", node->member->name);
      printfln("  # gen_addr-ND_MEMBER start");
      printfln("  # struct var ref start");
      gen_addr(node->lhs);
      printfln("  # struct var ref end");
      printfln("  # struct member ref start");
      printfln("  pop rax"); // 構造体変数のアドレス
      printfln("  add rax, %d", node->member->offset); //構造体のアドレスを元にそのメンバーの位置(オフセットを設定)
      printfln("  push rax"); // 構造体メンバーのアドレスをpush
      printfln("  # struct member ref end");
      printfln("  # gen_addr-ND_MEMBER stop");
      printfln("  # gen_addr end");
      return;
  }

 error("代入の左辺値が変数ではありません");
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x10, %rsp
movq %rdi, -0x8(%rbp)
movq -0x8(%rbp), %rax
movl (%rax), %eax
movl %eax, -0xc(%rbp)
subl $0x17, %eax
je 0x398b
jmp 0x396c
movl -0xc(%rbp), %eax
subl $0x1f, %eax
je 0x3a6b
jmp 0x397a
movl -0xc(%rbp), %eax
subl $0x23, %eax
je 0x3ab5
jmp 0x3b7b
movq -0x8(%rbp), %rax
movq 0x78(%rax), %rax
movq 0x8(%rax), %rsi
movq -0x8(%rbp), %rax
movq 0x78(%rax), %rax
movb 0x14(%rax), %cl
leaq 0xc118(%rip), %rdx      # 0xfac1
leaq 0xc10b(%rip), %rax      # 0xfabb
testb $0x1, %cl
cmovneq %rax, %rdx
leaq 0xc0cd(%rip), %rdi      # 0xfa8b
movb $0x0, %al
callq 0x2320
leaq 0xc0fc(%rip), %rdi      # 0xfac8
movb $0x0, %al
callq 0x2320
movq -0x8(%rbp), %rax
cmpq $0x0, 0x58(%rax)
je 0x39eb
movq -0x8(%rbp), %rax
movq 0x58(%rax), %rdi
callq 0x2950
movq -0x8(%rbp), %rax
movq 0x78(%rax), %rax
testb $0x1, 0x14(%rax)
je 0x3a30
leaq 0xc0e2(%rip), %rdi      # 0xfae2
movb $0x0, %al
callq 0x2320
movq -0x8(%rbp), %rax
movq 0x78(%rax), %rax
movl 0x10(%rax), %esi
leaq 0xc0d8(%rip), %rdi      # 0xfaf1
movb $0x0, %al
callq 0x2320
leaq 0xb8ec(%rip), %rdi      # 0xf313
movb $0x0, %al
callq 0x2320
jmp 0x3a4a
movq -0x8(%rbp), %rax
movq 0x78(%rax), %rax
movq 0x8(%rax), %rsi
leaq 0xc0bc(%rip), %rdi      # 0xfaff
movb $0x0, %al
callq 0x2320
leaq 0xc0bf(%rip), %rdi      # 0xfb10
movb $0x0, %al
callq 0x2320
leaq 0xc0c9(%rip), %rdi      # 0xfb28
movb $0x0, %al
callq 0x2320
jmp 0x3b89
leaq 0xc0c7(%rip), %rdi      # 0xfb39
movb $0x0, %al
callq 0x2320
leaq 0xc0dd(%rip), %rdi      # 0xfb5d
movb $0x0, %al
callq 0x2320
movq -0x8(%rbp), %rax
movq 0x18(%rax), %rdi
callq 0x2950
leaq 0xc0de(%rip), %rdi      # 0xfb79
movb $0x0, %al
callq 0x2320
leaq 0xc07f(%rip), %rdi      # 0xfb28
movb $0x0, %al
callq 0x2320
jmp 0x3b89
movq -0x8(%rbp), %rax
movq 0x98(%rax), %rax
movq 0x10(%rax), %rsi
leaq 0xc0c9(%rip), %rdi      # 0xfb94
movb $0x0, %al
callq 0x2320
leaq 0xc0e2(%rip), %rdi      # 0xfbbb
movb $0x0, %al
callq 0x2320
leaq 0xc0f1(%rip), %rdi      # 0xfbd8
movb $0x0, %al
callq 0x2320
movq -0x8(%rbp), %rax
movq 0x18(%rax), %rdi
callq 0x3950
leaq 0xc0ef(%rip), %rdi      # 0xfbf1
movb $0x0, %al
callq 0x2320
leaq 0xc0f8(%rip), %rdi      # 0xfc08
movb $0x0, %al
callq 0x2320
leaq 0xb8c2(%rip), %rdi      # 0xf3e0
movb $0x0, %al
callq 0x2320
movq -0x8(%rbp), %rax
movq 0x98(%rax), %rax
movl 0x18(%rax), %esi
leaq 0xc0ea(%rip), %rdi      # 0xfc24
movb $0x0, %al
callq 0x2320
leaq 0xb7cb(%rip), %rdi      # 0xf313
movb $0x0, %al
callq 0x2320
leaq 0xc0dc(%rip), %rdi      # 0xfc32
movb $0x0, %al
callq 0x2320
leaq 0xc0e8(%rip), %rdi      # 0xfc4c
movb $0x0, %al
callq 0x2320
leaq 0xbfb6(%rip), %rdi      # 0xfb28
movb $0x0, %al
callq 0x2320
jmp 0x3b89
leaq 0xc0e6(%rip), %rdi      # 0xfc68
movb $0x0, %al
callq 0x65d0
addq $0x10, %rsp
popq %rbp
retq
nop