// File: /workspace/github_c_makefile_star2_O0/neosploit[P]compiler/ast_free.c
// Function: ast_definition_free
static void ast_definition_free(Definition* definition) {

    if (definition->next) ast_definition_free(definition->next);

    switch (definition->tag) {
        case DEFINITION_PROGRAM:
            ast_id_free(definition->program.id);

            break;
        case DEFINITION_CONSTANT:
            ast_id_free(definition->constant.id);
            ast_expression_free(definition->constant.expression);

            break;
        case DEFINITION_TYPE:
            ast_id_free(definition->type.id);
            ast_type_free(definition->type.type);

            break;
        case DEFINITION_FIELD:
            ast_id_free(definition->field.identifiers);
            ast_type_free(definition->field.type);

            break;
        case DEFINITION_VARIABLE:
            ast_id_free(definition->variable.identifiers);
            ast_type_free(definition->variable.type);

            break;
        case DEFINITION_SUBPROGRAM_FORWARD:
            ast_definition_free(definition->subprogram_forward.sub_header);

            break;
        case DEFINITION_SUBPROGRAM:
            ast_definition_free(definition->subprogram.sub_header);
            ast_declaration_free(definition->subprogram.declarations);
            if (definition->subprogram.subprograms) ast_definition_free(definition->subprogram.subprograms);
            if (definition->subprogram.comp_statement) ast_statement_free(definition->subprogram.comp_statement);

            break;
        case DEFINITION_FUNCTION:
            ast_id_free(definition->function.id);
            if (definition->function.formal_parameters) ast_definition_free(definition->function.formal_parameters);
            if (definition->function.type) ast_type_free(definition->function.type);

            break;
        case DEFINITION_PROCEDURE:
            ast_id_free(definition->procedure.id);
            if (definition->procedure.formal_parameters) ast_definition_free(definition->procedure.formal_parameters);

            break;
        case DEFINITION_PARAMETER:
            ast_id_free(definition->parameter.identifiers);
            ast_type_free(definition->parameter.type);
    }

    free(definition);

}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x10, %rsp
movq %rdi, -0x8(%rbp)
movq -0x8(%rbp), %rax
cmpq $0x0, 0x8(%rax)
je 0xfc64
movq -0x8(%rbp), %rax
movq 0x8(%rax), %rdi
callq 0xfc40
movq -0x8(%rbp), %rax
movl 0x4(%rax), %eax
movq %rax, -0x10(%rbp)
subq $0x9, %rax
ja 0xfdfc
movq -0x10(%rbp), %rax
leaq 0x129a8(%rip), %rcx     # 0x2262c
movslq (%rcx,%rax,4), %rax
addq %rcx, %rax
jmpq *%rax
movq -0x8(%rbp), %rax
movq 0x10(%rax), %rdi
callq 0xffe0
jmp 0xfdfc
movq -0x8(%rbp), %rax
movq 0x10(%rax), %rdi
callq 0xffe0
movq -0x8(%rbp), %rax
movq 0x18(%rax), %rdi
callq 0x10020
jmp 0xfdfc
movq -0x8(%rbp), %rax
movq 0x10(%rax), %rdi
callq 0xffe0
movq -0x8(%rbp), %rax
movq 0x18(%rax), %rdi
callq 0x10180
jmp 0xfdfc
movq -0x8(%rbp), %rax
movq 0x10(%rax), %rdi
callq 0xffe0
movq -0x8(%rbp), %rax
movq 0x18(%rax), %rdi
callq 0x10180
jmp 0xfdfc
movq -0x8(%rbp), %rax
movq 0x10(%rax), %rdi
callq 0xffe0
movq -0x8(%rbp), %rax
movq 0x18(%rax), %rdi
callq 0x10180
jmp 0xfdfc
movq -0x8(%rbp), %rax
movq 0x10(%rax), %rdi
callq 0xfc40
jmp 0xfdfc
movq -0x8(%rbp), %rax
movq 0x10(%rax), %rdi
callq 0xfc40
movq -0x8(%rbp), %rax
movq 0x18(%rax), %rdi
callq 0xfe10
movq -0x8(%rbp), %rax
cmpq $0x0, 0x20(%rax)
je 0xfd5f
movq -0x8(%rbp), %rax
movq 0x20(%rax), %rdi
callq 0xfc40
movq -0x8(%rbp), %rax
cmpq $0x0, 0x28(%rax)
je 0xfd77
movq -0x8(%rbp), %rax
movq 0x28(%rax), %rdi
callq 0xfe80
jmp 0xfdfc
movq -0x8(%rbp), %rax
movq 0x10(%rax), %rdi
callq 0xffe0
movq -0x8(%rbp), %rax
cmpq $0x0, 0x18(%rax)
je 0xfda1
movq -0x8(%rbp), %rax
movq 0x18(%rax), %rdi
callq 0xfc40
movq -0x8(%rbp), %rax
cmpq $0x0, 0x20(%rax)
je 0xfdb9
movq -0x8(%rbp), %rax
movq 0x20(%rax), %rdi
callq 0x10180
jmp 0xfdfc
movq -0x8(%rbp), %rax
movq 0x10(%rax), %rdi
callq 0xffe0
movq -0x8(%rbp), %rax
cmpq $0x0, 0x18(%rax)
je 0xfde0
movq -0x8(%rbp), %rax
movq 0x18(%rax), %rdi
callq 0xfc40
jmp 0xfdfc
movq -0x8(%rbp), %rax
movq 0x18(%rax), %rdi
callq 0xffe0
movq -0x8(%rbp), %rax
movq 0x20(%rax), %rdi
callq 0x10180
movq -0x8(%rbp), %rdi
callq 0x7290
addq $0x10, %rsp
popq %rbp
retq
nopl (%rax,%rax)