NAME=x86_32
FILE=r2-testbins/elf/crackme0x05
EXPECT=<<EOF
x86:LE:32:default:gcc

undefined4 main(void)
{
    int32_t var_78h;
    
    sym.imp.printf("IOLI Crackme Level 0x05\n");
    sym.imp.printf("Password: ");
    sym.imp.scanf(0x80486b2, &var_78h);
    sym.check((int32_t)&var_78h);
    return 0;
}
EOF
CMDS=<<EOF
pdgss
s main
af
pdg
EOF
RUN

NAME=x86_64
FILE=r2-testbins/elf/hello_world
EXPECT=<<EOF
x86:LE:64:default:gcc

// WARNING: [r2ghidra] Detected overlap for variable var_1ch

void main(void)
{
    int32_t iVar1;
    int32_t iVar2;
    int64_t iVar3;
    int64_t var_20h;
    int64_t var_18h;
    int64_t var_10h;
    int64_t var_8h;
    
    iVar1 = sym.imp.strlen(0x8d4);
    iVar2 = sym.imp.strlen(0x8da);
    iVar3 = sym.imp.malloc((int64_t)(iVar2 + iVar1 + 1));
    if (iVar3 != 0) {
        sym.imp.strcpy(iVar3, 0x8d4, 0x8d4);
        sym.imp.strcat(iVar3, 0x8da, 0x8da);
        sym.imp.puts(iVar3);
        sym.imp.free(iVar3);
    }
    return;
}
EOF
CMDS=<<EOF
pdgss
s main
af
pdg
EOF
RUN

NAME=x86_16
FILE=r2-testbins/mz/unzip.exe
EXPECT=<<EOF
x86:LE:16:Real Mode:

// WARNING: Variable defined which should be unmapped: var_8h
// WARNING: Variable defined which should be unmapped: var_4h
// WARNING: Unknown calling convention yet parameter storage is locked
// WARNING: [r2ghidra] Matching calling convention fastcall of function fcn.00001c98 failed, args may be inaccurate.

undefined4 fcn.00001c98(int16_t arg3, int16_t arg_8h, int16_t arg_6h, int16_t arg_eh)
{
    int16_t *piVar1;
    undefined2 unaff_CS;
    undefined2 unaff_DS;
    undefined2 in_stack_00000006;
    int16_t in_stack_00000008;
    undefined4 uStack0008;
    int16_t in_stack_0000000c;
    int16_t var_8h;
    int16_t var_6h;
    int16_t var_4h;
    int16_t var_2h;
    char cStack4;
    
    var_6h = 0x13da;
    do {
        func_0x0000ec24(unaff_CS, var_6h, unaff_DS, 0x401e);
        func_0x0000ec24(0xdee, arg_8h, in_stack_00000006, 0x401e);
        func_0x0000e59a(0xdee, 0x401e);
        var_2h = 0;
        do {
            cStack4 = func_0x0000eb82(0xdee);
            if (cStack4 == '\r') {
                cStack4 = '\n';
            }
            if (var_2h < in_stack_0000000c) {
                *(char *)(in_stack_00000008 + var_2h) = cStack4;
                var_2h = var_2h + 1;
            }
        } while (cStack4 != '\n');
        piVar1 = (int16_t *)0x4022;
        *piVar1 = *piVar1 + -1;
        if (*piVar1 < 0) {
            func_0x0000e4ae(0xdee, 10, 0x401e);
        } else {
            *(undefined *)*(undefined4 *)0x401e = 10;
            piVar1 = (int16_t *)0x401e;
            *piVar1 = *piVar1 + 1;
        }
        unaff_CS = 0xdee;
        func_0x0000e59a(0xdee, 0x401e);
        var_6h = 0x13db;
    } while (*(char *)(in_stack_00000008 + var_2h + -1) != '\n');
    *(undefined *)(in_stack_00000008 + var_2h + -1) = 0;
    return uStack0008;
}
EOF
CMDS=<<EOF
pdgss
s 0x1c98
af
pdg
EOF
RUN

NAME=x86_64
FILE=r2-testbins/elf/hello_world
EXPECT=<<EOF
x86:LE:64:default:gcc

// WARNING: [r2ghidra] Detected overlap for variable var_1ch

void main(void)
{
    int32_t iVar1;
    int32_t iVar2;
    int64_t iVar3;
    int64_t var_20h;
    int64_t var_18h;
    int64_t var_10h;
    int64_t var_8h;
    
    iVar1 = sym.imp.strlen(0x8d4);
    iVar2 = sym.imp.strlen(0x8da);
    iVar3 = sym.imp.malloc((int64_t)(iVar2 + iVar1 + 1));
    if (iVar3 != 0) {
        sym.imp.strcpy(iVar3, 0x8d4, 0x8d4);
        sym.imp.strcat(iVar3, 0x8da, 0x8da);
        sym.imp.puts(iVar3);
        sym.imp.free(iVar3);
    }
    return;
}
EOF
CMDS=<<EOF
pdgss
s main
af
pdg
EOF
RUN


NAME=6502
FILE=r2-testbins/prg/t01.prg
ARGS=-F prg
EXPECT=<<EOF
6502:LE:16:default:

// WARNING: [r2ghidra] Function fcn.0000080e has no calling convention set, args may be inaccurate.
// WARNING: [r2ghidra] Var arg_103h is stack pointer based, which is not supported for decompilation.

void fcn.0000080e(void)
{
    undefined uVar1;
    uint8_t uVar2;
    
    uVar2 = 0xff;
    do {
        *(undefined *)(uVar2 + 0x3ff) = 0x41;
        uVar1 = *(undefined *)0x824;
        uVar2 = uVar2 - 1;
    } while (uVar2 != 0);
    uVar2 = 0xff;
    do {
        *(undefined *)(uVar2 + 0xd7ff) = uVar1;
        uVar2 = uVar2 - 1;
    } while (uVar2 != 0);
    return;
}
EOF
CMDS=<<EOF
pdgss
s 0x080e
af
pdg
EOF
RUN


