# The census of frame_pointer_locals_clang_O0g: what `aa; pdd` renders for each function `afl` lists.
# Regenerate with `scripts/census.py golden` when `afl` moves, then bless.

NAME=afl
FILE=tests/fixtures/frame_pointer_locals_clang_O0g
CMDS=afl
EXPECT=<<EOF
0x00001000    3     27 sym._init
0x00001030    1      6 sym.imp.__cxa_finalize
0x00001040    1     37 sym._start
0x00001070    4     34 sym.deregister_tm_clones
0x000010a0    4     51 sym.register_tm_clones
0x000010e0    5     54 sym.__do_global_dtors_aux
0x00001120    1      9 sym.frame_dummy
0x00001130    4     70 sym.counter
0x00001180    1     26 sym.main
0x0000119c    1     13 sym._fini
EOF
EXPECT_ERR=<<EOF
EOF
RUN

NAME=0x00001000
FILE=tests/fixtures/frame_pointer_locals_clang_O0g
CMDS=aa; pdd @ 0x00001000
EXPECT=<<EOF
uint64_t _init(void)
{
    uint64_t rax_1;
    uint64_t rax_3;

    /* r2dec proof: 3 constructs are marked below; 22 source obligations: 8 rendered, 10 elided, 0 refused, 4 residual; 6 statements rendered; 1 never assigned, read as residuals (RAX_2) */
    {
        rax_1 = r2sleigh_load_u64((void*)(uint64_t)0x3fd0U);
        if ((uint8_t)((uint64_t)rax_1 == (uint64_t)0U)) {
            rax_3 = rax_1;
            return (uint64_t)rax_3;
        } else {
            r2sleigh_residual_void(1); /* r2dec gap: CallNotRendered at 0x1014:4 covering 1 op (render::values): call to an indirect target: no arity is stated, only the registers written before it */
            r2sleigh_residual_void(2); /* r2dec gap: ValueNotComputed at 0x1014:11 covering 1 op (render::values) */
            rax_3 = r2sleigh_residual_u64(3);
            return (uint64_t)rax_3;
        }
    }
}

EOF
EXPECT_ERR=<<EOF
EOF
RUN

NAME=0x00001030
FILE=tests/fixtures/frame_pointer_locals_clang_O0g
CMDS=aa; pdd @ 0x00001030
EXPECT=<<EOF
/* r2sleigh: import stub at 0x1030; this symbol is the import `__cxa_finalize` and has no body of its own. */
extern void __cxa_finalize(void*);

EOF
EXPECT_ERR=<<EOF
EOF
RUN

NAME=0x00001040
FILE=tests/fixtures/frame_pointer_locals_clang_O0g
CMDS=aa; pdd @ 0x00001040
EXPECT=<<EOF
void _start(void)
{
    uint64_t tmp_1049_0_2;

    /* r2dec proof: 5 constructs are marked below; 28 source obligations: 0 rendered, 6 elided, 0 refused, 22 residual; 1 statements rendered; 1 held from entry, read as residuals (stack_p0) */
    {
        tmp_1049_0_2 = r2sleigh_residual_u64(1);
        r2sleigh_residual_void(2); /* r2dec gap: StoreNotSpelled at 0x1040:29 covering 1 op (render::values) */
        r2sleigh_residual_void(3); /* r2dec gap: StoreNotSpelled at 0x1040:32 covering 1 op (render::values) */
        r2sleigh_residual_void(4); /* r2dec gap: CallNotRendered at 0x1040:68 covering 1 op (render::values): call to __libc_start_main: the import's declaration has an argument this convention does not place */
        r2sleigh_residual_void(5); /* r2dec gap: TransferNotFollowed at 0x1040 (render::control) */
    }
}

EOF
EXPECT_ERR=<<EOF
EOF
RUN

NAME=0x00001070
FILE=tests/fixtures/frame_pointer_locals_clang_O0g
CMDS=aa; pdd @ 0x00001070
EXPECT=<<EOF
uint64_t deregister_tm_clones(void)
{
    uint64_t rax_3;

    /* r2dec proof: no individual construct is marked; 8 source obligations: 5 rendered, 3 elided, 0 refused; 2 statements rendered */
    {
        rax_3 = 0x4010;
        {
            return (uint64_t)rax_3;
        }
    }
}

EOF
EXPECT_ERR=<<EOF
EOF
RUN

NAME=0x000010a0
FILE=tests/fixtures/frame_pointer_locals_clang_O0g
CMDS=aa; pdd @ 0x000010a0
EXPECT=<<EOF
uint64_t register_tm_clones(void)
{
    uint64_t rax_4;

    /* r2dec proof: no individual construct is marked; 11 source obligations: 8 rendered, 3 elided, 0 refused; 2 statements rendered */
    {
        rax_4 = 0;
        {
            return (uint64_t)rax_4;
        }
    }
}

EOF
EXPECT_ERR=<<EOF
EOF
RUN

