// File: /workspace/github_cpp_makefile_star2_O3/baziotis[P]minijava-cpp/ast.cpp
// Function: expr_print(Expression*)
void expr_print(Expression *e) {
    LOG_SCOPE;
    if (!e) return;
    switch (e->kind) {
    case EXPR::PLUS:
    case EXPR::MINUS:
    case EXPR::TIMES:
    case EXPR::CMP:
    case EXPR::AND:
    case EXPR::ARR_LOOK:
    {
        BinaryExpression *be = (BinaryExpression*) e;
        debug_print("(");
        printf("%s\n", expr_name(be->kind));
        expr_print(be->e1);
        expr_print(be->e2);
        debug_line(")");
    } break;
    case EXPR::THIS:
    {
        debug_line("(ThisExpression)");
    } break;
    case EXPR::INT_LIT:
    case EXPR::BOOL_LIT:
    {
        debug_print("(");
        printf("%s %d)\n", expr_name(e->kind), e->lit_val);
    } break;
    case EXPR::MSG_SEND:
    {
        BinaryExpression *be = (BinaryExpression*) e;
        debug_print("(MessageSend\n");
        expr_print(be->e1);
        // For some reason, debug_line does not work here
        debug_print("- Id: %s\n", be->msd->id);
        debug_print("- Expression list:\n");
        for (Expression* e2 : be->msd->expr_list) {
            expr_print(e2);
        }
        debug_print(")\n");
    } break;
    case EXPR::ID:
    {
        debug_print("(");
        printf("%s %s)\n", expr_name(e->kind), e->id);
    } break;
    case EXPR::UNDEFINED:
    {
        debug_print("(");
        printf("Undefined ");
        red_on();
        printf("(Error)");
        red_off();
        printf(")\n");
    } break;
    case EXPR::ARR_LEN:
    case EXPR::ARR_ALLOC:
    case EXPR::NOT:
    {
        debug_print("(%s\n", expr_name(e->kind));
        expr_print(e->e1);
        debug_line(")");
    } break;
    default: printf("Expression print error: %s\n", expr_name(e->kind)); assert(0);
    }
}