NAME=rawptr
FILE=bins/dectest32
EXPECT=<<EOF

undefined4 sym.get_global_array_entry(void)
{
    return *(undefined4 *)0x804c034;
}
--

undefined4 sym.get_global_array_entry(void)
{
    return uRam0804c034;
}
EOF
CMDS=<<EOF
s sym.get_global_array_entry
af
e r2ghidra.rawptr=1
pdg
?e --
e r2ghidra.rawptr=0
pdg
EOF
RUN

NAME=global flag
FILE=bins/dectest32
EXPECT=<<EOF

undefined4 sym.get_global_var(void)
{
    return _obj.global_var;
}
--

// WARNING: Globals starting with '_' overlap smaller symbols at the same address

undefined4 sym.get_global_var(void)
{
    return _obj.global_var;
}
EOF
CMDS=<<EOF
s sym.get_global_var
af
e r2ghidra.rawptr=1
pdg
?e --
e r2ghidra.rawptr=0
pdg
EOF
RUN

NAME=aeropause32 (many features combined)
FILE=bins/dectest32
EXPECT=<<EOF

void sym.Aeropause(Bright *bright, int32_t argc, char **argv)
{
    Morning *pMVar1;
    int32_t iVar2;
    
    pMVar1 = (Morning *)sym.imp.malloc(8);
    bright->morning = pMVar1;
    bright->morning->saved_argc = argc;
    bright->morning->saved_argv = argv;
    if (bright->morning->saved_argc < 2) {
        bright->ambassador = AMBASSADOR_PURE;
    } else {
        (bright->window).sunlight = bright->morning->saved_argv[1];
        iVar2 = sym.imp.strcmp((bright->window).sunlight, 0x804a05c);
        if (iVar2 == 0) {
            bright->ambassador = AMBASSADOR_REASON;
        } else {
            iVar2 = sym.imp.strcmp((bright->window).sunlight, "dark");
            if (iVar2 == 0) {
                bright->ambassador = AMBASSADOR_REVOLUTION;
            } else {
                iVar2 = sym.imp.strcmp((bright->window).sunlight, "third");
                if (iVar2 == 0) {
                    bright->ambassador = AMBASSADOR_ECHOES;
                } else {
                    bright->ambassador = AMBASSADOR_MILLION;
                }
            }
        }
    }
    // switch table (5 cases) at 0x804a070
    switch(bright->ambassador) {
    case AMBASSADOR_PURE:
        sym.imp.printf("pure");
        break;
    case AMBASSADOR_REASON:
        sym.imp.printf("reason");
        break;
    case AMBASSADOR_REVOLUTION:
        sym.imp.printf("revolution");
        break;
    case AMBASSADOR_ECHOES:
        sym.imp.printf("echoes");
        break;
    case AMBASSADOR_WALL:
        sym.imp.printf("wall");
        break;
    default:
        if (bright->ambassador == AMBASSADOR_MILLION) {
            sym.imp.printf("million");
        }
        break;
    case 0xbad1abe1:
        break;
    }
    sym.PrintAmbassador(bright->ambassador);
    return;
}
EOF
CMDS=<<EOF
aaa
to bins/types.h
s sym.Aeropause
afvb 8 bright Bright *
afvb 12 argc int32_t
afvb 16 argv const char **
pdg
EOF
RUN

NAME=aeropause64 (many features combined)
FILE=bins/dectest64
EXPECT=<<EOF

// WARNING: [r2ghidra] Detected overlap for variable var_ch
// WARNING: [r2ghidra] Failed to match type size_t for variable size to Decompiler type: Unknown type identifier size_t

void sym.Aeropause(Bright *bright, int32_t argc, char **argv)
{
    int32_t iVar1;
    Morning *pMVar2;
    int64_t var_18h;
    void **var_8h;
    
    pMVar2 = (Morning *)sym.imp.malloc(0x10);
    bright->morning = pMVar2;
    bright->morning->saved_argc = argc;
    *(char ***)((int64_t)&bright->morning->saved_argv + 4) = argv;
    if (bright->morning->saved_argc < 2) {
        *(undefined4 *)&bright->ambassador = 0;
    } else {
        (bright->window).sunlight = *(char **)(*(int64_t *)((int64_t)&bright->morning->saved_argv + 4) + 8);
        iVar1 = sym.imp.strcmp((bright->window).sunlight, "the  ");
        if (iVar1 == 0) {
            *(undefined4 *)&bright->ambassador = 1;
        } else {
            iVar1 = sym.imp.strcmp((bright->window).sunlight, "dark");
            if (iVar1 == 0) {
                *(undefined4 *)&bright->ambassador = 2;
            } else {
                iVar1 = sym.imp.strcmp((bright->window).sunlight, "third");
                if (iVar1 == 0) {
                    *(undefined4 *)&bright->ambassador = 3;
                } else {
                    *(undefined4 *)&bright->ambassador = 1000000;
                }
            }
        }
    }
    // switch table (5 cases) at 0x402088
    switch(*(int32_t *)&bright->ambassador) {
    case 0:
        sym.imp.printf("pure");
        break;
    case 1:
        sym.imp.printf("reason");
        break;
    case 2:
        sym.imp.printf("revolution");
        break;
    case 3:
        sym.imp.printf("echoes");
        break;
    case 4:
        sym.imp.printf("wall");
        break;
    default:
        if (*(int32_t *)&bright->ambassador == 1000000) {
            sym.imp.printf("million");
        }
        break;
    case -0x452e541f:
        break;
    }
    sym.PrintAmbassador(*(uint32_t *)&bright->ambassador);
    return;
}
EOF
CMDS=<<EOF
aaa