NAME=0x000010e0
FILE=tests/fixtures/frame_pointer_locals_clang_O0g
CMDS=aa; pdd @ 0x000010e0
EXPECT=<<EOF
uint64_t __do_global_dtors_aux(void)
{
    void __cxa_finalize(void*);
    extern char __dso_handle[];
    extern char __TMC_END__[];

    uint8_t tmp_10e4_0_1;
    uint64_t tmp_10ee_0_1;
    uint64_t rdi_1;

    /* r2dec proof: 3 constructs are marked below; 40 source obligations: 16 rendered, 17 elided, 0 refused, 7 residual; 9 statements rendered; 2 data object types refused; 1 callee prototype supplied by the source */
    {
        tmp_10e4_0_1 = r2sleigh_load_u8((void*)&__TMC_END__);
        if ((uint8_t)((uint8_t)tmp_10e4_0_1 != (uint8_t)0U)) {
            return r2sleigh_residual_u64(1);
        } else {
            tmp_10ee_0_1 = r2sleigh_load_u64((void*)(uint64_t)0x3fe0U);
            if ((uint8_t)((uint64_t)tmp_10ee_0_1 == (uint64_t)0U)) {
            } else {
                rdi_1 = r2sleigh_load_u64((void*)&__dso_handle);
                __cxa_finalize((void*)rdi_1);
            }
            {
                r2sleigh_residual_void(2); /* r2dec gap: CallNotRendered at 0x1107:17 covering 1 op (render::values): call to deregister_tm_clones: argument slot 0 may hand on what this function was passed */
                r2sleigh_store_u8((void*)&__TMC_END__, (uint8_t)1U);
                return r2sleigh_residual_u64(3);
            }
        }
    }
}

EOF
EXPECT_ERR=<<EOF
EOF
RUN

NAME=0x00001120
FILE=tests/fixtures/frame_pointer_locals_clang_O0g
CMDS=aa; pdd @ 0x00001120
EXPECT=<<EOF
uint64_t frame_dummy(void)
{
    uint64_t register_tm_clones(void);

    /* r2dec proof: no individual construct is marked; 3 source obligations: 2 rendered, 1 elided, 0 refused; 1 statements rendered */
    {
        return register_tm_clones();
    }
}

EOF
EXPECT_ERR=<<EOF
EOF
RUN

NAME=0x00001130
FILE=tests/fixtures/frame_pointer_locals_clang_O0g
CMDS=aa; pdd @ 0x00001130
EXPECT=<<EOF
int32_t counter(void)
{
    uint32_t tmp_114a_8_1;
    uint32_t tmp_114d_8_1;
    uint32_t tmp_1156_8_1;
    uint64_t tmp_115a_8_1;
    uint32_t tmp_1162_8_1;
    uint64_t tmp_1170_8_1;
    _Alignas(16) uint8_t frame[40];

    /* r2dec proof: no individual construct is marked; 44 source obligations: 27 rendered, 17 elided, 0 refused; 15 statements rendered */
    {
        r2sleigh_store_u32((void*)(uint64_t)(frame + 28U), (uint32_t)3U);
        r2sleigh_store_u64((void*)(uint64_t)(frame + 16U), (uint64_t)10U);
        r2sleigh_store_u32((void*)(uint64_t)(frame + 12U), (uint32_t)0U);
        for (; ; ) {
            tmp_114a_8_1 = r2sleigh_load_u32((void*)(uint64_t)(frame + 12U));
            tmp_114d_8_1 = r2sleigh_load_u32((void*)(uint64_t)(frame + 28U));
            if ((uint8_t)((int32_t)tmp_114d_8_1 <= (int32_t)tmp_114a_8_1)) {
                break;
            } else {
                tmp_1156_8_1 = r2sleigh_load_u32((void*)(uint64_t)(frame + 12U));
                tmp_115a_8_1 = r2sleigh_load_u64((void*)(uint64_t)(frame + 16U));
                r2sleigh_store_u64((void*)(uint64_t)(frame + 16U), (uint64_t)((uint64_t)(int32_t)tmp_1156_8_1 + (uint64_t)tmp_115a_8_1));
                tmp_1162_8_1 = r2sleigh_load_u32((void*)(uint64_t)(frame + 12U));
                r2sleigh_store_u32((void*)(uint64_t)(frame + 12U), (uint32_t)((uint32_t)tmp_1162_8_1 + (uint32_t)1U));
            }
        }
        {
            tmp_1170_8_1 = r2sleigh_load_u64((void*)(uint64_t)(frame + 16U));
            return (int32_t)tmp_1170_8_1;
        }
    }
}

EOF
EXPECT_ERR=<<EOF
EOF
RUN

NAME=0x00001180
FILE=tests/fixtures/frame_pointer_locals_clang_O0g
CMDS=aa; pdd @ 0x00001180
EXPECT=<<EOF
int32_t main(void)
{
    int32_t counter(void);

    uint64_t rax_1;

    /* r2dec proof: no individual construct is marked; 16 source obligations: 5 rendered, 11 elided, 0 refused; 2 statements rendered; 1 callee prototype supplied by the source */
    {
        rax_1 = (uint64_t)(uint32_t)counter();
        return (int32_t)rax_1;
    }
}

EOF
EXPECT_ERR=<<EOF
EOF
RUN

NAME=0x0000119c
FILE=tests/fixtures/frame_pointer_locals_clang_O0g
CMDS=aa; pdd @ 0x0000119c
EXPECT=<<EOF
void _fini(void)
{
    /* r2dec proof: no individual construct is marked; 7 source obligations: 1 rendered, 6 elided, 0 refused; 1 statements rendered */
    {
        return;
    }
}

EOF
EXPECT_ERR=<<EOF
EOF
RUN
