LLM4Binary/decompile-bench-makefile huggingface dataset:
// File: /workspace/github_c_makefile_star2_O1/johnvtan[P]ccccc/map.c
// Function: map_get_pair_from_key
static pair_t *map_get_pair_from_key(map_t *map, string_t *key) {
    pair_t *pair;
    list_for_each(map->pairs, pair) {
        if (string_eq(key, pair->key) == 0) {
            return pair;
        }
    }
    return NULL;
}

// Assembly:
pushq %r15
pushq %r14
pushq %r12
pushq %rbx
pushq %rax
movq %rsi, %r14
movq %rdi, %r15
movq (%rdi), %rax
movq (%rax), %rcx
movq 0x8(%rcx), %rcx
movq %rcx, 0x10(%rax)
movq %rsp, %r12
xorl %ebx, %ebx
movq (%r15), %rdi
addq $0x10, %rdi
movq %r12, %rsi
callq 0x30f8
testb %al, %al
je 0x324a
movq (%rsp), %rax
movq (%rax), %rsi
movq %r14, %rdi
callq 0x4f6b
testl %eax, %eax
jne 0x3220
movq (%rsp), %rbx
movq %rbx, %rax
addq $0x8, %rsp
popq %rbx
popq %r12
popq %r14
popq %r15
retq
// File: /workspace/github_c_makefile_star2_O1/johnvtan[P]ccccc/map.c
// Function: map_set
int map_set(map_t *map, string_t *key, void *value) {
    if (!map)
        return -1;

    // Overwrite the value if the key already exists in the map
    pair_t *pair = map_get_pair_from_key(map, key);
    if (pair) {
        pair->value = value;
        return 0;
    }
   
    pair = malloc(sizeof(pair_t));
    if (!pair)
        return -1;
    pair->key = key;
    pair->value = value;
    list_push(map->pairs, pair);
    return 0;
}

// Assembly:
pushq %r15
pushq %r14
pushq %r12
pushq %rbx
pushq %rax
movl $0xffffffff, %ebx       # imm = 0xFFFFFFFF
testq %rdi, %rdi
je 0x32a7
movq %rdx, %r14
movq %rsi, %r12
movq %rdi, %r15
callq 0x31ff
testq %rax, %rax
je 0x3284
movq %r14, 0x8(%rax)
jmp 0x32a5
movl $0x10, %edi
callq 0x10e0
testq %rax, %rax
je 0x32a7
movq %r12, (%rax)
movq %r14, 0x8(%rax)
movq (%r15), %rdi
movq %rax, %rsi
callq 0x2f67
xorl %ebx, %ebx
movl %ebx, %eax
addq $0x8, %rsp
popq %rbx
popq %r12
popq %r14
popq %r15
retq
// File: /workspace/github_c_makefile_star2_O1/johnvtan[P]ccccc/output.c
// Function: operand_to_string
static char *operand_to_string(operand_t operand) {
    if (operand.type == OPERAND_REG) {
        return reg_to_string(operand.reg);
    }

    if (operand.type == OPERAND_LABEL) {
        return string_get(operand.label);
    }

    if (operand.type == OPERAND_VAR) {
        UNREACHABLE("VARs should not be in output\n");
    }

    string_t string;
    char buf[100];
    if (string_init(&string) < 0)
        return NULL;
    
    if (operand.type == OPERAND_IMM) {
        snprintf(buf, 100, "$%ld", operand.imm);
    } else if (operand.type == OPERAND_MEM_LOC) {
        snprintf(buf, 100, "%ld(%s)", operand.mem.offset, reg_to_string(operand.mem.reg));
    }
    string_append(&string, buf, strlen(buf));
    return string_get(&string);
}

// Assembly:
pushq %rbp
pushq %r14
pushq %rbx
subq $0x80, %rsp
leaq 0xa0(%rsp), %rbx
movl (%rbx), %ebp
testl %ebp, %ebp
je 0x3573
cmpl $0x4, %ebp
je 0x355f
cmpl $0x2, %ebp
je 0x3640
movq %rsp, %rdi
callq 0x4eb1
testl %eax, %eax
js 0x35b5
cmpl $0x1, %ebp
je 0x35b9
cmpl $0x3, %ebp
jne 0x360f
movq 0x8(%rbx), %rcx
leaq 0x32cc(%rip), %rdx      # 0x6815
leaq 0x10(%rsp), %rdi
movl $0x64, %esi
xorl %eax, %eax
callq 0x1090
jmp 0x360f
movq 0x8(%rbx), %rdi
addq $0x80, %rsp
popq %rbx
popq %r14
popq %rbp
jmp 0x4f2b
movl 0x8(%rbx), %ecx
cmpl $0x1, %ecx
jne 0x3587
leaq 0x32a0(%rip), %rax      # 0x6822
jmp 0x3634
movl $0x10, %esi
xorl %eax, %eax
leaq 0x661b(%rip), %rdx      # 0x9bb0
leaq 0x10(%rsi), %rdi
cmpq $0xe0, %rdi
je 0x3634
cmpl %ecx, (%rsi,%rdx)
movq %rdi, %rsi
jne 0x3595
movq -0x8(%rdi,%rdx), %rax
jmp 0x3634
xorl %eax, %eax
jmp 0x3634
movq 0x10(%rbx), %rcx
movl 0x8(%rbx), %eax
cmpl $0x1, %eax
jne 0x35ce
leaq 0x3256(%rip), %r8       # 0x6822
jmp 0x35f7
movl $0x10, %esi
xorl %r8d, %r8d
leaq 0x65d3(%rip), %rdx      # 0x9bb0
leaq 0x10(%rsi), %rdi
cmpq $0xe0, %rdi
je 0x35f7
cmpl %eax, (%rsi,%rdx)
movq %rdi, %rsi
jne 0x35dd
movq -0x8(%rdi,%rdx), %r8
leaq 0x321c(%rip), %rdx      # 0x681a
leaq 0x10(%rsp), %rdi
movl $0x64, %esi
xorl %eax, %eax
callq 0x1090
leaq 0x10(%rsp), %rbx
movq %rbx, %rdi
callq 0x1070
movq %rsp, %r14
movq %r14, %rdi
movq %rbx, %rsi
movl %eax, %edx
callq 0x4e5c
movq %r14, %rdi
callq 0x4f2b
addq $0x80, %rsp
popq %rbx
popq %r14
popq %rbp
retq
leaq 0x2aed(%rip), %rdi      # 0x6134
leaq 0x31a0(%rip), %rsi      # 0x67ee
leaq 0x31a2(%rip), %rcx      # 0x67f7
movl $0x5c, %edx
xorl %eax, %eax
callq 0x1080
movl $0xffffffff, %edi       # imm = 0xFFFFFFFF
callq 0x1110
nop
// File: /workspace/github_c_makefile_star2_O1/johnvtan[P]ccccc/parse.c
// Function: match
static bool match(list_t *tokens, token_type_t expectation) {
    token_t *next = list_peek(tokens);
    if (!next || next->type != expectation) {
        return false;
    }
    debug("Found expected\n");
    list_pop(tokens);
    return true;
}

// Assembly:
pushq %rbp
pushq %rbx
pushq %rax
movl %esi, %ebp
movq %rdi, %rbx
callq 0x305e
testq %rax, %rax
je 0x39cd
cmpl %ebp, (%rax)
jne 0x39cd
movq %rbx, %rdi
callq 0x2ffb
movb $0x1, %al
jmp 0x39cf
xorl %eax, %eax
addq $0x8, %rsp
popq %rbx
popq %rbp
retq
// File: /workspace/github_c_makefile_star2_O1/johnvtan[P]ccccc/parse.c
// Function: parse_stmt_list
static list_t *parse_stmt_list(list_t *tokens, env_t *env) {
    expect_next(tokens, TOK_OPEN_BRACE);
    list_t *stmt_list = list_new();
    token_t *curr;
    debug("parsing statement list\n");
    while ((curr = list_peek(tokens)) && curr->type != TOK_CLOSE_BRACE) {
        list_push(stmt_list, parse_stmt(tokens, env));
    }
    debug("done parsing statement list\n");
    expect_next(tokens, TOK_CLOSE_BRACE);
    return stmt_list;
}

// Assembly:
pushq %r15
pushq %r14
pushq %rbx
movq %rsi, %r14
movq %rdi, %rbx
movl $0xc, %esi
callq 0x3a74
callq 0x2efc
movq %rax, %r15
movq %rbx, %rdi
callq 0x305e
testq %rax, %rax
je 0x3a1d
cmpl $0xd, (%rax)
je 0x3a1d
movq %rbx, %rdi
movq %r14, %rsi
callq 0x3ab2
movq %r15, %rdi
movq %rax, %rsi
callq 0x2f67
jmp 0x39f3
movq %rbx, %rdi
movl $0xd, %esi
callq 0x3a74
movq %r15, %rax
popq %rbx
popq %r14
popq %r15
retq
// File: /workspace/github_c_makefile_star2_O1/johnvtan[P]ccccc/parse.c
// Function: expect_next
static token_t *expect_next(list_t *tokens, token_type_t expectation) {
    token_t *next = list_pop(tokens);
    if (!next || next->type != expectation) {
        debug("Unexpected token: %u\n", (unsigned)next->type);
        UNREACHABLE("Parse failed");
    }
    return next;
}

