# The census of two_units_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/two_units_O0g
CMDS=afl
EXPECT=<<EOF
0x00001000    3     27 sym._init
0x00001040    1     10 sym.imp.__cxa_finalize
0x00001050    1     10 sym.imp.__stack_chk_fail
0x00001060    1     37 sym._start
0x00001090    4     34 sym.deregister_tm_clones
0x000010c0    4     51 sym.register_tm_clones
0x00001100    5     54 sym.__do_global_dtors_aux
0x00001140    1      9 sym.frame_dummy
0x00001149    1     24 sym.helper
0x00001161    1     27 sym.from_a
0x0000117c    4     94 sym.helper
0x000011da    1     41 sym.from_b
0x00001203    3    123 sym.main
0x00001280    1     13 sym._fini
EOF
EXPECT_ERR=<<EOF
EOF
RUN

NAME=0x00001000
FILE=tests/fixtures/two_units_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)0x3fe8U);
        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=0x00001040
FILE=tests/fixtures/two_units_O0g
CMDS=aa; pdd @ 0x00001040
EXPECT=<<EOF
/* r2sleigh: import stub at 0x1040; 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=0x00001050
FILE=tests/fixtures/two_units_O0g
CMDS=aa; pdd @ 0x00001050
EXPECT=<<EOF
/* r2sleigh: import stub at 0x1050; this symbol is the import `__stack_chk_fail` and has no body of its own. */
extern void __stack_chk_fail(void);

EOF
EXPECT_ERR=<<EOF
EOF
RUN

NAME=0x00001060
FILE=tests/fixtures/two_units_O0g
CMDS=aa; pdd @ 0x00001060
EXPECT=<<EOF
void _start(void)
{
    uint64_t tmp_1069_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_1069_0_2 = r2sleigh_residual_u64(1);
        r2sleigh_residual_void(2); /* r2dec gap: StoreNotSpelled at 0x1060:29 covering 1 op (render::values) */
        r2sleigh_residual_void(3); /* r2dec gap: StoreNotSpelled at 0x1060:32 covering 1 op (render::values) */
        r2sleigh_residual_void(4); /* r2dec gap: CallNotRendered at 0x1060: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 0x1060 (render::control) */
    }
}

EOF
EXPECT_ERR=<<EOF
EOF
RUN