// Assembly:
pushq %r15
pushq %r14
pushq %rbx
subq $0x10, %rsp
movq %rdi, %rbx
leaq 0xf(%rsp), %rdi
callq 0x34c8
testq %rbx, %rbx
je 0x2aac
movl 0x4(%rbx), %edi
cmpq $0xe, %rdi
ja 0x2ac0
leaq 0xeade(%rip), %rax      # 0x1104c
movslq (%rax,%rdi,4), %rcx
addq %rax, %rcx
jmpq *%rcx
leaq 0x10fe4(%rip), %rdi     # 0x13562
xorl %eax, %eax
callq 0x3539
movslq 0x4(%rbx), %rax
leaq 0xeba8(%rip), %rcx      # 0x11138
movq %rcx, 0x18071(%rip)     # 0x1a608
leaq 0x18062(%rip), %rcx     # 0x1a600
leaq 0xeba1(%rip), %rdx      # 0x11146
movq %rdx, 0x18064(%rip)     # 0x1a610
leaq 0xeba1(%rip), %rdx      # 0x11154
movq %rdx, 0x1805e(%rip)     # 0x1a618
leaq 0xeba4(%rip), %rdx      # 0x11165
movq %rdx, 0x18058(%rip)     # 0x1a620
leaq 0xeba8(%rip), %rdx      # 0x11177
movq %rdx, 0x18052(%rip)     # 0x1a628
leaq 0xebac(%rip), %rdx      # 0x11189
movq %rdx, 0x1804c(%rip)     # 0x1a630
leaq 0xebaa(%rip), %rdx      # 0x11195
movq %rdx, 0x18046(%rip)     # 0x1a638
leaq 0xeba8(%rip), %rdx      # 0x111a1
movq %rdx, 0x18040(%rip)     # 0x1a640
leaq 0xeba6(%rip), %rdx      # 0x111ad
movq %rdx, 0x1803a(%rip)     # 0x1a648
leaq 0xeba6(%rip), %rdx      # 0x111bb
movq %rdx, 0x18034(%rip)     # 0x1a650
leaq 0xeba3(%rip), %rdx      # 0x111c6
movq %rdx, 0x1802e(%rip)     # 0x1a658
leaq 0xeba4(%rip), %rdx      # 0x111d5
movq %rdx, 0x18028(%rip)     # 0x1a660
leaq 0xeba2(%rip), %rdx      # 0x111e1
movq %rdx, 0x18022(%rip)     # 0x1a668
leaq 0xeba3(%rip), %rdx      # 0x111f0
movq %rdx, 0x1801c(%rip)     # 0x1a670
leaq 0xeb9a(%rip), %rdx      # 0x111f5
movq %rdx, 0x18016(%rip)     # 0x1a678
leaq 0xeba1(%rip), %rdx      # 0x1120a
movq %rdx, 0x17f90(%rip)     # 0x1a600
movq (%rcx,%rax,8), %rdi
callq 0x2190
movq 0x10(%rbx), %rdi
callq 0x253b
movq 0x18(%rbx), %rdi
callq 0x253b
leaq 0x11199(%rip), %rdi     # 0x1382b
xorl %eax, %eax
callq 0x35e6
jmp 0x2aac
leaq 0xea93(%rip), %rax      # 0x11138
movq %rax, 0x17f5c(%rip)     # 0x1a608
leaq 0x17f4d(%rip), %rax     # 0x1a600
leaq 0xea8c(%rip), %rcx      # 0x11146
movq %rcx, 0x17f4f(%rip)     # 0x1a610
leaq 0xea8c(%rip), %rcx      # 0x11154
movq %rcx, 0x17f49(%rip)     # 0x1a618
leaq 0xea8f(%rip), %rcx      # 0x11165
movq %rcx, 0x17f43(%rip)     # 0x1a620
leaq 0xea93(%rip), %rcx      # 0x11177
movq %rcx, 0x17f3d(%rip)     # 0x1a628
leaq 0xea97(%rip), %rcx      # 0x11189
movq %rcx, 0x17f37(%rip)     # 0x1a630
leaq 0xea95(%rip), %rcx      # 0x11195
movq %rcx, 0x17f31(%rip)     # 0x1a638
leaq 0xea93(%rip), %rcx      # 0x111a1
movq %rcx, 0x17f2b(%rip)     # 0x1a640
leaq 0xea91(%rip), %rcx      # 0x111ad
movq %rcx, 0x17f25(%rip)     # 0x1a648
leaq 0xea91(%rip), %rcx      # 0x111bb
movq %rcx, 0x17f1f(%rip)     # 0x1a650
leaq 0xea8e(%rip), %rcx      # 0x111c6
movq %rcx, 0x17f19(%rip)     # 0x1a658
leaq 0xea8f(%rip), %rcx      # 0x111d5
movq %rcx, 0x17f13(%rip)     # 0x1a660
leaq 0xea8d(%rip), %rcx      # 0x111e1
movq %rcx, 0x17f0d(%rip)     # 0x1a668
leaq 0xea8e(%rip), %rcx      # 0x111f0
movq %rcx, 0x17f07(%rip)     # 0x1a670
leaq 0xea85(%rip), %rcx      # 0x111f5
movq %rcx, 0x17f01(%rip)     # 0x1a678
leaq 0xea8c(%rip), %rcx      # 0x1120a
movq %rcx, 0x17e7b(%rip)     # 0x1a600
movq (%rax,%rdi,8), %rsi
leaq 0xeae4(%rip), %rdi      # 0x11274
xorl %eax, %eax
callq 0x3539
movq 0x10(%rbx), %rdi
callq 0x253b
leaq 0x11084(%rip), %rdi     # 0x1382b
jmp 0x293d
leaq 0x10daf(%rip), %rdi     # 0x13562
xorl %eax, %eax
callq 0x3539
movslq 0x4(%rbx), %rax
leaq 0xe973(%rip), %rcx      # 0x11138
movq %rcx, 0x17e3c(%rip)     # 0x1a608
leaq 0x17e2d(%rip), %rcx     # 0x1a600
leaq 0xe96c(%rip), %rdx      # 0x11146
movq %rdx, 0x17e2f(%rip)     # 0x1a610
leaq 0xe96c(%rip), %rdx      # 0x11154
movq %rdx, 0x17e29(%rip)     # 0x1a618
leaq 0xe96f(%rip), %rdx      # 0x11165
movq %rdx, 0x17e23(%rip)     # 0x1a620
leaq 0xe973(%rip), %rdx      # 0x11177
movq %rdx, 0x17e1d(%rip)     # 0x1a628
leaq 0xe977(%rip), %rdx      # 0x11189
movq %rdx, 0x17e17(%rip)     # 0x1a630
leaq 0xe975(%rip), %rdx      # 0x11195
movq %rdx, 0x17e11(%rip)     # 0x1a638
leaq 0xe973(%rip), %rdx      # 0x111a1
movq %rdx, 0x17e0b(%rip)     # 0x1a640
leaq 0xe971(%rip), %rdx      # 0x111ad
movq %rdx, 0x17e05(%rip)     # 0x1a648
leaq 0xe971(%rip), %rdx      # 0x111bb
movq %rdx, 0x17dff(%rip)     # 0x1a650
leaq 0xe96e(%rip), %rdx      # 0x111c6
movq %rdx, 0x17df9(%rip)     # 0x1a658
leaq 0xe96f(%rip), %rdx      # 0x111d5
movq %rdx, 0x17df3(%rip)     # 0x1a660
leaq 0xe96d(%rip), %rdx      # 0x111e1
movq %rdx, 0x17ded(%rip)     # 0x1a668
leaq 0xe96e(%rip), %rdx      # 0x111f0
movq %rdx, 0x17de7(%rip)     # 0x1a670
leaq 0xe965(%rip), %rdx      # 0x111f5
movq %rdx, 0x17de1(%rip)     # 0x1a678
leaq 0xe96c(%rip), %rdx      # 0x1120a
movq %rdx, 0x17d5b(%rip)     # 0x1a600
movq (%rcx,%rax,8), %rsi
movl 0x10(%rbx), %edx
leaq 0xe97a(%rip), %rdi      # 0x1122d
xorl %eax, %eax
callq 0x2030
jmp 0x2aac
leaq 0xe96f(%rip), %rdi      # 0x11235
xorl %eax, %eax
callq 0x3539
movq 0x10(%rbx), %rdi
callq 0x253b
movq 0x18(%rbx), %rax
movq (%rax), %rsi
leaq 0xe95f(%rip), %rdi      # 0x11243
xorl %eax, %eax
callq 0x3539
leaq 0xe95b(%rip), %rdi      # 0x1124d
xorl %eax, %eax
callq 0x3539
movq 0x18(%rbx), %rax
movq 0x10(%rax), %rbx
testq %rbx, %rbx
je 0x2923
movq 0x18(%rax), %r14
shlq $0x3, %rbx
xorl %r15d, %r15d
movq (%r14,%r15), %rdi
callq 0x253b
addq $0x8, %r15
cmpq %r15, %rbx
jne 0x2911
leaq 0x1179a(%rip), %rdi     # 0x140c4
xorl %eax, %eax
callq 0x3539
jmp 0x2aac
leaq 0xe8df(%rip), %rdi      # 0x1121c
xorl %eax, %eax
callq 0x35e6
jmp 0x2aac
leaq 0x10c12(%rip), %rdi     # 0x13562
xorl %eax, %eax
callq 0x3539
movslq 0x4(%rbx), %rax
leaq 0xe7d6(%rip), %rcx      # 0x11138
movq %rcx, 0x17c9f(%rip)     # 0x1a608
leaq 0x17c90(%rip), %rcx     # 0x1a600
leaq 0xe7cf(%rip), %rdx      # 0x11146
movq %rdx, 0x17c92(%rip)     # 0x1a610
leaq 0xe7cf(%rip), %rdx      # 0x11154
movq %rdx, 0x17c8c(%rip)     # 0x1a618
leaq 0xe7d2(%rip), %rdx      # 0x11165
movq %rdx, 0x17c86(%rip)     # 0x1a620
leaq 0xe7d6(%rip), %rdx      # 0x11177
movq %rdx, 0x17c80(%rip)     # 0x1a628
leaq 0xe7da(%rip), %rdx      # 0x11189
movq %rdx, 0x17c7a(%rip)     # 0x1a630
leaq 0xe7d8(%rip), %rdx      # 0x11195
movq %rdx, 0x17c74(%rip)     # 0x1a638
leaq 0xe7d6(%rip), %rdx      # 0x111a1
movq %rdx, 0x17c6e(%rip)     # 0x1a640
leaq 0xe7d4(%rip), %rdx      # 0x111ad
movq %rdx, 0x17c68(%rip)     # 0x1a648
leaq 0xe7d4(%rip), %rdx      # 0x111bb
movq %rdx, 0x17c62(%rip)     # 0x1a650
leaq 0xe7d1(%rip), %rdx      # 0x111c6
movq %rdx, 0x17c5c(%rip)     # 0x1a658
leaq 0xe7d2(%rip), %rdx      # 0x111d5
movq %rdx, 0x17c56(%rip)     # 0x1a660
leaq 0xe7d0(%rip), %rdx      # 0x111e1
movq %rdx, 0x17c50(%rip)     # 0x1a668
leaq 0xe7d1(%rip), %rdx      # 0x111f0
movq %rdx, 0x17c4a(%rip)     # 0x1a670
leaq 0xe7c8(%rip), %rdx      # 0x111f5
movq %rdx, 0x17c44(%rip)     # 0x1a678
leaq 0xe7cf(%rip), %rdx      # 0x1120a
movq %rdx, 0x17bbe(%rip)     # 0x1a600
movq (%rcx,%rax,8), %rsi
movq 0x10(%rbx), %rdx
leaq 0xe810(%rip), %rdi      # 0x11261
xorl %eax, %eax
callq 0x2030
jmp 0x2aac
leaq 0x10b01(%rip), %rdi     # 0x13562
xorl %eax, %eax
callq 0x3539
leaq 0xe7fa(%rip), %rdi      # 0x11269
xorl %eax, %eax
callq 0x2030
leaq 0xea82(%rip), %rdi      # 0x114ff
xorl %eax, %eax
callq 0x2030
leaq 0xe906(%rip), %rdi      # 0x11391
xorl %eax, %eax
callq 0x2030
leaq 0xea6c(%rip), %rdi      # 0x11505
xorl %eax, %eax
callq 0x2030
leaq 0x10d84(%rip), %rdi     # 0x1382b
callq 0x2190
leaq 0xf(%rsp), %rdi
callq 0x34dc
addq $0x10, %rsp
popq %rbx
popq %r14
popq %r15
retq
callq 0x244c
leaq 0xe7ad(%rip), %rdi      # 0x11279
movq %rax, %rsi
xorl %eax, %eax
callq 0x2030
leaq 0x10b45(%rip), %rdi     # 0x13622
leaq 0xe7b1(%rip), %rsi      # 0x11295
leaq 0xe7b2(%rip), %rcx      # 0x1129d
movl $0x64, %edx
callq 0x20b0
jmp 0x2afb
jmp 0x2afb
jmp 0x2afb
movq %rax, %rbx
leaq 0xf(%rsp), %rdi
callq 0x34dc
movq %rbx, %rdi
callq 0x21c0