// Assembly:
pushq %rbx
movl %esi, %ebx
callq 0x2ffb
testq %rax, %rax
je 0x3a87
cmpl %ebx, (%rax)
jne 0x3a87
popq %rbx
retq
leaq 0x26a6(%rip), %rdi      # 0x6134
leaq 0x2e07(%rip), %rsi      # 0x689c
leaq 0x2edf(%rip), %rcx      # 0x697b
movl $0x20, %edx
xorl %eax, %eax
callq 0x1080
movl $0xffffffff, %edi       # imm = 0xFFFFFFFF
callq 0x1110
// File: /workspace/github_c_makefile_star2_O1/johnvtan[P]ccccc/parse.c
// Function: parse_block
static block_t *parse_block(list_t *tokens, env_t *outer) {
    block_t *block = malloc(sizeof(block_t));
    block->env = env_new(outer);
    block->stmts = parse_stmt_list(tokens, block->env);
    return block;
}

// Assembly:
pushq %r15
pushq %r14
pushq %rbx
movq %rsi, %rbx
movq %rdi, %r14
movl $0x10, %edi
callq 0x10e0
movq %rax, %r15
movq %rbx, %rdi
callq 0x2e04
movq %rax, 0x8(%r15)
movq %r14, %rdi
movq %rax, %rsi
callq 0x39d6
movq %rax, (%r15)
movq %r15, %rax
popq %rbx
popq %r14
popq %r15
retq
// File: /workspace/github_c_makefile_star2_O1/johnvtan[P]ccccc/parse.c
// Function: parse_declare_stmt
static declare_stmt_t *parse_declare_stmt(list_t *tokens, env_t *env) {
    declare_stmt_t *declare = malloc(sizeof(declare_stmt_t));
    declare->init_expr = NULL;
    token_t *next = list_pop(tokens);
    declare->type = token_to_builtin_type(next->type); 
    next = list_peek(tokens);
    if (next->type != TOK_IDENT) {
        debug("Error in parse_declare_stmt: No identifier found following the type.\n");
        return NULL;
    }

    declare->name = next->ident;
    debug("parse_declare_stmt: Found variable %s\n", string_get(declare->name));

    if (map_contains(env->homes, declare->name)) {
        UNREACHABLE("parse_declare_stmt: variable is redeclared!\n");
    }
    env_add(env, declare->name, declare->type, false);

    list_pop(tokens);
    next = list_peek(tokens);
    if (next->type != TOK_SEMICOLON) {
        debug("parse_declare_stmt: Found init_expr\n");
        expect_next(tokens, TOK_ASSIGN);
        declare->init_expr = parse_expr(tokens, env);
    }
    expect_next(tokens, TOK_SEMICOLON);
    debug("parse_declare_stmt: Returning\n");
    return declare;
}

// Assembly:
pushq %rbp
pushq %r15
pushq %r14
pushq %r12
pushq %rbx
movq %rsi, %r15
movq %rdi, %r14
movl $0x18, %edi
callq 0x10e0
movq %rax, %rbx
movq $0x0, 0x10(%rax)
movq %r14, %rdi
callq 0x2ffb
movl (%rax), %edi
callq 0x3a33
movl %eax, %ebp
movl %eax, (%rbx)
movq %r14, %rdi
callq 0x305e
cmpl $0x3, (%rax)
jne 0x3fe3
movq 0x8(%rax), %r12
movq %r12, 0x8(%rbx)
movq (%r15), %rdi
movq %r12, %rsi
callq 0x32b5
testb %al, %al
jne 0x3ff1
movq %r15, %rdi
movq %r12, %rsi
movl %ebp, %edx
xorl %ecx, %ecx
callq 0x2ec2
movq %r14, %rdi
callq 0x2ffb
movq %r14, %rdi
callq 0x305e
cmpl $0x12, (%rax)
je 0x3fd4
movq %r14, %rdi
movl $0xb, %esi
callq 0x3a74
movq %r14, %rdi
movq %r15, %rsi
callq 0x401c
movq %rax, 0x10(%rbx)
movq %r14, %rdi
movl $0x12, %esi
callq 0x3a74
jmp 0x3fe5
xorl %ebx, %ebx
movq %rbx, %rax
popq %rbx
popq %r12
popq %r14
popq %r15
popq %rbp
retq
leaq 0x213c(%rip), %rdi      # 0x6134
leaq 0x289d(%rip), %rsi      # 0x689c
leaq 0x29c5(%rip), %rcx      # 0x69cb
movl $0x242, %edx            # imm = 0x242
xorl %eax, %eax
callq 0x1080
movl $0xffffffff, %edi       # imm = 0xFFFFFFFF
callq 0x1110
// File: /workspace/github_c_makefile_star2_O1/johnvtan[P]ccccc/parse.c
// Function: parse_block_or_single
static block_or_single_t *parse_block_or_single(list_t *tokens, env_t *env) {
    block_or_single_t *ret = malloc(sizeof(block_or_single_t));
    if (check_next(tokens, TOK_OPEN_BRACE)) {
        debug("Parsing block\n");
        ret->type = BLOCK;
        ret->block = parse_block(tokens, env);
    } else {
        debug("Parsing single\n");
        ret->type = SINGLE;
        ret->single = parse_stmt(tokens, env);
        if (ret->single->type == STMT_DECLARE) {
            UNREACHABLE("Error: in single of block or single, statement cannot be a declare");
        }
    }
    return ret;
}

// Assembly:
pushq %r15
pushq %r14
pushq %rbx
movq %rsi, %r14
movq %rdi, %r15
movl $0x10, %edi
callq 0x10e0
movq %rax, %rbx
movq %r15, %rdi
callq 0x305e
testq %rax, %rax
je 0x4104
cmpl $0xc, (%rax)
jne 0x4104
movl $0x0, (%rbx)
movq %r15, %rdi
movq %r14, %rsi
callq 0x3eff
movq %rax, 0x8(%rbx)
jmp 0x411e
movl $0x1, (%rbx)
movq %r15, %rdi
movq %r14, %rsi
callq 0x3ab2
movq %rax, 0x8(%rbx)
cmpl $0x1, (%rax)
je 0x4127
movq %rbx, %rax
popq %rbx
popq %r14
popq %r15
retq
leaq 0x2006(%rip), %rdi      # 0x6134
leaq 0x2767(%rip), %rsi      # 0x689c
leaq 0x284c(%rip), %rcx      # 0x6988
movl $0x25d, %edx            # imm = 0x25D
xorl %eax, %eax
callq 0x1080
movl $0xffffffff, %edi       # imm = 0xFFFFFFFF
callq 0x1110
// File: /workspace/github_c_makefile_star2_O1/johnvtan[P]ccccc/parse.c
// Function: parse_ternary
static expr_t *parse_ternary(list_t *tokens, env_t *env) {
    expr_t *cond = parse_logical_or(tokens, env);
    if (!check_next(tokens, TOK_QUESTION)) {
        debug("parse_ternary: no question mark found, not a ternary\n");
        return cond;
    }

    debug("parse_ternary: Found a ternary\n");
    expect_next(tokens, TOK_QUESTION);
    expr_t *then = parse_expr(tokens, env);
    debug("parse_ternary: got then\n");
    expect_next(tokens, TOK_COLON);
    expr_t *els = parse_ternary(tokens, env);
    debug("parse_ternary: got else\n");

    return new_ternary(cond, then, els);
}