# TODO: remove these when r2 can do it automatically
afvr rdi format const char * @ sym.imp.printf
afvr rdi size size_t @ sym.imp.malloc
afvr rdi s1 const char * @ sym.imp.strcmp
afvr rsi s2 const char * @ sym.imp.strcmp

to bins/types.h
# TODO: remove when parsed struct from r2 is correct
k anal/types/struct.Bright.ambassador=enum Ambassador,16,0
k anal/types/struct.Bright.window=struct Window,8,0

s sym.Aeropause
afvr rdi bright Bright *
afvr rsi argc int32_t
afvr rdx argv const char **
pdg
EOF
RUN

NAME=typedef
FILE=bins/dectest32
EXPECT=<<EOF

void sym.Aeropause(BrightPtr bright, Bright *argc, char **argv)
{
    Morning *pMVar1;
    int32_t iVar2;
    
    pMVar1 = (Morning *)sym.imp.malloc(8);
    bright->morning = pMVar1;
    bright->morning->saved_argc = (uint32_t)argc;
    bright->morning->saved_argv = argv;
    if (bright->morning->saved_argc < 2) {
        bright->ambassador = AMBASSADOR_PURE;
    } else {
        (bright->window).sunlight = bright->morning->saved_argv[1];
        iVar2 = sym.imp.strcmp((bright->window).sunlight, 0x804a05c);
        if (iVar2 == 0) {
            bright->ambassador = AMBASSADOR_REASON;
        } else {
            iVar2 = sym.imp.strcmp((bright->window).sunlight, "dark");
            if (iVar2 == 0) {
                bright->ambassador = AMBASSADOR_REVOLUTION;
            } else {
                iVar2 = sym.imp.strcmp((bright->window).sunlight, "third");
                if (iVar2 == 0) {
                    bright->ambassador = AMBASSADOR_ECHOES;
                } else {
                    bright->ambassador = AMBASSADOR_MILLION;
                }
            }
        }
    }
    // switch table (5 cases) at 0x804a070
    switch(bright->ambassador) {
    case AMBASSADOR_PURE:
        sym.imp.printf("pure");
        break;
    case AMBASSADOR_REASON:
        sym.imp.printf("reason");
        break;
    case AMBASSADOR_REVOLUTION:
        sym.imp.printf("revolution");
        break;
    case AMBASSADOR_ECHOES:
        sym.imp.printf("echoes");
        break;
    case AMBASSADOR_WALL:
        sym.imp.printf("wall");
        break;
    default:
        if (bright->ambassador == AMBASSADOR_MILLION) {
            sym.imp.printf("million");
        }
        break;
    case 0xbad1abe1:
        break;
    }
    sym.PrintAmbassador(bright->ambassador);
    return;
}
--

void sym.Aeropause(BrightTypedefd *bright, int32_t argc, char **argv)
{
    Morning *pMVar1;
    int32_t iVar2;
    
    pMVar1 = (Morning *)sym.imp.malloc(8);
    bright->morning = pMVar1;
    bright->morning->saved_argc = argc;
    bright->morning->saved_argv = argv;
    if (bright->morning->saved_argc < 2) {
        bright->ambassador = AMBASSADOR_PURE;
    } else {
        (bright->window).sunlight = bright->morning->saved_argv[1];
        iVar2 = sym.imp.strcmp((bright->window).sunlight, 0x804a05c);
        if (iVar2 == 0) {
            bright->ambassador = AMBASSADOR_REASON;
        } else {
            iVar2 = sym.imp.strcmp((bright->window).sunlight, "dark");
            if (iVar2 == 0) {
                bright->ambassador = AMBASSADOR_REVOLUTION;
            } else {
                iVar2 = sym.imp.strcmp((bright->window).sunlight, "third");
                if (iVar2 == 0) {
                    bright->ambassador = AMBASSADOR_ECHOES;
                } else {
                    bright->ambassador = AMBASSADOR_MILLION;
                }
            }
        }
    }
    // switch table (5 cases) at 0x804a070
    switch(bright->ambassador) {
    case AMBASSADOR_PURE:
        sym.imp.printf("pure");
        break;
    case AMBASSADOR_REASON:
        sym.imp.printf("reason");
        break;
    case AMBASSADOR_REVOLUTION:
        sym.imp.printf("revolution");
        break;
    case AMBASSADOR_ECHOES:
        sym.imp.printf("echoes");
        break;
    case AMBASSADOR_WALL:
        sym.imp.printf("wall");
        break;
    default:
        if (bright->ambassador == AMBASSADOR_MILLION) {
            sym.imp.printf("million");
        }
        break;
    case 0xbad1abe1:
        break;
    }
    sym.PrintAmbassador(bright->ambassador);
    return;
}
--