NAME=0x00001090
FILE=tests/fixtures/two_units_O0g
CMDS=aa; pdd @ 0x00001090
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=0x000010c0
FILE=tests/fixtures/two_units_O0g
CMDS=aa; pdd @ 0x000010c0
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=0x00001100
FILE=tests/fixtures/two_units_O0g
CMDS=aa; pdd @ 0x00001100
EXPECT=<<EOF
uint64_t __do_global_dtors_aux(void)
{
    void __cxa_finalize(void*);
    extern char __dso_handle[];
    extern char __TMC_END__[];

    uint8_t tmp_1104_0_1;
    uint64_t tmp_110e_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_1104_0_1 = r2sleigh_load_u8((void*)&__TMC_END__);
        if ((uint8_t)((uint8_t)tmp_1104_0_1 != (uint8_t)0U)) {
            return r2sleigh_residual_u64(1);
        } else {
            tmp_110e_0_1 = r2sleigh_load_u64((void*)(uint64_t)0x3ff8U);
            if ((uint8_t)((uint64_t)tmp_110e_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 0x1127: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=0x00001140
FILE=tests/fixtures/two_units_O0g
CMDS=aa; pdd @ 0x00001140
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=0x00001149
FILE=tests/fixtures/two_units_O0g
CMDS=aa; pdd @ 0x00001149
EXPECT=<<EOF
int32_t helper(int32_t value)
{
    _Alignas(16) uint8_t frame[40];

    /* r2dec proof: no individual construct is marked; 15 source obligations: 6 rendered, 9 elided, 0 refused; 2 statements rendered */
    {
        r2sleigh_store_u32((void*)(uint64_t)(frame + 28U), (uint32_t)((uint32_t)value + (uint32_t)value));
        return (int32_t)r2sleigh_load_u32((void*)(uint64_t)(frame + 28U));
    }
}

EOF
EXPECT_ERR=<<EOF
EOF
RUN

NAME=0x00001161
FILE=tests/fixtures/two_units_O0g
CMDS=aa; pdd @ 0x00001161
EXPECT=<<EOF
int32_t from_a(int32_t value)
{
    int32_t helper(int32_t);

    uint64_t rax_2;

    /* r2dec proof: no individual construct is marked; 17 source obligations: 7 rendered, 10 elided, 0 refused; 2 statements rendered; 1 callee prototype supplied by the source */
    {
        rax_2 = (uint64_t)(uint32_t)helper((int32_t)value);
        return (int32_t)rax_2;
    }
}

EOF
EXPECT_ERR=<<EOF
EOF
RUN

NAME=0x0000117c
FILE=tests/fixtures/two_units_O0g
CMDS=aa; pdd @ 0x0000117c
EXPECT=<<EOF
double helper(const double* values, int64_t count)
{
    uint64_t tmp_11c9_8_1;
    uint64_t tmp_119f_8_1;
    uint64_t tmp_11b2_0_1;
    uint64_t tmp_11b6_8_1;
    uint64_t tmp_11c4_8_1;
    _Alignas(16) uint8_t frame[40];

    /* r2dec proof: no individual construct is marked; 42 source obligations: 27 rendered, 15 elided, 0 refused; 13 statements rendered */
    {
        r2sleigh_store_u64((void*)(uint64_t)(frame + 16U), (uint64_t)0U);
        r2sleigh_store_u64((void*)(uint64_t)(frame + 24U), (uint64_t)0U);
        for (; ; ) {
            tmp_11c9_8_1 = r2sleigh_load_u64((void*)(uint64_t)(frame + 24U));
            if ((uint8_t)((int64_t)tmp_11c9_8_1 < (int64_t)count)) {
                tmp_119f_8_1 = r2sleigh_load_u64((void*)(uint64_t)(frame + 24U));
                tmp_11b2_0_1 = r2sleigh_load_u64((void*)((uint64_t)values + (uint64_t)tmp_119f_8_1 * 8U));
                tmp_11b6_8_1 = r2sleigh_load_u64((void*)(uint64_t)(frame + 16U));
                r2sleigh_store_u64((void*)(uint64_t)(frame + 16U), (uint64_t)r2sleigh_float_to_bits_64(r2sleigh_float_from_bits_64(tmp_11b2_0_1) + r2sleigh_float_from_bits_64(tmp_11b6_8_1)));
                tmp_11c4_8_1 = r2sleigh_load_u64((void*)(uint64_t)(frame + 24U));
                r2sleigh_store_u64((void*)(uint64_t)(frame + 24U), (uint64_t)((uint64_t)tmp_11c4_8_1 + (uint64_t)1U));
            } else {
                break;
            }
        }
        {
            return (double)r2sleigh_float_from_bits_64(r2sleigh_load_u64((void*)(uint64_t)(frame + 16U)));
        }
    }
}

EOF
EXPECT_ERR=<<EOF
EOF
RUN

NAME=0x000011da
FILE=tests/fixtures/two_units_O0g
CMDS=aa; pdd @ 0x000011da
EXPECT=<<EOF
double from_b(const double* values, int64_t count)
{
    double helper(const double*, int64_t);

    __uint128_t xmm0_1;

    /* r2dec proof: no individual construct is marked; 19 source obligations: 9 rendered, 10 elided, 0 refused; 2 statements rendered; 1 callee prototype supplied by the source */
    {
        xmm0_1 = (__uint128_t)r2sleigh_float_to_bits_64(helper(values, count));
        return (double)r2sleigh_float_from_bits_64((uint64_t)xmm0_1);
    }
}

EOF
EXPECT_ERR=<<EOF
EOF
RUN

NAME=0x00001203
FILE=tests/fixtures/two_units_O0g
CMDS=aa; pdd @ 0x00001203
EXPECT=<<EOF
int32_t main(int32_t argc, char** argv)
{
    int32_t from_a(int32_t);
    double from_b(const double*, int64_t);

    uint32_t tmp_1237_8_1;
    uint32_t tmp_1241_8_1;
    uint64_t rax_4;
    __uint128_t xmm0_6;
    uint64_t tmp_lane_125e_2_0_1;
    uint8_t tmp_125e_12_1;
    double tmp_125e_1b_1;
    uint64_t tmp_125e_13_2;
    uint32_t tmp_lane_1262_6_0_1;
    _Alignas(16) uint8_t frame[88];

    /* r2dec proof: 1 construct is marked below; 67 source obligations: 42 rendered, 19 elided, 0 refused, 5 compiler-inserted (assuming ub-free), 1 residual; 14 statements rendered; 2 callee prototypes supplied by the source */
    {
        r2sleigh_store_u32((void*)(uint64_t)(frame + 28U), (uint32_t)argc);
        r2sleigh_store_u64((void*)(uint64_t)(frame + 16U), (uint64_t)argv);
        r2sleigh_store_u64((void*)(uint64_t)(frame + 32U), (uint64_t)0x3ff0000000000000U);
        tmp_1237_8_1 = r2sleigh_load_u32((void*)(uint64_t)(frame + 28U));
        r2sleigh_store_u64((void*)((uint64_t)(frame + 32U) + (uint64_t)8U), (uint64_t)r2sleigh_float_to_bits_64((double)(int32_t)tmp_1237_8_1));
        tmp_1241_8_1 = r2sleigh_load_u32((void*)(uint64_t)(frame + 28U));
        rax_4 = (uint64_t)(uint32_t)from_a((int32_t)tmp_1241_8_1);
        xmm0_6 = (__uint128_t)r2sleigh_float_to_bits_64(from_b((const double*)(uint64_t)(frame + 32U), 2));
        tmp_lane_125e_2_0_1 = (uint64_t)((__uint128_t)xmm0_6 >> 0U);
        tmp_125e_12_1 = (uint8_t)((uint32_t)(uint8_t)((double)(int64_t)0xffffffff7fffffffU < r2sleigh_float_from_bits_64(tmp_lane_125e_2_0_1)) & (uint32_t)(uint8_t)(r2sleigh_float_from_bits_64(tmp_lane_125e_2_0_1) < (double)(int64_t)0x80000000U));
        tmp_125e_1b_1 = (double)(int32_t)0U;
        tmp_125e_13_2 = tmp_125e_12_1 ? (uint64_t)tmp_lane_125e_2_0_1 : (uint64_t)r2sleigh_float_to_bits_64(tmp_125e_1b_1);
        tmp_lane_1262_6_0_1 = (uint32_t)((uint32_t)((uint64_t)rax_4 >> 0U) + (uint32_t)((uint32_t)(r2sleigh_float_from_bits_64(tmp_125e_13_2) > -2147483649.0 && r2sleigh_float_from_bits_64(tmp_125e_13_2) < 2147483648.0 ? (int32_t)r2sleigh_float_from_bits_64(tmp_125e_13_2) : r2sleigh_residual_i32(1)) | (uint32_t)((uint32_t)(uint8_t)((uint32_t)tmp_125e_12_1 ^ (uint32_t)(uint8_t)1U) * (uint32_t)0x80000000U)));
        {
            return (int32_t)tmp_lane_1262_6_0_1;
        }
    }
}

EOF
EXPECT_ERR=<<EOF
EOF
RUN

NAME=0x00001280
FILE=tests/fixtures/two_units_O0g
CMDS=aa; pdd @ 0x00001280
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