// Assembly:
pushq %rbp
pushq %r15
pushq %r14
pushq %r12
pushq %rbx
movq %rsi, %r14
movq %rdi, %r15
callq 0x4403
movq %rax, %rbx
movq %r15, %rdi
callq 0x305e
testq %rax, %rax
je 0x41e4
cmpl $0x1a, (%rax)
jne 0x41e4
movq %r15, %rdi
callq 0x2ffb
movq %r15, %rdi
movq %r14, %rsi
callq 0x4403
movl $0xb, %edi
movq %rbx, %rsi
movq %rax, %rdx
callq 0x431a
jmp 0x41aa
movq %r15, %rdi
callq 0x305e
testq %rax, %rax
je 0x4269
cmpl $0x27, (%rax)
jne 0x4269
movq %r15, %rdi
movl $0x27, %esi
callq 0x3a74
movq %r15, %rdi
movq %r14, %rsi
callq 0x401c
movq %rax, %r12
movq %r15, %rdi
movl $0x26, %esi
callq 0x3a74
movq %r15, %rdi
movq %r14, %rsi
callq 0x4197
movl 0x4(%r12), %ebp
cmpl 0x4(%rax), %ebp
jne 0x4275
movq %rax, %r14
movl $0x10, %edi
callq 0x10e0
movq %rax, %r15
movl $0x3, (%rax)
movl $0x18, %edi
callq 0x10e0
movq %rax, 0x8(%r15)
movq %rbx, (%rax)
movq %r12, 0x8(%rax)
movq %r14, 0x10(%rax)
movl %ebp, 0x4(%r15)
movq %r15, %rbx
movq %rbx, %rax
popq %rbx
popq %r12
popq %r14
popq %r15
popq %rbp
retq
leaq 0x1eb8(%rip), %rdi      # 0x6134
leaq 0x2619(%rip), %rsi      # 0x689c
leaq 0x29b3(%rip), %rcx      # 0x6c3d
movl $0xaf, %edx
xorl %eax, %eax
callq 0x1080
movl $0xffffffff, %edi       # imm = 0xFFFFFFFF
callq 0x1110
// File: /workspace/github_c_makefile_star2_O1/johnvtan[P]ccccc/parse.c
// Function: new_assign
static expr_t *new_assign(expr_t *lhs, expr_t *rhs) {
    if (lhs->c_type != rhs->c_type) {
        // TODO implicit type conversions?
        UNREACHABLE("new_assign: lhs type doesn't equal rhs type\n");
    }
    expr_t *ret = malloc(sizeof(expr_t)); 
    ret->type = ASSIGN;
    ret->assign = malloc(sizeof(assign_t));
    ret->assign->lhs = lhs;
    ret->assign->rhs = rhs;
    ret->c_type = lhs->c_type;
    return ret;
}

// Assembly:
pushq %rbp
pushq %r15
pushq %r14
pushq %rbx
pushq %rax
movl 0x4(%rdi), %ebp
cmpl 0x4(%rsi), %ebp
jne 0x42ef
movq %rsi, %rbx
movq %rdi, %r14
movl $0x10, %edi
callq 0x10e0
movq %rax, %r15
movl $0x4, (%rax)
movl $0x10, %edi
callq 0x10e0
movq %rax, 0x8(%r15)
movq %r14, (%rax)
movq %rbx, 0x8(%rax)
movl %ebp, 0x4(%r15)
movq %r15, %rax
addq $0x8, %rsp
popq %rbx
popq %r14
popq %r15
popq %rbp
retq
leaq 0x1e3e(%rip), %rdi      # 0x6134
leaq 0x259f(%rip), %rsi      # 0x689c
leaq 0x2972(%rip), %rcx      # 0x6c76
movl $0x76, %edx
xorl %eax, %eax
callq 0x1080
movl $0xffffffff, %edi       # imm = 0xFFFFFFFF
callq 0x1110
// File: /workspace/github_c_makefile_star2_O1/johnvtan[P]ccccc/parse.c
// Function: new_bin_expr
static expr_t *new_bin_expr(enum bin_op op, expr_t *lhs, expr_t *rhs) {
    if (!rhs || !lhs) {
        UNREACHABLE("");
    }

    if (rhs->c_type != lhs->c_type) {
        UNREACHABLE("new_bin_expr: lhs type doesn't match rhs type\n");
    }

    expr_t *expr = malloc(sizeof(bin_expr_t));
    if (!expr) {
        UNREACHABLE("");
    }

    expr->bin = malloc(sizeof(bin_expr_t));
    if (!expr->bin) {
        UNREACHABLE("");
    }
    expr->type = BIN_OP;
    expr->bin->op = op;
    expr->bin->lhs = lhs;
    expr->bin->rhs = rhs;
    expr->c_type = lhs->c_type;
    return expr;
}

// Assembly:
pushq %rbp
pushq %r15
pushq %r14
pushq %r12
pushq %rbx
testq %rsi, %rsi
je 0x4384
movq %rdx, %rbx
testq %rdx, %rdx
je 0x4384
movq %rsi, %r14
movl 0x4(%rsi), %r12d
cmpl %r12d, 0x4(%rbx)
jne 0x43a0
movl %edi, %ebp
movl $0x18, %edi
callq 0x10e0
testq %rax, %rax
je 0x43bc
movq %rax, %r15
movl $0x18, %edi
callq 0x10e0
movq %rax, 0x8(%r15)
testq %rax, %rax
je 0x43d8
movl $0x2, (%r15)
movl %ebp, (%rax)
movq %r14, 0x8(%rax)
movq %rbx, 0x10(%rax)
movl %r12d, 0x4(%r15)
movq %r15, %rax
popq %rbx
popq %r12
popq %r14
popq %r15
popq %rbp
retq
leaq 0x1da9(%rip), %rdi      # 0x6134
leaq 0x250a(%rip), %rsi      # 0x689c
leaq 0x293b(%rip), %rcx      # 0x6cd4
movl $0x47, %edx
jmp 0x43f2
leaq 0x1d8d(%rip), %rdi      # 0x6134
leaq 0x24ee(%rip), %rsi      # 0x689c
leaq 0x28ee(%rip), %rcx      # 0x6ca3
movl $0x4b, %edx
jmp 0x43f2
leaq 0x1d71(%rip), %rdi      # 0x6134
leaq 0x24d2(%rip), %rsi      # 0x689c
leaq 0x2903(%rip), %rcx      # 0x6cd4
movl $0x50, %edx
jmp 0x43f2
leaq 0x1d55(%rip), %rdi      # 0x6134
leaq 0x24b6(%rip), %rsi      # 0x689c
leaq 0x28e7(%rip), %rcx      # 0x6cd4
movl $0x55, %edx
xorl %eax, %eax
callq 0x1080
movl $0xffffffff, %edi       # imm = 0xFFFFFFFF
callq 0x1110
// File: /workspace/github_c_makefile_star2_O1/johnvtan[P]ccccc/parse.c
// Function: parse_logical_and
static expr_t *parse_logical_and(list_t *tokens, env_t *env) {
    expr_t *ret = parse_equality(tokens, env);

    token_t *curr;
    while ((curr = list_peek(tokens))) {
        if (curr->type == TOK_AND) {
            debug("Found logical and expr\n");
            list_pop(tokens);
            ret = new_bin_expr(BIN_AND, ret, parse_equality(tokens, env));
        } else {
            break;
        }
    }
    return ret;
}

// Assembly:
pushq %r15
pushq %r14
pushq %rbx
movq %rsi, %rbx
movq %rdi, %r14
callq 0x4456
movq %rax, %r15
movq %r14, %rdi
callq 0x305e
testq %rax, %rax
je 0x444d
cmpl $0x19, (%rax)
jne 0x444d
movq %r14, %rdi
callq 0x2ffb
movq %r14, %rdi
movq %rbx, %rsi
callq 0x4456
movl $0xa, %edi
movq %r15, %rsi
movq %rax, %rdx
callq 0x431a
jmp 0x4413
movq %r15, %rax
popq %rbx
popq %r14
popq %r15
retq
// File: /workspace/github_c_makefile_star2_O1/johnvtan[P]ccccc/parse.c
// Function: parse_equality
static expr_t *parse_equality(list_t *tokens, env_t *env) {
    expr_t *ret = parse_relational(tokens, env);

    token_t *curr;
    while ((curr = list_peek(tokens))) {
        if (curr->type == TOK_NE) {
            debug("Found not equal\n");
            list_pop(tokens);
            ret = new_bin_expr(BIN_NE, ret, parse_relational(tokens, env));
        } else if (curr->type == TOK_EQ) {
            debug("Found equal to\n");
            list_pop(tokens);
            ret = new_bin_expr(BIN_EQ, ret, parse_relational(tokens, env));
        } else {
            break;
        }
    }
    return ret;
}