void sym.Aeropause(BrightTypedefdPtr bright, int32_t argc, char **argv)
{
    Morning *pMVar1;
    int32_t iVar2;
    
    pMVar1 = (Morning *)sym.imp.malloc(8);
    bright->morning = pMVar1;
    bright->morning->saved_argc = argc;
    bright->morning->saved_argv = argv;
    if (bright->morning->saved_argc < 2) {
        bright->ambassador = AMBASSADOR_PURE;
    } else {
        (bright->window).sunlight = bright->morning->saved_argv[1];
        iVar2 = sym.imp.strcmp((bright->window).sunlight, 0x804a05c);
        if (iVar2 == 0) {
            bright->ambassador = AMBASSADOR_REASON;
        } else {
            iVar2 = sym.imp.strcmp((bright->window).sunlight, "dark");
            if (iVar2 == 0) {
                bright->ambassador = AMBASSADOR_REVOLUTION;
            } else {
                iVar2 = sym.imp.strcmp((bright->window).sunlight, "third");
                if (iVar2 == 0) {
                    bright->ambassador = AMBASSADOR_ECHOES;
                } else {
                    bright->ambassador = AMBASSADOR_MILLION;
                }
            }
        }
    }
    // switch table (5 cases) at 0x804a070
    switch(bright->ambassador) {
    case AMBASSADOR_PURE:
        sym.imp.printf("pure");
        break;
    case AMBASSADOR_REASON:
        sym.imp.printf("reason");
        break;
    case AMBASSADOR_REVOLUTION:
        sym.imp.printf("revolution");
        break;
    case AMBASSADOR_ECHOES:
        sym.imp.printf("echoes");
        break;
    case AMBASSADOR_WALL:
        sym.imp.printf("wall");
        break;
    default:
        if (bright->ambassador == AMBASSADOR_MILLION) {
            sym.imp.printf("million");
        }
        break;
    case 0xbad1abe1:
        break;
    }
    sym.PrintAmbassador(bright->ambassador);
    return;
}
EOF
CMDS=<<EOF
aaa
to bins/types.h
s sym.Aeropause
afvb 8 bright BrightPtr
afvb 12 argc Bright *
afvb 16 argv const char **
pdg
?e --
afvb 8 bright BrightTypedefd *
afvb 12 argc int32_t
afvb 16 argv const char **
pdg
?e --
afvb 8 bright BrightTypedefdPtr
pdg
EOF
RUN

NAME=macos args
FILE=r2-testbins/mach0/arg
EXPECT=<<EOF

// WARNING: Variable defined which should be unmapped: var_4h
// WARNING: [r2ghidra] Detected overlap for variable var_14h

void entry0(void)
{
    char *var_4h;
    
    sym._call("hello", (int64_t)"world");
    return;
}
EOF
CMDS=<<EOF
aaa
s main
pdg
EOF
RUN

NAME=Nodup function on container query
FILE=bins/hello-arm
EXPECT=<<EOF

// WARNING: Control flow encountered bad instruction data

void entry0(void)
{
    // [11] -r-x section size 200 named .text
    sym.imp.__libc_init();
    // WARNING: Bad instruction - Truncating control flow here
    halt_baddata();
}
EOF
CMDS=<<EOF
s entry0
af
pdg
EOF
RUN

NAME=code printing
FILE=r2-testbins/elf/crackme0x05
EXPECT=<<EOF

undefined4 main(void)
{
    int32_t var_78h;
    
    sym.imp.printf("IOLI Crackme Level 0x05\n");
    sym.imp.printf("Password: ");
    sym.imp.scanf(0x80486b2, &var_78h);
    sym.check((int32_t)&var_78h);
    return 0;
}
--
                  |
                  |undefined4 main(void)
                  |{
                  |    int32_t var_78h;
                  |    
    0x08048566    |    sym.imp.printf("IOLI Crackme Level 0x05\n");
    0x08048572    |    sym.imp.printf("Password: ");
    0x08048585    |    sym.imp.scanf(0x80486b2, &var_78h);
    0x0804858a    |    sym.check((int32_t)&var_78h);
    0x0804859b    |    return 0;
                  |}
--
CCu base64:Jg== @ 0x8048577
CCu base64:c3ltLmltcC5zY2FuZigweDgwNDg2YjIsICZ2YXJfNzhoKQ== @ 0x8048585
CCu base64:cmV0dXJuIDA= @ 0x804859b
CCu base64:c3ltLmNoZWNrKChpbnQzMl90KSZ2YXJfNzhoKQ== @ 0x8048590
CCu base64:c3ltLmltcC5wcmludGYoIklPTEkgQ3JhY2ttZSBMZXZlbCAweDA1XG4iKQ== @ 0x8048566
CCu base64:c3ltLmltcC5wcmludGYoIlBhc3N3b3JkOiAiKQ== @ 0x8048572
CCu base64:Jg== @ 0x804858a
--
<result><function><function name="main" size="92">
<localdb main="stack" lock="false">
<scope name="main">
<parent>
<val></val>
</parent>
<rangelist>
<range space="stack" first="0x4" last="0x1f7"/>
<range space="stack" first="0xffffff68" last="0xfffffffb"/>
</rangelist>
<symbollist>
<mapsym>
</rangelist>
</mapsym>
</symbollist>
</scope>
</localdb>
<ast>
<varnodes>
</varnodes>
<block index="0">
<rangelist>
<range space="ram" first="0x8048540" last="0x804859b"/>
</rangelist>
<op code="1">
<seqnum space="ram" offset="0x8048566" uniq="0xd4"/>
</op>
<op code="7">
<seqnum space="ram" offset="0x8048566" uniq="0x6a"/>
<void/>
</op>
<op code="1">
<seqnum space="ram" offset="0x8048572" uniq="0xd5"/>
</op>
<op code="7">
<seqnum space="ram" offset="0x8048572" uniq="0x6f"/>
<void/>
</op>
<op code="66">
<seqnum space="ram" offset="0x8048577" uniq="0xd6"/>
</op>
<op code="7">
<seqnum space="ram" offset="0x8048585" uniq="0x79"/>
<void/>
</op>
<op code="66">
<seqnum space="ram" offset="0x804858a" uniq="0xd7"/>
</op>
<op code="64">
<seqnum space="ram" offset="0x8048590" uniq="0xd8"/>
</op>
<op code="7">
<seqnum space="ram" offset="0x8048590" uniq="0x80"/>
<void/>
</op>
<op code="1">
<seqnum space="ram" offset="0x8048595" uniq="0x81"/>
</op>
<op code="10">
<seqnum space="ram" offset="0x804859b" uniq="0x87"/>
<void/>
</op>
</block>
</ast>
 <prototype model="__cdecl" extrapop="4">
  <returnsym>
 </prototype>
