// File: /workspace/github_c_makefile_star2_O2/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:
testq %rdi, %rdi
je 0x5094
pushq %r14
pushq %rbx
pushq %rax
movq %rdi, %rbx
movl (%rdi), %eax
decl %eax
cmpl $0xe, %eax
ja 0x51de
leaq 0x345c(%rip), %rcx      # 0x84d4
movslq (%rcx,%rax,4), %rax
addq %rcx, %rax
jmpq *%rax
movq 0x8(%rbx), %rdi
callq 0x5058
andq $0x0, 0x8(%rbx)
jmp 0x51de
retq
movq 0x8(%rbx), %rax
movq (%rax), %rdi
jmp 0x51d9
movq 0x8(%rbx), %rax
movq (%rax), %rdi
callq 0x2030
movq 0x8(%rbx), %rax
movq 0x8(%rax), %rdi
callq 0x73fd
jmp 0x51d1
xorl %r14d, %r14d
movq 0x8(%rbx), %rax
movslq 0x8(%rax), %rcx
movq (%rax), %rdi
cmpq %rcx, %r14
jge 0x50e7
movq (%rdi,%r14,8), %rdi
callq 0x5058
incq %r14
jmp 0x50c2
movq 0x8(%rbx), %rax
movq (%rax), %rdi
callq 0x2030
jmp 0x51de
movq 0x8(%rbx), %rax
movq 0x10(%rax), %rdi
callq 0x71ee
xorl %r14d, %r14d
movq 0x8(%rbx), %rax
movslq 0x8(%rax), %rcx
movq (%rax), %rdi
cmpq %rcx, %r14
jge 0x50e7
movq (%rdi,%r14,8), %rdi
callq 0x5058
incq %r14
jmp 0x5101
movq 0x8(%rbx), %rax
movq (%rax), %rdi
callq 0x5058
movq 0x8(%rbx), %rax
movq 0x8(%rax), %rdi
jmp 0x51cc
movq 0x8(%rbx), %rax
movq (%rax), %rdi
callq 0x5058
movq 0x8(%rbx), %rax
movq 0x8(%rax), %rdi
jmp 0x51d9
movq 0x8(%rbx), %rax
movq 0x8(%rax), %rdi
callq 0x5058
xorl %r14d, %r14d
movq 0x8(%rbx), %rax
movslq (%rax), %rcx
movq 0x10(%rax), %rdi
cmpq %rcx, %r14
jge 0x50e7
movq (%rdi,%r14,8), %rdi
callq 0x5058
incq %r14
jmp 0x5161
movq 0x8(%rbx), %rax
movq (%rax), %rdi
callq 0x2030
movq 0x8(%rbx), %rax
movq 0x10(%rax), %rdi
callq 0x5058
movq 0x8(%rbx), %rax
movq 0x8(%rax), %rdi
callq 0x73fd
jmp 0x51de
movq 0x8(%rbx), %rax
movq (%rax), %rdi
callq 0x5058
movq 0x8(%rbx), %rax
movq 0x8(%rax), %rdi
callq 0x5058
movq 0x8(%rbx), %rax
movq 0x18(%rax), %rdi
callq 0x5058
movq 0x8(%rbx), %rax
movq 0x10(%rax), %rdi
callq 0x5058
movq 0x10(%rbx), %rdi
testq %rdi, %rdi
je 0x51fd
movq (%rdi), %rax
testq %rax, %rax
je 0x51ff
movq %rax, %rdi
callq 0x73fd
movq 0x10(%rbx), %rdi
jmp 0x51ff
xorl %edi, %edi
callq 0x2030
movq 0x8(%rbx), %rdi
callq 0x2030
movq %rbx, %rdi
addq $0x8, %rsp
popq %rbx
popq %r14
jmp 0x2030