// Assembly:
pushq %rbp
pushq %r15
pushq %r14
pushq %rbx
pushq %rax
movq %rsi, %rbx
movq %rdi, %r14
callq 0x44be
movq %rax, %r15
movq %r14, %rdi
callq 0x305e
testq %rax, %rax
je 0x44b0
movl (%rax), %eax
movl $0x9, %ebp
cmpl $0x1c, %eax
je 0x448e
cmpl $0x1b, %eax
jne 0x44b0
movl $0x8, %ebp
movq %r14, %rdi
callq 0x2ffb
movq %r14, %rdi
movq %rbx, %rsi
callq 0x44be
movl %ebp, %edi
movq %r15, %rsi
movq %rax, %rdx
callq 0x431a
jmp 0x4468
movq %r15, %rax
addq $0x8, %rsp
popq %rbx
popq %r14
popq %r15
popq %rbp
retq
// File: /workspace/github_c_makefile_star2_O1/johnvtan[P]ccccc/parse.c
// Function: parse_relational
static expr_t *parse_relational(list_t *tokens, env_t *env) {
    expr_t *ret = parse_add_sub(tokens, env);

    token_t *curr;
    while ((curr = list_peek(tokens))) {
        if (curr->type == TOK_GT) {
            debug("Found gt");
            list_pop(tokens);
            ret = new_bin_expr(BIN_GT, ret, parse_add_sub(tokens, env));
        } else if (curr->type == TOK_LT) {
            debug("Found lt");
            list_pop(tokens);
            ret = new_bin_expr(BIN_LT, ret, parse_add_sub(tokens, env));
        } else if (curr->type == TOK_GTE) {
            debug("Found lte");
            list_pop(tokens);
            ret = new_bin_expr(BIN_GTE, ret, parse_add_sub(tokens, env));
        } else if (curr->type == TOK_LTE) {
            debug("Found lte");
            list_pop(tokens);
            ret = new_bin_expr(BIN_LTE, ret, parse_add_sub(tokens, env));
        } else {
            break;
        }
    }
    return ret;
}

// Assembly:
pushq %rbp
pushq %r15
pushq %r14
pushq %r12
pushq %rbx
movq %rsi, %rbx
movq %rdi, %r14
callq 0x4534
movq %rax, %r15
movq %r14, %rdi
callq 0x305e
testq %rax, %rax
je 0x4528
leaq 0x2388(%rip), %r12      # 0x6870
movl (%rax), %eax
addl $-0x1d, %eax
cmpl $0x3, %eax
ja 0x4528
movl %eax, %eax
movl (%r12,%rax,4), %ebp
movq %r14, %rdi
callq 0x2ffb
movq %r14, %rdi
movq %rbx, %rsi
callq 0x4534
movl %ebp, %edi
movq %r15, %rsi
movq %rax, %rdx
callq 0x431a
movq %rax, %r15
movq %r14, %rdi
callq 0x305e
testq %rax, %rax
jne 0x44e8
movq %r15, %rax
popq %rbx
popq %r12
popq %r14
popq %r15
popq %rbp
retq
// File: /workspace/github_c_makefile_star2_O1/johnvtan[P]ccccc/parse.c
// Function: parse_add_sub
static expr_t *parse_add_sub(list_t *tokens, env_t *env) {
    expr_t *ret = parse_mul_div(tokens, env);

    while (tokens->len) {
        if (match(tokens, TOK_PLUS)) {
            debug("Found plus\n");
            ret = new_bin_expr(BIN_ADD, ret, parse_mul_div(tokens, env));
        } else if (match(tokens, TOK_MINUS)) {
            debug("Found minus\n");
            ret = new_bin_expr(BIN_SUB, ret, parse_mul_div(tokens, env));
        } else {
            break;
        }
    }
    return ret;
}

// Assembly:
pushq %rbp
pushq %r15
pushq %r14
pushq %rbx
pushq %rax
movq %rsi, %rbx
movq %rdi, %r14
callq 0x45a1
movq %rax, %r15
cmpl $0x0, 0x18(%r14)
je 0x4593
movq %r14, %rdi
movl $0x8, %esi
callq 0x39ab
xorl %ebp, %ebp
testb %al, %al
jne 0x4579
movq %r14, %rdi
movl $0x14, %esi
callq 0x39ab
movl $0x1, %ebp
testb %al, %al
je 0x4593
movq %r14, %rdi
movq %rbx, %rsi
callq 0x45a1
movl %ebp, %edi
movq %r15, %rsi
movq %rax, %rdx
callq 0x431a
jmp 0x4546
movq %r15, %rax
addq $0x8, %rsp
popq %rbx
popq %r14
popq %r15
popq %rbp
retq
// File: /workspace/github_c_makefile_star2_O1/johnvtan[P]ccccc/parse.c
// Function: parse_mul_div
static expr_t *parse_mul_div(list_t *tokens, env_t *env) {
    expr_t *ret = parse_unary(tokens, env);

    while (tokens->len) {
        if (match(tokens, TOK_MULT)) {
            debug("Found mult\n");
            ret = new_bin_expr(BIN_MUL, ret, parse_unary(tokens, env));
        } else if (match(tokens, TOK_DIV)) {
            debug("Found div\n");
            ret = new_bin_expr(BIN_DIV, ret, parse_unary(tokens, env));
        } else if (match(tokens, TOK_MODULO)){
            debug("Found modulo\n");
            ret = new_bin_expr(BIN_MODULO, ret, parse_mul_div(tokens, env));
        } else {
            break;
        }
    }
    return ret;
}

// Assembly:
pushq %r15
pushq %r14
pushq %rbx
movq %rsi, %rbx
movq %rdi, %r14
callq 0x4632
movq %rax, %r15
cmpl $0x0, 0x18(%r14)
je 0x4629
movq %r14, %rdi
movl $0x9, %esi
callq 0x39ab
movq %r14, %rdi
testb %al, %al
je 0x45de
movq %rbx, %rsi
callq 0x4632
movl $0x2, %edi
jmp 0x461c
movl $0xa, %esi
callq 0x39ab
movq %r14, %rdi
testb %al, %al
je 0x45fe
movq %rbx, %rsi
callq 0x4632
movl $0x3, %edi
jmp 0x461c
movl $0x21, %esi
callq 0x39ab
testb %al, %al
je 0x4629
movq %r14, %rdi
movq %rbx, %rsi
callq 0x45a1
movl $0xc, %edi
movq %r15, %rsi
movq %rax, %rdx
callq 0x431a
jmp 0x45b1
movq %r15, %rax
popq %rbx
popq %r14
popq %r15
retq
// File: /workspace/github_c_makefile_star2_O1/johnvtan[P]ccccc/parse.c
// Function: new_unary_expr
static expr_t *new_unary_expr(enum unary_op op, expr_t *inner) {
    if (!inner) {
        UNREACHABLE("");
    }

    expr_t *expr = malloc(sizeof(unary_expr_t));
    if (!expr) {
        UNREACHABLE("");
    }
    expr->unary = malloc(sizeof(unary_expr_t));
    if (!expr->unary) {
        UNREACHABLE("");
    }
    expr->type = UNARY_OP;
    expr->unary->op = op;
    expr->unary->expr = inner;
    expr->c_type = inner->c_type;
    return expr;
}

// Assembly:
pushq %rbp
pushq %r14
pushq %rbx
testq %rsi, %rsi
je 0x4cf4
movq %rsi, %rbx
movl %edi, %ebp
movl $0x10, %edi
callq 0x10e0
testq %rax, %rax
je 0x4d10
movq %rax, %r14
movl $0x10, %edi
callq 0x10e0
movq %rax, 0x8(%r14)
testq %rax, %rax
je 0x4d2c
movl $0x1, (%r14)
movl %ebp, (%rax)
movq %rbx, 0x8(%rax)
movl 0x4(%rbx), %eax
movl %eax, 0x4(%r14)
movq %r14, %rax
popq %rbx
popq %r14
popq %rbp
retq
leaq 0x1439(%rip), %rdi      # 0x6134
leaq 0x1b9a(%rip), %rsi      # 0x689c
leaq 0x1fcb(%rip), %rcx      # 0x6cd4
movl $0x61, %edx
jmp 0x4d46
leaq 0x141d(%rip), %rdi      # 0x6134
leaq 0x1b7e(%rip), %rsi      # 0x689c
leaq 0x1faf(%rip), %rcx      # 0x6cd4
movl $0x66, %edx
jmp 0x4d46
leaq 0x1401(%rip), %rdi      # 0x6134
leaq 0x1b62(%rip), %rsi      # 0x689c
leaq 0x1f93(%rip), %rcx      # 0x6cd4
movl $0x6a, %edx
xorl %eax, %eax
callq 0x1080
movl $0xffffffff, %edi       # imm = 0xFFFFFFFF
callq 0x1110
nop
// File: /workspace/github_c_makefile_star2_O1/johnvtan[P]ccccc/string.c
// Function: file_to_string
string_t *file_to_string(char *filename) {
    FILE *fp = fopen(filename, "r");
    if (!fp)
        return NULL;
    char buf[1024];
    string_t *new = string_new(); 
    while (1) {
        int nread = fread(buf, 1, sizeof(buf), fp);
        if (nread == 0)
            break;
        string_append(new, buf, nread);
    }

    string_append(new, "\n\n", 2);
    return new;
}