</function>
--
<save_state loadersymbols="false">
<typegrp intsize="4" structalign="4" enumsize="4" enumsigned="false">
</typegrp>
<db>
<property_changepoint space="register" offset="0x1000" val="0x40000000"/>
<property_changepoint space="register" offset="0x100a" val="0x40000000"/>
<property_changepoint space="register" offset="0x1014" val="0x40000000"/>
<property_changepoint space="register" offset="0x101e" val="0x40000000"/>
<property_changepoint space="register" offset="0x1028" val="0x40000000"/>
<property_changepoint space="register" offset="0x1032" val="0x40000000"/>
<property_changepoint space="register" offset="0x103c" val="0x40000000"/>
<property_changepoint space="register" offset="0x1046" val="0x40000000"/>
<property_changepoint space="register" offset="0x1050" val="0x0"/>
<scope name="radare2-internal">
<parent>
</parent>
<rangelist>
</rangelist>
<symbollist>
<mapsym>
<addr space="ram" offset="0x8048540"/>
<localdb main="stack" lock="false">
<scope name="main">
<parent>
<val></val>
</parent>
<rangelist>
<range space="stack" first="0x4" last="0x1f7"/>
<range space="stack" first="0xffffff68" last="0xfffffffb"/>
</rangelist>
<symbollist>
<mapsym>
<addr space="stack" offset="0xffffff84"/><rangelist>
</rangelist>
</mapsym>
</symbollist>
</scope>
</localdb>
 <prototype model="__cdecl" extrapop="4">
  <returnsym>
 </prototype>
</function>
<addr space="ram" offset="0x8048540"/><rangelist>
</rangelist>
</mapsym>
<mapsym>
<addr space="ram" offset="0x804868e"/><rangelist>
</rangelist>
</mapsym>
<mapsym>
<addr space="ram" offset="0x80486a7"/><rangelist>
</rangelist>
</mapsym>
<mapsym>
<addr space="ram" offset="0x80484c8"/>
<localdb main="stack" lock="false">
<scope name="sym.check">
<parent>
<val></val>
</parent>
<rangelist>
<range space="stack" first="0x4" last="0x1f7"/>
<range space="stack" first="0xfff0bdc0" last="0xffffffff"/>
</rangelist>
<symbollist>
<mapsym>
<addr space="stack" offset="0x4"/><rangelist>
</rangelist>
</mapsym>
<mapsym>
<addr space="stack" offset="0xfffffff4"/><rangelist>
</rangelist>
</mapsym>
<mapsym>
<addr space="stack" offset="0xfffffff0"/><rangelist>
</rangelist>
</mapsym>
</symbollist>
</scope>
</localdb>
 <prototype model="__cdecl" extrapop="4" modellock="true">
  <returnsym>
 </prototype>
</function>
<addr space="ram" offset="0x80484c8"/><rangelist>
</rangelist>
</mapsym>
<mapsym>
<addr space="ram" offset="0x8048394"/>
<localdb main="stack" lock="false">
<scope name="sym.imp.printf">
<parent>
<val></val>
</parent>
<rangelist>
<range space="stack" first="0x4" last="0x1f7"/>
<range space="stack" first="0xfff0bdc0" last="0xffffffff"/>
</rangelist>
</scope>
</localdb>
 <prototype model="__cdecl" extrapop="4">
  <returnsym>
 </prototype>
</function>
<addr space="ram" offset="0x8048394"/><rangelist>
</rangelist>
</mapsym>
<mapsym>
<addr space="ram" offset="0x8048374"/>
<localdb main="stack" lock="false">
<scope name="sym.imp.scanf">
<parent>
<val></val>
</parent>
<rangelist>
<range space="stack" first="0x4" last="0x1f7"/>
<range space="stack" first="0xfff0bdc0" last="0xffffffff"/>
</rangelist>
</scope>
</localdb>
 <prototype model="__cdecl" extrapop="4">
  <returnsym>
 </prototype>
</function>
<addr space="ram" offset="0x8048374"/><rangelist>
</rangelist>
</mapsym>
</symbollist>
</scope>
</db>
<context_points>
<context_pointset space="ram" offset="0x0">
  <set name="addrsize" val="0x1"/>
  <set name="bit64" val="0x0"/>
  <set name="highseg" val="0x0"/>
  <set name="instrPhase" val="0x0"/>
  <set name="mandover" val="0x0"/>
  <set name="opprefx" val="0x0"/>
  <set name="opsize" val="0x1"/>
  <set name="prefix_66" val="0x0"/>
  <set name="prefix_f2" val="0x0"/>
  <set name="prefix_f3" val="0x0"/>
  <set name="repneprefx" val="0x0"/>
  <set name="repprefx" val="0x0"/>
  <set name="rexBprefix" val="0x0"/>
  <set name="rexRprefix" val="0x0"/>
  <set name="rexWprefix" val="0x0"/>
  <set name="rexXprefix" val="0x0"/>
  <set name="rexprefix" val="0x0"/>
  <set name="segover" val="0x0"/>
  <set name="suffix3D" val="0x0"/>
  <set name="vexL" val="0x0"/>
  <set name="vexMMMMM" val="0x0"/>
  <set name="vexMode" val="0x0"/>
  <set name="vexVVVV" val="0x0"/>
  <set name="vexVVVV_r64" val="0x0"/>
