// File: /workspace/github_c_makefile_star2_O3/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 0x57df
pushq %r14
pushq %rbx
pushq %rax
movq %rdi, %rbx
movl (%rdi), %eax
decl %eax
cmpl $0xe, %eax
ja 0x5943
leaq 0x3d14(%rip), %rcx      # 0x94d4
movslq (%rcx,%rax,4), %rax
addq %rcx, %rax
jmpq *%rax
movq 0x8(%rbx), %rdi
callq 0x57a0
movq $0x0, 0x8(%rbx)
jmp 0x5943
retq
movq 0x8(%rbx), %rax
movq (%rax), %rdi
jmp 0x593e
movq 0x8(%rbx), %rax
movq (%rax), %rdi
callq 0x2030
movq 0x8(%rbx), %rax
movq 0x8(%rax), %rdi
callq 0x7f4e
jmp 0x5936
movq 0x8(%rbx), %rax
cmpl $0x0, 0x8(%rax)
jle 0x5871
xorl %r14d, %r14d
movq (%rax), %rax
movq (%rax,%r14,8), %rdi
callq 0x57a0
incq %r14
movq 0x8(%rbx), %rax
movslq 0x8(%rax), %rcx
cmpq %rcx, %r14
jl 0x5817
jmp 0x5871
movq 0x8(%rbx), %rax
jmp 0x5871
movq 0x8(%rbx), %rax
movq 0x10(%rax), %rdi
callq 0x7d36
movq 0x8(%rbx), %rax
cmpl $0x0, 0x8(%rax)
jle 0x5871
xorl %r14d, %r14d
movq (%rax), %rax
movq (%rax,%r14,8), %rdi
callq 0x57a0
incq %r14
movq 0x8(%rbx), %rax
movslq 0x8(%rax), %rcx
cmpq %rcx, %r14
jl 0x5855
movq (%rax), %rdi
jmp 0x58e1
movq 0x8(%rbx), %rax
movq (%rax), %rdi
callq 0x57a0
movq 0x8(%rbx), %rax
movq 0x8(%rax), %rdi
jmp 0x5931
movq 0x8(%rbx), %rax
movq (%rax), %rdi
callq 0x57a0
movq 0x8(%rbx), %rax
movq 0x8(%rax), %rdi
jmp 0x593e
movq 0x8(%rbx), %rax
movq 0x8(%rax), %rdi
callq 0x57a0
movq 0x8(%rbx), %rax
cmpl $0x0, (%rax)
jle 0x58dd
xorl %r14d, %r14d
movq 0x10(%rax), %rax
movq (%rax,%r14,8), %rdi
callq 0x57a0
incq %r14
movq 0x8(%rbx), %rax
movslq (%rax), %rcx
cmpq %rcx, %r14
jl 0x58c1
movq 0x10(%rax), %rdi
callq 0x2030
jmp 0x5943
movq 0x8(%rbx), %rax
movq (%rax), %rdi
callq 0x2030
movq 0x8(%rbx), %rax
movq 0x10(%rax), %rdi
callq 0x57a0
movq 0x8(%rbx), %rax
movq 0x8(%rax), %rdi
callq 0x7f4e
jmp 0x5943
movq 0x8(%rbx), %rax
movq (%rax), %rdi
callq 0x57a0
movq 0x8(%rbx), %rax
movq 0x8(%rax), %rdi
callq 0x57a0
movq 0x8(%rbx), %rax
movq 0x18(%rax), %rdi
callq 0x57a0
movq 0x8(%rbx), %rax
movq 0x10(%rax), %rdi
callq 0x57a0
movq 0x10(%rbx), %rdi
testq %rdi, %rdi
je 0x5962
movq (%rdi), %rax
testq %rax, %rax
je 0x5964
movq %rax, %rdi
callq 0x7f4e
movq 0x10(%rbx), %rdi
jmp 0x5964
xorl %edi, %edi
callq 0x2030
movq 0x8(%rbx), %rdi
callq 0x2030
movq %rbx, %rdi
addq $0x8, %rsp
popq %rbx
popq %r14
jmp 0x2030