// Assembly:
pushq %r15
pushq %r14
pushq %r13
pushq %r12
pushq %rbx
subq $0x400, %rsp            # imm = 0x400
leaq 0x1feb(%rip), %rsi      # 0x6d5a
callq 0x1100
testq %rax, %rax
je 0x4e0a
movq %rax, %r14
callq 0x4e20
movq %rax, %rbx
movq %rsp, %r15
movl $0x1, %esi
movl $0x400, %edx            # imm = 0x400
movq %r15, %rdi
movq %r14, %rcx
callq 0x1060
movq %rax, %r12
testl %r12d, %r12d
sete %cl
movb (%rsp), %al
testb %al, %al
sete %dl
orb %cl, %dl
jne 0x4dda
movl $0x1, %r13d
movsbl %al, %esi
movq %rbx, %rdi
callq 0x4eee
movb (%rsp,%r13), %al
testb %al, %al
je 0x4dda
leaq 0x1(%r13), %rcx
cmpl %r13d, %r12d
movq %rcx, %r13
jne 0x4dbb
testl %r12d, %r12d
jne 0x4d8b
movb $0xa, %al
xorl %r15d, %r15d
leaq 0x1ee7(%rip), %r14      # 0x6cd2
leaq 0x1(%r15), %r12
movsbl %al, %esi
movq %rbx, %rdi
callq 0x4eee
movb 0x1(%r15,%r14), %al
movq %r12, %r15
cmpq $0x2, %r12
jne 0x4deb
jmp 0x4e0c
xorl %ebx, %ebx
movq %rbx, %rax
addq $0x400, %rsp            # imm = 0x400
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
retq
// File: /workspace/github_c_makefile_star2_O1/johnvtan[P]ccccc/string.c
// Function: string_new
string_t *string_new(void) {
    string_t *new = malloc(sizeof(string_t));
    if (string_init(new) < 0)
        return NULL;
    return new;
}

// Assembly:
pushq %rbx
movl $0x10, %edi
callq 0x10e0
testq %rax, %rax
je 0x4e55
movq %rax, %rbx
movl $0x8, %edi
callq 0x10e0
movq %rax, (%rbx)
testq %rax, %rax
je 0x4e55
movabsq $0x800000000, %rax      # imm = 0x800000000
movq %rax, 0x8(%rbx)
jmp 0x4e57
xorl %ebx, %ebx
movq %rbx, %rax
popq %rbx
retq
// File: /workspace/github_c_makefile_star2_O1/johnvtan[P]ccccc/string.c
// Function: string_init
int string_init(string_t *string) {
    if (!string)
        return -1;
    string->buf = malloc(sizeof(char) * STRING_DEFAULT_CAPACITY);
    if (!string->buf)
        return -1;
    string->len = 0;
    string->capacity = STRING_DEFAULT_CAPACITY;
    return 0;
}

// Assembly:
pushq %r14
pushq %rbx
pushq %rax
movl $0xffffffff, %ebx       # imm = 0xFFFFFFFF
testq %rdi, %rdi
je 0x4ee4
movq %rdi, %r14
movl $0x8, %edi
callq 0x10e0
movq %rax, (%r14)
testq %rax, %rax
je 0x4ee4
movabsq $0x800000000, %rax      # imm = 0x800000000
movq %rax, 0x8(%r14)
xorl %ebx, %ebx
movl %ebx, %eax
addq $0x8, %rsp
popq %rbx
popq %r14
retq
// File: /workspace/github_c_makefile_star2_O1/johnvtan[P]ccccc/string.c
// Function: string_free
void string_free(string_t *string) {
    if (!string)
        return;
    if (string->buf)
        free(string->buf);
    free(string);
}

// Assembly:
testq %rdi, %rdi
je 0x4f6a
pushq %rbx
movq %rdi, %rbx
movq (%rdi), %rdi
testq %rdi, %rdi
je 0x4f61
callq 0x1030
movq %rbx, %rdi
popq %rbx
jmp 0x1030
retq
// File: /workspace/github_c_makefile_star2_O1/johnvtan[P]ccccc/string.c
// Function: string_eq
int string_eq(string_t *s1, string_t *s2) {
    // I guess they might be equal if the user passes in two NULL pointers, but I'm going to say
    // that's invalid
    if (!s1 || !s2)
        return -1;
    
    if (s1->len != s2->len)
        return -1;

    // I'm pretty sure this handles empty string, but I'm not sure
    for (int i = 0; i < s1->len; i++) {
        if (s1->buf[i] != s2->buf[i]) {
            return -1;
        }
    }
    return 0;
}

// Assembly:
testq %rdi, %rdi
sete %cl
testq %rsi, %rsi
sete %dl
movl $0xffffffff, %eax       # imm = 0xFFFFFFFF
orb %cl, %dl
jne 0x4fc6
movl 0x8(%rdi), %ecx
cmpl 0x8(%rsi), %ecx
jne 0x4fc6
testl %ecx, %ecx
setg %r8b
jle 0x4fc0
movq (%rdi), %rax
movq (%rsi), %rdx
movb (%rax), %sil
cmpb (%rdx), %sil
jne 0x4fc0
movl $0x1, %edi
movq %rdi, %rsi
cmpq %rdi, %rcx
je 0x4fb9
movb (%rax,%rsi), %r8b
leaq 0x1(%rsi), %rdi
cmpb (%rdx,%rsi), %r8b
je 0x4fa3
cmpq %rcx, %rsi
setb %r8b
movzbl %r8b, %eax
negl %eax
retq
nop
// File: /workspace/github_c_makefile_star2_O1/johnvtan[P]ccccc/tokenize.c
// Function: print_token
void print_token(token_t *token) {
    if (!token)
        return;

    if (token->type == TOK_INT_LIT) {
        printf("integer literal: %d\n", token->int_literal);
        return;
    }

    if (token->type == TOK_CHAR_LIT) {
        printf("char literal: %c\n", token->char_literal);
        return;
    }

    if (token->type == TOK_IDENT) {
        printf("identifier: %s\n", string_get(token->ident));
        return;
    }

    // try special chars and keywords now
    keyword_pair_t keyword;
    int i = 0;
    do {
        keyword = keywords[i++];
        if (token->type == keyword.type) {
            printf("keyword: %s\n", keyword.keyword);
            return;
        }
    } while (keyword.keyword);

    special_char_pair_t special;
    i = 0;
    do {
        special = special_chars[i++];
        if (token->type == special.type) {
            printf("special char: %c\n", special.c);
            return;
        }
    } while (special.c);

    printf("UNKNOWN TOKEN!!!!!!\n");
}

// Assembly:
testq %rdi, %rdi
je 0x526c
movl (%rdi), %eax
cmpl $0x1, %eax
je 0x527a
cmpl $0x2, %eax
je 0x526d
cmpl $0x3, %eax
jne 0x528b
pushq %rax
movq 0x8(%rdi), %rdi
callq 0x4f2b
leaq 0x1a9b(%rip), %rdi      # 0x6cfc
movq %rax, %rsi
xorl %eax, %eax
popq %rcx
jmp 0x1080
retq
movsbl 0x8(%rdi), %esi
leaq 0x1a72(%rip), %rdi      # 0x6cea
jmp 0x5284
movl 0x8(%rdi), %esi
leaq 0x1a51(%rip), %rdi      # 0x6cd5
xorl %eax, %eax
jmp 0x1080
movl $0x8, %ecx
leaq 0x49f9(%rip), %rdx      # 0x9c90
cmpl (%rcx,%rdx), %eax
je 0x52cd
addq $0x10, %rcx
cmpq $0x168, %rcx            # imm = 0x168
jne 0x5297
xorl %ecx, %ecx
leaq 0x1b1e(%rip), %rdx      # 0x6dd0
cmpl 0x4(%rdx,%rcx,8), %eax
je 0x52e0
incq %rcx
cmpq $0x16, %rcx
jne 0x52b2
leaq 0x1aee(%rip), %rdi      # 0x6db6
jmp 0x1050
movq -0x8(%rcx,%rdx), %rsi
leaq 0x1a33(%rip), %rdi      # 0x6d0c
xorl %eax, %eax
jmp 0x1080
movsbl (%rdx,%rcx,8), %esi
leaq 0x1a2e(%rip), %rdi      # 0x6d19
jmp 0x5284
// File: /workspace/github_c_makefile_star2_O1/ohkimur[P]the-c-programming-language-2nd-edition-solutions/chapter_6/exercise_6_05/undef.c
// Function: main
int main(void)
{
  install("TEST", "test");

  // Install other collision values for the same hash as for "TEST" -> 51.
  install("TSHe", "test1");
  install("UPXD", "test2");
  install("9iww", "test3");
  install("mY1a", "test4");
  install("uuoT", "test5");

  struct list_node *node_p = lookup("TEST");
  if (node_p == NULL)
  {
    puts("Error: hash value not found.");
  }
  else
  {
    printf("%s: %s\n", node_p->name, node_p->definition);
    if (undef("TEST") && lookup("TEST") == NULL)
    {
      printf("'%s' was undefined successfully.\n", "TEST");
    }
    else
    {
      printf("Error: failed to undefine '%s'.\n", "TEST");
    }
  }

  return EXIT_SUCCESS;
}