</context_pointset>
<context_pointset space="register" offset="0x0">
  <set name="addrsize" val="0x0"/>
  <set name="bit64" val="0x0"/>
  <set name="highseg" val="0x0"/>
  <set name="instrPhase" val="0x0"/>
  <set name="mandover" val="0x0"/>
  <set name="opprefx" val="0x0"/>
  <set name="opsize" val="0x0"/>
  <set name="prefix_66" val="0x0"/>
  <set name="prefix_f2" val="0x0"/>
  <set name="prefix_f3" val="0x0"/>
  <set name="repneprefx" val="0x0"/>
  <set name="repprefx" val="0x0"/>
  <set name="rexBprefix" val="0x0"/>
  <set name="rexRprefix" val="0x0"/>
  <set name="rexWprefix" val="0x0"/>
  <set name="rexXprefix" val="0x0"/>
  <set name="rexprefix" val="0x0"/>
  <set name="segover" val="0x0"/>
  <set name="suffix3D" val="0x0"/>
  <set name="vexL" val="0x0"/>
  <set name="vexMMMMM" val="0x0"/>
  <set name="vexMode" val="0x0"/>
  <set name="vexVVVV" val="0x0"/>
  <set name="vexVVVV_r64" val="0x0"/>
</context_pointset>
<tracked_pointset space="ram" offset="0x0">
  <set space="register" offset="0x20a" size="1" val="0x0"/>
</tracked_pointset>
</context_points>
<commentdb>
</commentdb>
</save_state>
--

