// File: /workspace/github_c_makefile_star2_O1/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 0x581b
pushq %r14
pushq %rbx
pushq %rax
movq %rdi, %rbx
movl (%rdi), %eax
decl %eax
cmpl $0xe, %eax
ja 0x597f
leaq 0x3cfc(%rip), %rcx      # 0x94f8
movslq (%rcx,%rax,4), %rax
addq %rcx, %rax
jmpq *%rax
movq 0x8(%rbx), %rdi
callq 0x57dc
movq $0x0, 0x8(%rbx)
jmp 0x597f
retq
movq 0x8(%rbx), %rax
movq (%rax), %rdi
jmp 0x597a
movq 0x8(%rbx), %rax
movq (%rax), %rdi
callq 0x2030
movq 0x8(%rbx), %rax
movq 0x8(%rax), %rdi
callq 0x7fd6
jmp 0x5972
movq 0x8(%rbx), %rax
cmpl $0x0, 0x8(%rax)
jle 0x58ad
xorl %r14d, %r14d
movq (%rax), %rax
movq (%rax,%r14,8), %rdi
callq 0x57dc
incq %r14
movq 0x8(%rbx), %rax
movslq 0x8(%rax), %rcx
cmpq %rcx, %r14
jl 0x5853
jmp 0x58ad
movq 0x8(%rbx), %rax
jmp 0x58ad
movq 0x8(%rbx), %rax
movq 0x10(%rax), %rdi
callq 0x7da6
movq 0x8(%rbx), %rax
cmpl $0x0, 0x8(%rax)
jle 0x58ad
xorl %r14d, %r14d
movq (%rax), %rax
movq (%rax,%r14,8), %rdi
callq 0x57dc
incq %r14
movq 0x8(%rbx), %rax
movslq 0x8(%rax), %rcx
cmpq %rcx, %r14
jl 0x5891
movq (%rax), %rdi
jmp 0x591d
movq 0x8(%rbx), %rax
movq (%rax), %rdi
callq 0x57dc
movq 0x8(%rbx), %rax
movq 0x8(%rax), %rdi
jmp 0x596d
movq 0x8(%rbx), %rax
movq (%rax), %rdi
callq 0x57dc
movq 0x8(%rbx), %rax
movq 0x8(%rax), %rdi
jmp 0x597a
movq 0x8(%rbx), %rax
movq 0x8(%rax), %rdi
callq 0x57dc
movq 0x8(%rbx), %rax
cmpl $0x0, (%rax)
jle 0x5919
xorl %r14d, %r14d
movq 0x10(%rax), %rax
movq (%rax,%r14,8), %rdi
callq 0x57dc
incq %r14
movq 0x8(%rbx), %rax
movslq (%rax), %rcx
cmpq %rcx, %r14
jl 0x58fd
movq 0x10(%rax), %rdi
callq 0x2030
jmp 0x597f
movq 0x8(%rbx), %rax
movq (%rax), %rdi
callq 0x2030
movq 0x8(%rbx), %rax
movq 0x10(%rax), %rdi
callq 0x57dc
movq 0x8(%rbx), %rax
movq 0x8(%rax), %rdi
callq 0x7fd6
jmp 0x597f
movq 0x8(%rbx), %rax
movq (%rax), %rdi
callq 0x57dc
movq 0x8(%rbx), %rax
movq 0x8(%rax), %rdi
callq 0x57dc
movq 0x8(%rbx), %rax
movq 0x18(%rax), %rdi
callq 0x57dc
movq 0x8(%rbx), %rax
movq 0x10(%rax), %rdi
callq 0x57dc
movq 0x10(%rbx), %rax
testq %rax, %rax
je 0x5995
movq (%rax), %rdi
testq %rdi, %rdi
je 0x5995
callq 0x7fd6
movq 0x10(%rbx), %rdi
callq 0x2030
movq 0x8(%rbx), %rdi
callq 0x2030
movq %rbx, %rdi
addq $0x8, %rsp
popq %rbx
popq %r14
jmp 0x2030