// Assembly:
pushq %rbx
leaq 0xe60(%rip), %rbx       # 0x2004
leaq 0xe5e(%rip), %rsi       # 0x2009
movq %rbx, %rdi
callq 0x1285
leaq 0xe54(%rip), %rdi       # 0x200e
leaq 0xe52(%rip), %rsi       # 0x2013
callq 0x1285
leaq 0xe4c(%rip), %rdi       # 0x2019
leaq 0xe4a(%rip), %rsi       # 0x201e
callq 0x1285
leaq 0xe44(%rip), %rdi       # 0x2024
leaq 0xe42(%rip), %rsi       # 0x2029
callq 0x1285
leaq 0xe3c(%rip), %rdi       # 0x202f
leaq 0xe3a(%rip), %rsi       # 0x2034
callq 0x1285
leaq 0xe34(%rip), %rdi       # 0x203a
leaq 0xe32(%rip), %rsi       # 0x203f
callq 0x1285
movq %rbx, %rdi
callq 0x1355
testq %rax, %rax
je 0x125e
movq (%rax), %rsi
movq 0x8(%rax), %rdx
leaq 0xe35(%rip), %rdi       # 0x2062
xorl %eax, %eax
callq 0x1070
leaq 0xdc9(%rip), %rdi       # 0x2004
callq 0x13e3
testl %eax, %eax
je 0x1255
leaq 0xdb9(%rip), %rdi       # 0x2004
callq 0x1355
testq %rax, %rax
je 0x126c
leaq 0xe30(%rip), %rdi       # 0x208c
jmp 0x1273
leaq 0xde0(%rip), %rdi       # 0x2045
callq 0x1050
jmp 0x1281
leaq 0xdf7(%rip), %rdi       # 0x206a
leaq 0xd8a(%rip), %rsi       # 0x2004
xorl %eax, %eax
callq 0x1070
xorl %eax, %eax
popq %rbx
retq
// File: /workspace/github_c_makefile_star2_O1/ohkimur[P]the-c-programming-language-2nd-edition-solutions/chapter_6/exercise_6_05/undef.c
// Function: install
struct list_node *install(char *name, char *definition)
{
  struct list_node *node_p;
  if ((node_p = lookup(name)) == NULL)
  {
    node_p = (struct list_node *)malloc(sizeof(*node_p));
    if (node_p == NULL || (node_p->name = str_dup(name)) == NULL)
    {
      return NULL;
    }
    size_t hash_value = hash(name);
    node_p->next = hash_table[hash_value];
    hash_table[hash_value] = node_p;
  }
  else
  {
    free(node_p->definition);
  }

  if ((node_p->definition = str_dup(definition)) == NULL)
  {
    return NULL;
  }

  return node_p;
}

// Assembly:
pushq %r15
pushq %r14
pushq %rbx
movq %rsi, %r14
movq %rdi, %r15
callq 0x1355
testq %rax, %rax
je 0x12bb
movq %rax, %rbx
movq 0x8(%rax), %rdi
callq 0x1030
movq %r14, %rdi
callq 0x14e3
movq %rax, 0x8(%rbx)
testq %rax, %rax
cmoveq %rax, %rbx
jmp 0x1332
movl $0x18, %edi
callq 0x1090
testq %rax, %rax
je 0x1330
movq %rax, %rbx
movq %r15, %rdi
callq 0x14e3
movq %rax, (%rbx)
testq %rax, %rax
je 0x1330
movb (%r15), %al
testb %al, %al
je 0x133b
incq %r15
xorl %ecx, %ecx
movsbq %al, %rax
movq %rcx, %rdx
shlq $0x5, %rdx
subq %rcx, %rdx
movq %rdx, %rcx
addq %rax, %rcx
movb (%r15), %al
incq %r15
testb %al, %al
jne 0x12e9
movabsq $0x446f86562d9faee5, %rdx # imm = 0x446F86562D9FAEE5
movq %rcx, %rax
mulq %rdx
movq %rcx, %rax
subq %rdx, %rax
shrq %rax
addq %rdx, %rax
shrq $0x6, %rax
imulq $0x65, %rax, %rax
subq %rax, %rcx
jmp 0x133d
xorl %ebx, %ebx
movq %rbx, %rax
popq %rbx
popq %r14
popq %r15
retq
xorl %ecx, %ecx
leaq 0x2d2c(%rip), %rax      # 0x4070
movq (%rax,%rcx,8), %rdx
movq %rdx, 0x10(%rbx)
movq %rbx, (%rax,%rcx,8)
jmp 0x12a6
// File: /workspace/github_c_makefile_star2_O1/ohkimur[P]the-c-programming-language-2nd-edition-solutions/chapter_6/exercise_6_05/undef.c
// Function: lookup
struct list_node *lookup(char *str)
{
  struct list_node *node_p;
  for (node_p = hash_table[hash(str)]; node_p != NULL; node_p = node_p->next)
  {
    if (strcmp(str, node_p->name) == 0)
    {
      return node_p;
    }
  }
  return NULL;
}

// Assembly:
pushq %r14
pushq %rbx
pushq %rax
movq %rdi, %rbx
movb (%rdi), %dl
testb %dl, %dl
je 0x13ae
leaq 0x1(%rbx), %rax
xorl %ecx, %ecx
movsbq %dl, %rdx
movq %rcx, %rsi
shlq $0x5, %rsi
subq %rcx, %rsi
movq %rsi, %rcx
addq %rdx, %rcx
movb (%rax), %dl
incq %rax
testb %dl, %dl
jne 0x1368
movabsq $0x446f86562d9faee5, %rdx # imm = 0x446F86562D9FAEE5
movq %rcx, %rax
mulq %rdx
movq %rcx, %rax
subq %rdx, %rax
shrq %rax
addq %rdx, %rax
shrq $0x6, %rax
imulq $0x65, %rax, %rax
subq %rax, %rcx
jmp 0x13b0
xorl %ecx, %ecx
leaq 0x2cb9(%rip), %rax      # 0x4070
movq (%rax,%rcx,8), %r14
testq %r14, %r14
je 0x13d5
movq (%r14), %rsi
movq %rbx, %rdi
callq 0x1080
testl %eax, %eax
je 0x13d8
movq 0x10(%r14), %r14
jmp 0x13bb
xorl %r14d, %r14d
movq %r14, %rax
addq $0x8, %rsp
popq %rbx
popq %r14
retq
// File: /workspace/github_c_makefile_star2_O1/ohkimur[P]the-c-programming-language-2nd-edition-solutions/chapter_6/exercise_6_05/undef.c
// Function: undef
enum boolean undef(char *name)
{
  struct list_node *node_p;
  struct list_node *prev_node_p;
  size_t hash_value = hash(name);
  for (node_p = hash_table[hash_value], prev_node_p = NULL;
       node_p != NULL;
       prev_node_p = node_p, node_p = node_p->next)
  {
    if (strcmp(name, node_p->name) == 0)
    {
      free(node_p->name);
      free(node_p->definition);

      if (prev_node_p == NULL)
      {
        hash_table[hash_value] = node_p->next;
      }
      else
      {
        prev_node_p->next = node_p->next;
      }

      free(node_p);
      return TRUE;
    }
  }

  return FALSE;
}

// Assembly:
pushq %rbp
pushq %r15
pushq %r14
pushq %r13
pushq %r12
pushq %rbx
pushq %rax
movq %rdi, %r14
movb (%rdi), %dl
xorl %ecx, %ecx
testb %dl, %dl
je 0x1445
leaq 0x1(%r14), %rax
xorl %ebx, %ebx
movsbq %dl, %rdx
movq %rbx, %rsi
shlq $0x5, %rsi
subq %rbx, %rsi
movq %rsi, %rbx
addq %rdx, %rbx
movb (%rax), %dl
incq %rax
testb %dl, %dl
jne 0x13ff
movabsq $0x446f86562d9faee5, %rdx # imm = 0x446F86562D9FAEE5
movq %rbx, %rax
mulq %rdx
movq %rbx, %rax
subq %rdx, %rax
shrq %rax
addq %rdx, %rax
shrq $0x6, %rax
imulq $0x65, %rax, %rax
subq %rax, %rbx
jmp 0x1447
xorl %ebx, %ebx
leaq 0x2c22(%rip), %rax      # 0x4070
movq (%rax,%rbx,8), %r13
testq %r13, %r13
je 0x14d2
movq (%r13), %r12
movq %r14, %rdi
movq %r12, %rsi
callq 0x1080
testl %eax, %eax
je 0x1491
movq %r13, %r15
movq 0x10(%r15), %r13
testq %r13, %r13
je 0x14d0
movq (%r13), %r12
movq %r14, %rdi
movq %r12, %rsi
callq 0x1080
movq %r15, %rbp
movq %r13, %r15
testl %eax, %eax
jne 0x146d
jmp 0x1493
xorl %ebp, %ebp
leaq 0x2bd6(%rip), %rax      # 0x4070
leaq (%rax,%rbx,8), %rbx
movq %r12, %rdi
callq 0x1030
movq 0x8(%r13), %rdi
callq 0x1030
leaq 0x10(%rbp), %rax
testq %rbp, %rbp
movq 0x10(%r13), %rcx
cmoveq %rbx, %rax
movq %rcx, (%rax)
movq %r13, %rdi
callq 0x1030
movl $0x1, %ecx
jmp 0x14d2
xorl %ecx, %ecx
movl %ecx, %eax
addq $0x8, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
retq
// File: /workspace/github_c_makefile_star2_O1/ohkimur[P]the-c-programming-language-2nd-edition-solutions/chapter_6/exercise_6_05/undef.c
// Function: hash
size_t hash(char *str)
{
  size_t hash_value = 0;
  while (*str != '\0')
  {
    hash_value = *str + 31 * hash_value;
    ++str;
  }
  return hash_value % HASH_SIZE;
}