[38;2;0;55;218mundefined4[0m [38;2;197;15;31mmain[0m([1;38;2;180;0;158mvoid[0m)
{
    [38;2;0;55;218mint32_t[0m [0mvar_78h[0m;
    
    [38;2;197;15;31msym.imp.printf[0m([38;2;193;156;0m"IOLI Crackme Level 0x05\n"[0m);
    [38;2;197;15;31msym.imp.printf[0m([38;2;193;156;0m"Password: "[0m);
    [38;2;197;15;31msym.imp.scanf[0m([38;2;193;156;0m0x80486b2[0m, &[0mvar_78h[0m);
    [38;2;197;15;31msym.check[0m(([38;2;0;55;218mint32_t[0m)&[0mvar_78h[0m);
    [1;38;2;180;0;158mreturn[0m [38;2;193;156;0m0[0m;
}
--
                  |
[38;2;0;55;218m[0m                  |[38;2;0;55;218mundefined4[0m [38;2;197;15;31mmain[0m([1;38;2;180;0;158mvoid[0m)
                  |{
                  |    [38;2;0;55;218mint32_t[0m [0mvar_78h[0m;
                  |    
    [38;2;19;161;14m0x08048566[0m    |    [38;2;197;15;31msym.imp.printf[0m([38;2;193;156;0m"IOLI Crackme Level 0x05\n"[0m);
    [38;2;19;161;14m0x08048572[0m    |    [38;2;197;15;31msym.imp.printf[0m([38;2;193;156;0m"Password: "[0m);
    [38;2;19;161;14m0x08048585[0m    |    [38;2;197;15;31msym.imp.scanf[0m([38;2;193;156;0m0x80486b2[0m, &[0mvar_78h[0m);
    [38;2;19;161;14m0x0804858a[0m    |    [38;2;197;15;31msym.check[0m(([38;2;0;55;218mint32_t[0m)&[0mvar_78h[0m);
    [38;2;19;161;14m0x0804859b[0m    |    [1;38;2;180;0;158mreturn[0m [38;2;193;156;0m0[0m;
                  |}
EOF
CMDS=<<EOF
s main
af
e scr.color=0
pdg
?e --
pdgo
?e --
pdg*
?e --
pdgx~!id=,<addr
?e --
pdgd~!id=,protectedMode
?e --
e scr.color=3
pdg
?e --
pdgo
EOF
RUN

NAME=pdgo align
FILE=r2-testbins/elf/hello_world
ARGS=-B 0x1000000000000000
EXPECT=<<EOF
                          |
                          |// WARNING: [r2ghidra] Detected overlap for variable var_1ch
                          |
                          |void main(void)
                          |{
                          |    int32_t iVar1;
                          |    int32_t iVar2;
                          |    int64_t iVar3;
                          |    int64_t var_20h;
                          |    int64_t var_18h;
                          |    int64_t var_10h;
                          |    int64_t var_8h;
                          |    
    0x10000000000007cf    |    iVar1 = sym.imp.strlen("Hello");
    0x10000000000007de    |    iVar2 = sym.imp.strlen(" r2-folks");
    0x10000000000007f6    |    iVar3 = sym.imp.malloc((int64_t)(iVar2 + iVar1 + 1));
    0x1000000000000804    |    if (iVar3 != 0) {
    0x1000000000000814    |        sym.imp.strcpy(iVar3, "Hello", "Hello");
    0x1000000000000827    |        sym.imp.strcat(iVar3, " r2-folks", " r2-folks");
    0x1000000000000833    |        sym.imp.puts(iVar3);
    0x100000000000083f    |        sym.imp.free(iVar3);
                          |    }
    0x1000000000000846    |    return;
                          |}
EOF
CMDS=<<EOF
s main
af
pdgo
EOF
RUN

NAME=pdgs
FILE=-
EXPECT=<<EOF
6502:BE:16:default
6502:LE:16:default
68000:BE:32:Coldfire
68000:BE:32:MC68020
68000:BE:32:MC68030
68000:BE:32:default
6805:BE:16:default
6809:BE:16:default
80251:BE:24:default
80390:BE:24:default
8048:LE:16:default
8051:BE:16:default
8051:BE:24:mx51
8085:LE:16:default
AARCH64:BE:64:v8A
AARCH64:LE:64:v8A
ARM:BE:32:Cortex
ARM:BE:32:v4
ARM:BE:32:v4t
ARM:BE:32:v5
ARM:BE:32:v5t
ARM:BE:32:v6
ARM:BE:32:v7
ARM:BE:32:v8
ARM:BE:32:v8T
ARM:LE:32:Cortex
ARM:LE:32:v4
ARM:LE:32:v4t
ARM:LE:32:v5
ARM:LE:32:v5t
ARM:LE:32:v6
ARM:LE:32:v7
ARM:LE:32:v8
ARM:LE:32:v8T
ARM:LEBE:32:v7LEInstruction
ARM:LEBE:32:v8LEInstruction
CR16C:LE:16:default
DATA:BE:64:default
DATA:LE:64:default
Dalvik:LE:32:default
HC05:BE:16:M68HC05TB
HC05:BE:16:default
HC08:BE:16:MC68HC908QY4
HC08:BE:16:default
HCS08:BE:16:MC9S08GB60
HCS08:BE:16:default
HCS12:BE:24:default
JVM:BE:32:default
MCS96:LE:16:default
MIPS:BE:32:R6
MIPS:BE:32:default
MIPS:BE:32:micro
MIPS:BE:64:64-32R6addr
MIPS:BE:64:64-32addr
MIPS:BE:64:R6
MIPS:BE:64:default
MIPS:BE:64:micro
MIPS:BE:64:micro64-32addr
MIPS:LE:32:R6
MIPS:LE:32:default
MIPS:LE:32:micro
MIPS:LE:64:64-32R6addr
MIPS:LE:64:64-32addr
MIPS:LE:64:R6
MIPS:LE:64:default
MIPS:LE:64:micro
MIPS:LE:64:micro64-32addr
PIC-12:LE:16:PIC-12C5xx
PIC-16:LE:16:PIC-16
PIC-16:LE:16:PIC-16C5x
PIC-16:LE:16:PIC-16F
PIC-17:LE:16:PIC-17C7xx
PIC-18:LE:24:PIC-18
PIC-24E:LE:24:default
PIC-24F:LE:24:default
PIC-24H:LE:24:default
PowerPC:BE:32:4xx
PowerPC:BE:32:MPC8270
PowerPC:BE:32:QUICC
PowerPC:BE:32:default
PowerPC:BE:64:64-32addr
PowerPC:BE:64:A2-32addr
PowerPC:BE:64:A2ALT
PowerPC:BE:64:A2ALT-32addr
PowerPC:BE:64:VLE-32addr
PowerPC:BE:64:VLEALT-32addr
PowerPC:BE:64:default
PowerPC:LE:32:4xx
PowerPC:LE:32:QUICC
PowerPC:LE:32:default
PowerPC:LE:64:64-32addr
PowerPC:LE:64:A2-32addr
PowerPC:LE:64:A2ALT
PowerPC:LE:64:A2ALT-32addr
PowerPC:LE:64:default
RISCV:LE:32:RV32G
RISCV:LE:32:RV32GC
RISCV:LE:32:RV32I
RISCV:LE:32:RV32IC
RISCV:LE:32:RV32IMC
RISCV:LE:32:default
RISCV:LE:64:RV64G
RISCV:LE:64:RV64GC
RISCV:LE:64:RV64I
RISCV:LE:64:RV64IC
RISCV:LE:64:default
SuperH4:BE:32:default
SuperH4:LE:32:default
SuperH:BE:32:SH-1
SuperH:BE:32:SH-2
SuperH:BE:32:SH-2A
TI_MSP430:LE:16:default
TI_MSP430X:LE:32:default
Toy:BE:32:builder
Toy:BE:32:builder.align2
Toy:BE:32:default
Toy:BE:32:posStack
Toy:BE:32:wordSize2
Toy:BE:64:default
Toy:LE:32:builder
Toy:LE:32:builder.align2
Toy:LE:32:default
Toy:LE:32:wordSize2
Toy:LE:64:default
avr32:BE:32:default
avr8:LE:16:atmega256
avr8:LE:16:default
avr8:LE:16:extended
dsPIC30F:LE:24:default
dsPIC33E:LE:24:default
dsPIC33F:LE:24:default
pa-risc:BE:32:default
sparc:BE:32:default
sparc:BE:64:default
tricore:LE:32:default
tricore:LE:32:tc172x
tricore:LE:32:tc176x
tricore:LE:32:tc29x
x86:LE:16:Protected Mode
x86:LE:16:Real Mode
x86:LE:32:System Management Mode
x86:LE:32:default
x86:LE:64:default
z180:LE:16:default
z182:LE:16:default
z80:LE:16:default
z8401x:LE:16:default
EOF
CMDS=<<EOF
pdgs
EOF
RUN

NAME=pdgsd
FILE=r2-testbins/elf/crackme0x05
EXPECT=<<EOF
push ebp
mov ebp, esp
sub esp, 0x88
and esp, 0xfffffff0
mov eax, 0
add eax, 0xf
add eax, 0xf
shr eax, 4
-----
0x08048540: PUSH EBP
    (unique,0x12f0,4) = COPY (register,0x14,4)
    (register,0x10,4) = INT_SUB (register,0x10,4) (const,0x4,4)
0x08048541: MOV EBP,ESP
    (register,0x14,4) = COPY (register,0x10,4)
0x08048543: SUB ESP,0x88
    (register,0x200,1) = INT_LESS (register,0x10,4) (const,0x88,4)
    (register,0x20b,1) = INT_SBORROW (register,0x10,4) (const,0x88,4)
    (register,0x10,4) = INT_SUB (register,0x10,4) (const,0x88,4)
    (register,0x207,1) = INT_SLESS (register,0x10,4) (const,0x0,4)
    (register,0x206,1) = INT_EQUAL (register,0x10,4) (const,0x0,4)
    (unique,0x1b20,1) = POPCOUNT (register,0x10,4)
    (register,0x202,1) = INT_AND (unique,0x1b20,1) (const,0x1,1)
0x08048549: AND ESP,0xfffffff0
    (register,0x200,1) = COPY (const,0x0,1)
    (register,0x20b,1) = COPY (const,0x0,1)
    (register,0x10,4) = INT_AND (register,0x10,4) (const,0xfffffff0,4)
    (register,0x207,1) = INT_SLESS (register,0x10,4) (const,0x0,4)
    (register,0x206,1) = INT_EQUAL (register,0x10,4) (const,0x0,4)
    (unique,0x1b20,1) = POPCOUNT (register,0x10,4)
    (register,0x202,1) = INT_AND (unique,0x1b20,1) (const,0x1,1)
0x0804854c: MOV EAX,0x0
    (register,0x0,4) = COPY (const,0x0,4)
0x08048551: ADD EAX,0xf
    (register,0x200,1) = INT_CARRY (register,0x0,4) (const,0xf,4)
    (register,0x20b,1) = INT_SCARRY (register,0x0,4) (const,0xf,4)
    (register,0x0,4) = INT_ADD (register,0x0,4) (const,0xf,4)
    (register,0x207,1) = INT_SLESS (register,0x0,4) (const,0x0,4)
    (register,0x206,1) = INT_EQUAL (register,0x0,4) (const,0x0,4)
    (unique,0x1b20,1) = POPCOUNT (register,0x0,4)
    (register,0x202,1) = INT_AND (unique,0x1b20,1) (const,0x1,1)
0x08048554: ADD EAX,0xf
    (register,0x200,1) = INT_CARRY (register,0x0,4) (const,0xf,4)
    (register,0x20b,1) = INT_SCARRY (register,0x0,4) (const,0xf,4)
    (register,0x0,4) = INT_ADD (register,0x0,4) (const,0xf,4)
    (register,0x207,1) = INT_SLESS (register,0x0,4) (const,0x0,4)
    (register,0x206,1) = INT_EQUAL (register,0x0,4) (const,0x0,4)
    (unique,0x1b20,1) = POPCOUNT (register,0x0,4)
    (register,0x202,1) = INT_AND (unique,0x1b20,1) (const,0x1,1)
0x08048557: SHR EAX,0x4
    (unique,0x8140,4) = INT_AND (const,0x4,4) (const,0x1f,4)
    (unique,0x8150,4) = COPY (register,0x0,4)
    (register,0x0,4) = INT_RIGHT (register,0x0,4) (unique,0x8140,4)
    (unique,0x2150,1) = INT_NOTEQUAL (unique,0x8140,4) (const,0x0,4)
    (unique,0x2160,4) = INT_SUB (unique,0x8140,4) (const,0x1,4)
    (unique,0x2170,4) = INT_RIGHT (unique,0x8150,4) (unique,0x2160,4)
    (unique,0x2180,4) = INT_AND (unique,0x2170,4) (const,0x1,4)
    (unique,0x21a0,1) = INT_NOTEQUAL (unique,0x2180,4) (const,0x0,4)
    (unique,0x21b0,1) = BOOL_NEGATE (unique,0x2150,1)
    (unique,0x21c0,1) = INT_AND (unique,0x21b0,1) (register,0x200,1)
    (unique,0x21d0,1) = INT_AND (unique,0x2150,1) (unique,0x21a0,1)
    (register,0x200,1) = INT_OR (unique,0x21c0,1) (unique,0x21d0,1)
    (unique,0x2200,1) = INT_EQUAL (unique,0x8140,4) (const,0x1,4)
    (unique,0x2220,1) = INT_SLESS (unique,0x8150,4) (const,0x0,4)
    (unique,0x2230,1) = BOOL_NEGATE (unique,0x2200,1)
    (unique,0x2240,1) = INT_AND (unique,0x2230,1) (register,0x20b,1)
    (unique,0x2250,1) = INT_AND (unique,0x2200,1) (unique,0x2220,1)
    (register,0x20b,1) = INT_OR (unique,0x2240,1) (unique,0x2250,1)
    (unique,0x1b50,1) = INT_NOTEQUAL (unique,0x8140,4) (const,0x0,4)
    (unique,0x1b70,1) = INT_SLESS (register,0x0,4) (const,0x0,4)
    (unique,0x1b80,1) = BOOL_NEGATE (unique,0x1b50,1)
    (unique,0x1b90,1) = INT_AND (unique,0x1b80,1) (register,0x207,1)
    (unique,0x1ba0,1) = INT_AND (unique,0x1b50,1) (unique,0x1b70,1)
    (register,0x207,1) = INT_OR (unique,0x1b90,1) (unique,0x1ba0,1)
    (unique,0x1bd0,1) = INT_EQUAL (register,0x0,4) (const,0x0,4)
    (unique,0x1be0,1) = BOOL_NEGATE (unique,0x1b50,1)
    (unique,0x1bf0,1) = INT_AND (unique,0x1be0,1) (register,0x206,1)
    (unique,0x1c00,1) = INT_AND (unique,0x1b50,1) (unique,0x1bd0,1)
    (register,0x206,1) = INT_OR (unique,0x1bf0,1) (unique,0x1c00,1)
    (unique,0x1c20,1) = POPCOUNT (register,0x0,4)
    (register,0x202,1) = INT_AND (unique,0x1c20,1) (const,0x1,1)
EOF
CMDS=<<EOF
s main
pi 8
?e -----
pdgsd 8~!STORE
EOF
RUN
