// File: /workspace/github_c_makefile_star2_O0/Mithreindeir[P]ewcc/src/frontend/ast.c
// Function: node_free
void node_free(struct node *n)
{
	if (!n)
		return;
	switch (n->type) {
	case node_ident:
		free(IDENT(n));
		break;
	case node_cnum:	//nothing to free here
		break;
	case node_unop:
		node_free(UNOP(n)->term);
		break;
	case node_binop:
		node_free(BINOP(n)->lhs);
		node_free(BINOP(n)->rhs);
		break;
	case node_block:
		symbol_table_free(BLOCK(n)->scope);
		for (int i = 0; i < BLOCK(n)->num_stmt; i++)
			node_free(BLOCK(n)->stmt_list[i]);
		free(BLOCK(n)->stmt_list);
		break;
	case node_cond:
		node_free(COND(n)->condition);
		node_free(COND(n)->body);
		node_free(COND(n)->otherwise);
		break;
	case node_decl:
		free(DECL(n)->ident);
		node_free(DECL(n)->initializer);
		type_free(DECL(n)->type);
		break;
	case node_loop:
		node_free(LOOP(n)->init);
		node_free(LOOP(n)->condition);
		node_free(LOOP(n)->body);
		node_free(LOOP(n)->iter);
		break;
	case node_func:
		free(FUNC(n)->ident);
		type_free(FUNC(n)->ftype);
		node_free(FUNC(n)->body);
		break;
	case node_call:
		node_free(CALL(n)->func);
		for (int i = 0; i < CALL(n)->argc; i++)
			node_free(CALL(n)->argv[i]);
		free(CALL(n)->argv);
		break;
	case node_cast:
		node_free(n->child);
		n->child = NULL;/*Directly stores child*/
		break;
	case node_return:
		node_free(RET(n));
		n->child = NULL;
		break;
	case node_unit:
		for (int i = 0; i < UNIT(n)->num_decls; i++) {
			node_free(UNIT(n)->edecls[i]);
		}
		free(UNIT(n)->edecls);
		break;
	}

	if (n->inf && TYPE(n))
		type_free(TYPE(n));
	free(n->inf);
	free(n->child);
	free(n);
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x20, %rsp
movq %rdi, -0x8(%rbp)
cmpq $0x0, -0x8(%rbp)
jne 0x7678
jmp 0x7972
movq -0x8(%rbp), %rax
movl (%rax), %eax
decl %eax
movl %eax, %ecx
movq %rcx, -0x20(%rbp)
subl $0xe, %eax
ja 0x7926
movq -0x20(%rbp), %rax
leaq 0x4e22(%rip), %rcx      # 0xc4bc
movslq (%rcx,%rax,4), %rax
addq %rcx, %rax
jmpq *%rax
movq -0x8(%rbp), %rax
movq 0x8(%rax), %rax
movq (%rax), %rdi
callq 0x2030
jmp 0x7926
jmp 0x7926
movq -0x8(%rbp), %rax
movq 0x8(%rax), %rax
movq (%rax), %rdi
callq 0x7660
jmp 0x7926
movq -0x8(%rbp), %rax
movq 0x8(%rax), %rax
movq (%rax), %rdi
callq 0x7660
movq -0x8(%rbp), %rax
movq 0x8(%rax), %rax
movq 0x8(%rax), %rdi
callq 0x7660
jmp 0x7926
movq -0x8(%rbp), %rax
movq 0x8(%rax), %rax
movq 0x10(%rax), %rdi
callq 0xacf0
movl $0x0, -0xc(%rbp)
movl -0xc(%rbp), %eax
movq -0x8(%rbp), %rcx
movq 0x8(%rcx), %rcx
cmpl 0x8(%rcx), %eax
jge 0x7743
movq -0x8(%rbp), %rax
movq 0x8(%rax), %rax
movq (%rax), %rax
movslq -0xc(%rbp), %rcx
movq (%rax,%rcx,8), %rdi
callq 0x7660
movl -0xc(%rbp), %eax
addl $0x1, %eax
movl %eax, -0xc(%rbp)
jmp 0x7710
movq -0x8(%rbp), %rax
movq 0x8(%rax), %rax
movq (%rax), %rdi
callq 0x2030
jmp 0x7926
movq -0x8(%rbp), %rax
movq 0x8(%rax), %rax
movq (%rax), %rdi
callq 0x7660
movq -0x8(%rbp), %rax
movq 0x8(%rax), %rax
movq 0x8(%rax), %rdi
callq 0x7660
movq -0x8(%rbp), %rax
movq 0x8(%rax), %rax
movq 0x10(%rax), %rdi
callq 0x7660
jmp 0x7926
movq -0x8(%rbp), %rax
movq 0x8(%rax), %rax
movq (%rax), %rdi
callq 0x2030
movq -0x8(%rbp), %rax
movq 0x8(%rax), %rax
movq 0x10(%rax), %rdi
callq 0x7660
movq -0x8(%rbp), %rax
movq 0x8(%rax), %rax
movq 0x8(%rax), %rdi
callq 0xb150
jmp 0x7926
movq -0x8(%rbp), %rax
movq 0x8(%rax), %rax
movq (%rax), %rdi
callq 0x7660
movq -0x8(%rbp), %rax
movq 0x8(%rax), %rax
movq 0x8(%rax), %rdi
callq 0x7660
movq -0x8(%rbp), %rax
movq 0x8(%rax), %rax
movq 0x18(%rax), %rdi
callq 0x7660
movq -0x8(%rbp), %rax
movq 0x8(%rax), %rax
movq 0x10(%rax), %rdi
callq 0x7660
jmp 0x7926
movq -0x8(%rbp), %rax
movq 0x8(%rax), %rax
movq (%rax), %rdi
callq 0x2030
movq -0x8(%rbp), %rax
movq 0x8(%rax), %rax
movq 0x8(%rax), %rdi
callq 0xb150
movq -0x8(%rbp), %rax
movq 0x8(%rax), %rax
movq 0x10(%rax), %rdi
callq 0x7660
jmp 0x7926
movq -0x8(%rbp), %rax
movq 0x8(%rax), %rax
movq 0x8(%rax), %rdi
callq 0x7660
movl $0x0, -0x10(%rbp)
movl -0x10(%rbp), %eax
movq -0x8(%rbp), %rcx
movq 0x8(%rcx), %rcx
cmpl (%rcx), %eax
jge 0x7890
movq -0x8(%rbp), %rax
movq 0x8(%rax), %rax
movq 0x10(%rax), %rax
movslq -0x10(%rbp), %rcx
movq (%rax,%rcx,8), %rdi
callq 0x7660
movl -0x10(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x10(%rbp)
jmp 0x785d
movq -0x8(%rbp), %rax
movq 0x8(%rax), %rax
movq 0x10(%rax), %rdi
callq 0x2030
jmp 0x7926
movq -0x8(%rbp), %rax
movq 0x8(%rax), %rdi
callq 0x7660
movq -0x8(%rbp), %rax
movq $0x0, 0x8(%rax)
jmp 0x7926
movq -0x8(%rbp), %rax
movq 0x8(%rax), %rdi
callq 0x7660
movq -0x8(%rbp), %rax
movq $0x0, 0x8(%rax)
jmp 0x7926
movl $0x0, -0x14(%rbp)
movl -0x14(%rbp), %eax
movq -0x8(%rbp), %rcx
movq 0x8(%rcx), %rcx
cmpl 0x8(%rcx), %eax
jge 0x7916
movq -0x8(%rbp), %rax
movq 0x8(%rax), %rax
movq (%rax), %rax
movslq -0x14(%rbp), %rcx
movq (%rax,%rcx,8), %rdi
callq 0x7660
movl -0x14(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x14(%rbp)
jmp 0x78e3
movq -0x8(%rbp), %rax
movq 0x8(%rax), %rax
movq (%rax), %rdi
callq 0x2030
movq -0x8(%rbp), %rax
cmpq $0x0, 0x10(%rax)
je 0x794f
movq -0x8(%rbp), %rax
movq 0x10(%rax), %rax
cmpq $0x0, (%rax)
je 0x794f
movq -0x8(%rbp), %rax
movq 0x10(%rax), %rax
movq (%rax), %rdi
callq 0xb150
movq -0x8(%rbp), %rax
movq 0x10(%rax), %rdi
callq 0x2030
movq -0x8(%rbp), %rax
movq 0x8(%rax), %rdi
callq 0x2030
movq -0x8(%rbp), %rdi
callq 0x2030
addq $0x20, %rsp
popq %rbp
retq
nopl (%rax,%rax)