// Assembly:
movb (%rdi), %al
testb %al, %al
je 0x1559
incq %rdi
xorl %ecx, %ecx
movsbq %al, %rax
movq %rcx, %rdx
shlq $0x5, %rdx
subq %rcx, %rdx
movq %rdx, %rcx
addq %rax, %rcx
movb (%rdi), %al
incq %rdi
testb %al, %al
jne 0x1513
movabsq $0x446f86562d9faee5, %rdx # imm = 0x446F86562D9FAEE5
movq %rcx, %rax
mulq %rdx
movq %rcx, %rax
subq %rdx, %rax
shrq %rax
addq %rdx, %rax
shrq $0x6, %rax
imulq $0x65, %rax, %rax
subq %rax, %rcx
jmp 0x155b
xorl %ecx, %ecx
movq %rcx, %rax
retq
// File: /workspace/github_c_makefile_star2_O1/eiselekd[P]MinimalLisp/./f1.c
// Function: foptoa
char *foptoa(struct fctx *cctx, struct v *v) {
    struct v *c, *e, *n;
    for (c = cctx->env; c; c = cdr(c)) {
        n = caar(c); e = cdar(c);
        if ((v == (fwordp(v) ? e : car(e))))
            return str(n);
    }
    return "<undef>";
}

// Assembly:
movq 0x148(%rdi), %rcx
leaq 0xcab0(%rip), %rax      # 0xe3cd
testq %rcx, %rcx
je 0x1985
pushq %rbp
movq %rsp, %rbp
movl $0x10f, %edx            # imm = 0x10F
movq 0x8(%rcx), %rdi
testq %rdi, %rdi
je 0x193a
movq 0x8(%rdi), %rdi
jmp 0x193c
xorl %edi, %edi
movq 0x8(%rcx), %r8
testq %r8, %r8
je 0x194b
movq 0x10(%r8), %r8
jmp 0x194e
xorl %r8d, %r8d
testq %rsi, %rsi
je 0x1962
movl (%rsi), %r9d
andl %edx, %r9d
cmpl $0x100, %r9d            # imm = 0x100
je 0x1970
testq %r8, %r8
je 0x196d
movq 0x8(%r8), %r8
jmp 0x1970
xorl %r8d, %r8d
cmpq %rsi, %r8
je 0x1980
movq 0x10(%rcx), %rcx
testq %rcx, %rcx
jne 0x192b
jmp 0x1984
movq 0x8(%rdi), %rax
popq %rbp
retq
// File: /workspace/github_c_makefile_star2_O1/eiselekd[P]MinimalLisp/./l1.c
// Function: eval
v *
eval(ctx *cctx, v *e, v *env) 
{
    v *r = 0, *f;
    switch(e->tag) {
    case INT: case STR:
        r = e;
        break;
    case SYM:
        if (QUOTED(e)) {
            r = e;
        } else {
            if ((r = assq(e, env))) {
                r = cdr(r);
            } else {
                fprintf(stderr, "Undefined symbol \"%s\"\n", str(e));
            }
        }
        break;
    case FUNC:
        break;
    case CONS:
        if (QUOTED(e)) {
            r = evargs(cctx, e, env);
        } else {
            f = eval(cctx, car(e), env);
            r = apply(cctx, f, cdr(e), env);
        }
        break;
    }
    return r;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
pushq %r15
pushq %r14
pushq %rbx
pushq %rax
movq %rdx, %r14
movq %rsi, %rbx
movl (%rsi), %eax
movl %eax, %ecx
andl $0xf, %ecx
leal -0x1(%rcx), %edx
cmpl $0x2, %edx
jb 0x216f
testl %ecx, %ecx
je 0x210e
cmpl $0x3, %ecx
jne 0x216d
testb %al, %al
js 0x216f
testq %r14, %r14
je 0x2158
movq 0x8(%r14), %rax
testq %rax, %rax
je 0x2101
movq 0x8(%rax), %rcx
jmp 0x2103
xorl %ecx, %ecx
cmpq %rbx, %rcx
je 0x215a
movq 0x10(%r14), %r14
jmp 0x20ed
movq %rdi, %r15
testb %al, %al
js 0x2140
movq 0x8(%rbx), %rsi
movq %r15, %rdi
movq %r14, %rdx
callq 0x20b5
movq 0x10(%rbx), %rdx
movq %r15, %rdi
movq %rax, %rsi
movq %r14, %rcx
addq $0x8, %rsp
popq %rbx
popq %r14
popq %r15
popq %rbp
jmp 0x2516
movq %r15, %rdi
movq %rbx, %rsi
movq %r14, %rdx
addq $0x8, %rsp
popq %rbx
popq %r14
popq %r15
popq %rbp
jmp 0x23fe
xorl %eax, %eax
testq %rax, %rax
je 0x2165
movq 0x10(%rax), %rbx
jmp 0x216f
movq %rbx, %rdi
callq 0x11a0
xorl %ebx, %ebx
movq %rbx, %rax
addq $0x8, %rsp
popq %rbx
popq %r14
popq %r15
popq %rbp
retq
// File: /workspace/github_c_makefile_star2_O1/eiselekd[P]MinimalLisp/./l1.c
// Function: evbind
v *
evbind(v *n, v *a, v *ev)
{
    if (ConsP(n)) {
        for (; n; n = cdr(n), a = cdr(a)) {
            ev = mkCons(mkCons(car(n), car(a)),ev);
        }
    } else {
        ev = mkCons(mkCons(n,a),ev);
    }
    return ev;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
pushq %r15
pushq %r14
pushq %r13
pushq %r12
pushq %rbx
pushq %rax
movq %rdx, %r15
movq %rsi, %r14
movq %rdi, %rbx
testq %rdi, %rdi
je 0x2477
testb $0xf, (%rbx)
je 0x24a6
movl $0x18, %edi
callq 0x10e0
movq %rax, %r12
andb $-0x10, (%rax)
movq %rbx, 0x8(%rax)
movq %r14, 0x10(%rax)
movl $0x18, %edi
callq 0x10e0
andb $-0x10, (%rax)
movq %r12, 0x8(%rax)
movq %r15, 0x10(%rax)
jmp 0x2507
testq %r14, %r14
movq %r15, -0x30(%rbp)
je 0x24b5
movq 0x8(%r14), %r13
jmp 0x24b8
xorl %r13d, %r13d
movq 0x8(%rbx), %r15
movl $0x18, %edi
callq 0x10e0
movq %rax, %r12
andb $-0x10, (%rax)
movq %r15, 0x8(%rax)
movq %r13, 0x10(%rax)
movl $0x18, %edi
callq 0x10e0
andb $-0x10, (%rax)
movq %r12, 0x8(%rax)
movq -0x30(%rbp), %rcx
movq %rcx, 0x10(%rax)
testq %r14, %r14
je 0x24f8
movq 0x10(%r14), %r14
jmp 0x24fb
xorl %r14d, %r14d
movq 0x10(%rbx), %rbx
movq %rax, %r15
testq %rbx, %rbx
jne 0x24a6
addq $0x8, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
retq
// File: /workspace/github_c_makefile_star2_O1/eiselekd[P]MinimalLisp/./l1.c
// Function: apply
v *
apply(ctx *cctx, v *fn, v *args, v *env) 
{
    v *r = 0, *benv;
    if (!fn)
        return 0;
    switch(fn->tag) {
    case OP:
        if (OP_ARGEVALP(fn))
            args = evargs(cctx,args,env);
        r = op(fn)(cctx, args, env);
        break;
    case FUNC:
        benv = env;
        if (FN_ARGEVALP(fn))
            args = evargs(cctx,args,env);
        if (FN_FUNCENVP(fn))
            benv = funcenv(fn);
        if (FN_ARGBINDP(fn))
            benv = evbind(car(func(fn)), args, benv);
        r = evlist(cctx, cdr(func(fn)),benv);
        break;
    default:
        fprintf(stderr, "Cannot apply to "); print(cctx, stderr, fn); fprintf(stderr, "\n"); 
        break;
    }
    return r;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
pushq %r15
pushq %r14
pushq %rbx
pushq %rax
testq %rsi, %rsi
je 0x25e9
movq %rcx, %rbx
movq %rsi, %r15
movq %rdi, %r14
movl (%rsi), %eax
movl %eax, %ecx
andl $0xf, %ecx
cmpl $0x4, %ecx
je 0x2575
cmpl $0x5, %ecx
jne 0x25de
testb $0x10, %al
je 0x255c
movq %r14, %rdi
movq %rdx, %rsi
movq %rbx, %rdx
callq 0x23fe
movq %rax, %rdx
movq 0x8(%r15), %rax
movq %r14, %rdi
movq %rdx, %rsi
movq %rbx, %rdx
addq $0x8, %rsp
popq %rbx
popq %r14
popq %r15
popq %rbp
jmpq *%rax
testb $0x10, %al
je 0x258a
movq %r14, %rdi
movq %rdx, %rsi
movq %rbx, %rdx
callq 0x23fe
movq %rax, %rdx
movl (%r15), %eax
testb $0x20, %al
je 0x2595
movq 0x10(%r15), %rbx
testb $0x40, %al
je 0x25b8
movq 0x8(%r15), %rax
testq %rax, %rax
je 0x25a8
movq 0x8(%rax), %rdi
jmp 0x25aa
xorl %edi, %edi
movq %rdx, %rsi
movq %rbx, %rdx
callq 0x2456
movq %rax, %rbx
movq 0x8(%r15), %rax
testq %rax, %rax
je 0x25c7
movq 0x10(%rax), %rsi
jmp 0x25c9
xorl %esi, %esi
movq %r14, %rdi
movq %rbx, %rdx
addq $0x8, %rsp
popq %rbx
popq %r14
popq %r15
popq %rbp
jmp 0x217d
movq %r14, %rdi
movq %r15, %rsi
callq 0x11c4
xorl %eax, %eax
addq $0x8, %rsp
popq %rbx
popq %r14
popq %r15
popq %rbp
retq
// File: /workspace/github_c_makefile_star2_O1/eiselekd[P]MinimalLisp/./l1.c
// Function: unique
v *
unique(ctx *cctx, char *s, int l) 
{
    v *v; char *cmp;
    for (v = cctx->sym; v; v = cdr(v)) {
        cmp = str(car(v));
        if (strlen(cmp) == l && strncasecmp(cmp, s, l) == 0) {
            return car(v);
        }
    }
    if (!v) {
        cctx->sym = mkCons((v = mkSym(s,l)), cctx->sym);
    }
    return v;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
pushq %r15
pushq %r14
pushq %r13
pushq %r12
pushq %rbx
pushq %rax
movl %edx, -0x2c(%rbp)
movq %rsi, %r15
movq %rdi, %rbx
movq (%rdi), %r14
testq %r14, %r14
je 0x2649
movslq -0x2c(%rbp), %r12
movq 0x8(%r14), %rax
movq 0x8(%rax), %r13
movq %r13, %rdi
callq 0x1050
cmpq %r12, %rax
jne 0x2640
movq %r13, %rdi
movq %r15, %rsi
movq %r12, %rdx
callq 0x10f0
testl %eax, %eax
je 0x2679
movq 0x10(%r14), %r14
testq %r14, %r14
jne 0x2619
movq %r15, %rdi
movl -0x2c(%rbp), %esi
movl $0x3, %edx
callq 0x1479
movq %rax, %r14
movq (%rbx), %r15
movl $0x18, %edi
callq 0x10e0
andb $-0x10, (%rax)
movq %r14, 0x8(%rax)
movq %r15, 0x10(%rax)
movq %rax, (%rbx)
jmp 0x267d
movq 0x8(%r14), %r14
movq %r14, %rax
addq $0x8, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
retq
// File: /workspace/github_c_makefile_star2_O1/eiselekd[P]MinimalLisp/./l1.c
// Function: nth
v *
_nth(v *v, int i, int f)
{
    struct v *r;
    if (f && !v) {
        v = mkCons(0,0);
    }
    while(v && (i-- > 0)) {
        if (!(v = cdr(r = v))) {
            if (f)
                rplacd(r, v = mkCons(0,0));
        }
    }
    return v;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
pushq %r15
pushq %r14
pushq %rbx
pushq %rax
movl %edx, %ebx
movl %esi, %r14d
movq %rdi, %r15
testl %edx, %edx
sete %al
testq %rdi, %rdi
setne %cl
orb %al, %cl
jne 0x26c7
movl $0x18, %edi
callq 0x10e0
movq %rax, %r15
andb $-0x10, (%rax)
xorps %xmm0, %xmm0
movups %xmm0, 0x8(%rax)
testq %r15, %r15
je 0x2706
incl %r14d
decl %r14d
testl %r14d, %r14d
jle 0x2706
movq 0x10(%r15), %rax
testl %ebx, %ebx
je 0x26fc
testq %rax, %rax
jne 0x26fc
movl $0x18, %edi
callq 0x10e0
andb $-0x10, (%rax)
xorps %xmm0, %xmm0
movups %xmm0, 0x8(%rax)
movq %rax, 0x10(%r15)
movq %rax, %r15
testq %rax, %rax
jne 0x26cf
jmp 0x2709
movq %r15, %rax
addq $0x8, %rsp
popq %rbx
popq %r14
popq %r15
popq %rbp
retq
// File: /workspace/github_c_makefile_star2_O1/eiselekd[P]MinimalLisp/./l1.c
// Function: nreverse
v *
nreverse(v *v)
{
    struct v *r = 0, *h, *l = v, *lt, *c, *p, *n, *t;
    int tq = 0;
    h = l;
    lt = c = cdr(l);
    if (c) {
        if (cdr(c)) {
            p = 0;
            do {
                n = cdr(c);
                rplacd(c,p);
                p = c;
                c = n;
            } while(cdr(c));
            rplacd(l, p);
            rplacd(lt, c);
        }
        /* swap head,c */
        tq = QUOTED(h);
        t = car(h);
        QUOTEV(h, QUOTED(c));
        rplaca(h, car(c));
        rplaca(c, t);
        QUOTEV(c, tq);
    }
    return h;
}

// Assembly:
movq %rdi, %rax
testq %rdi, %rdi
je 0x2722
movq 0x10(%rax), %rdx
jmp 0x2724
xorl %edx, %edx
testq %rdx, %rdx
je 0x27a0
pushq %rbp
movq %rsp, %rbp
cmpq $0x0, 0x10(%rdx)
je 0x2762
xorl %edi, %edi
movq %rdx, %rcx
movq %rcx, %rsi
movq 0x10(%rcx), %rcx
movq %rdi, 0x10(%rsi)
testq %rcx, %rcx
je 0x2753
cmpq $0x0, 0x10(%rcx)
movq %rsi, %rdi
jne 0x2739
testq %rax, %rax
je 0x275c
movq %rsi, 0x10(%rax)
movq %rcx, 0x10(%rdx)
jmp 0x2765
movq %rdx, %rcx
movl (%rax), %edx
movq 0x8(%rax), %rsi
movl $0x80, %edi
movl (%rcx), %r8d
andl %edi, %r8d
movl $0xffffff7f, %r9d       # imm = 0xFFFFFF7F
movl %edx, %r10d
andl %r9d, %r10d
orl %r8d, %r10d
movl %r10d, (%rax)
movq 0x8(%rcx), %r8
movq %r8, 0x8(%rax)
movq %rsi, 0x8(%rcx)
andl %edi, %edx
andl (%rcx), %r9d
orl %edx, %r9d
movl %r9d, (%rcx)
popq %rbp
retq
// File: /workspace/github_c_makefile_star2_O1/eiselekd[P]MinimalLisp/./l1.c
// Function: sreverse
v *
sreverse(v *v)
{
    struct v *r = 0, *h, *e, *l = v, *n;
    if (!v)
        return v;
    h = l;
    n = cdr(l);
    rplacd(l,0); 
    while (e = n) {
        n = cdr(n);
        rplacd(e,h); 
        h = e;
    } 
    return h;
}

// Assembly:
testq %rdi, %rdi
je 0x27d0
movq 0x10(%rdi), %rcx
movq $0x0, 0x10(%rdi)
testq %rcx, %rcx
je 0x27d3
pushq %rbp
movq %rsp, %rbp
movq %rcx, %rax
movq 0x10(%rcx), %rcx
movq %rdi, 0x10(%rax)
movq %rax, %rdi
testq %rcx, %rcx
jne 0x27bb
popq %rbp
retq
xorl %eax, %eax
retq
movq %rdi, %rax
retq