diff --git a/librz/core/disasm.c b/librz/core/disasm.c index 61fe822e71..abac0f97d1 100644 --- a/librz/core/disasm.c +++ b/librz/core/disasm.c @@ -2214,7 +2214,8 @@ static void ds_show_flags(RzDisasmState *ds, bool overlapped) { if (!strncmp(flag->name, "case.", 5)) { sscanf(flag->name + 5, "%63[^.].%d", addr, &case_current); ut64 saddr = rz_num_math(core->num, addr); - if (case_start == -1) { + bool switch_addr_changed = switch_addr != saddr; + if (case_start == -1 || switch_addr_changed) { switch_addr = saddr; case_prev = case_current; case_start = case_current; @@ -2222,11 +2223,21 @@ static void ds_show_flags(RzDisasmState *ds, bool overlapped) { continue; } } - if (case_current == case_prev + 1 && switch_addr == saddr) { + if ((case_current == case_prev + 1 || case_current == case_prev) && !switch_addr_changed) { + // We're still inside a range, continue extending the range boundary until we reach the + // end of the label list or a default label case_prev = case_current; + bool next_is_default = false; if (iter != uniqlist->tail) { + RzFlagItem *next_flag = rz_list_next(iter)->val; + next_is_default = !strncmp(next_flag->name + 5, "default", 7); + } + if (iter != uniqlist->tail && !next_is_default) { continue; } + } else if (!switch_addr_changed && iter == uniqlist->tail) { + // Iterate last index for a second time, otherwise the index will not get displayed + iter = rz_list_prev(iter); } } if (printPre) { @@ -2311,7 +2322,7 @@ static void ds_show_flags(RzDisasmState *ds, bool overlapped) { } else { rz_cons_printf("%d:", case_prev); } - if (iter != uniqlist->head && iter != uniqlist->tail) { + if (iter != uniqlist->head && iter != uniqlist->tail && case_current != case_prev) { iter = rz_list_prev(iter); } case_start = case_current; @@ -2321,7 +2332,7 @@ static void ds_show_flags(RzDisasmState *ds, bool overlapped) { } else { rz_cons_printf("%s:", case_prev_name); } - case_start = -1; + case_start = case_current; } } case_prev = case_current; diff --git a/test/db/analysis/arm b/test/db/analysis/arm index 579c2ffb88..2af1053cc4 100644 --- a/test/db/analysis/arm +++ b/test/db/analysis/arm @@ -2235,7 +2235,7 @@ EXPECT=< 0x08000060 xor eax, eax | 0x08000062 ret .. | ; CODE XREF from sym.owGetPageLength.constprop.0 @ 0x800005e | ;-- case 4: ; from 0x800005e +| ;-- case 6: ; from 0x800005e | ;-- case 8: ; from 0x800005e +| ;-- case 10: ; from 0x800005e | ;-- case 12: ; from 0x800005e +| ;-- case 24: ; from 0x800005e | ;-- case 26: ; from 0x800005e +| ;-- case 29: ; from 0x800005e | ;-- case 33: ; from 0x800005e +| ;-- case 35: ; from 0x800005e | 0x08000068 mov rsi, rdi ; arg1 | 0x0800006b mov edi, 0x01 | ,=< 0x08000070 jmp reloc.target.getPageLengthNV ; RELOC 32 getPageLengthNV .. | | ; CODE XREF from sym.owGetPageLength.constprop.0 @ 0x800005e | | ;-- case 9: ; from 0x800005e +| | ;-- case 11: ; from 0x800005e | | ;-- case 15: ; from 0x800005e -| | ;-- case 19: ; from 0x800005e +| | ;-- case 18...19: ; from 0x800005e | | 0x08000078 mov rsi, rdi ; arg1 | | 0x0800007b mov edi, 0x01 | ,==< 0x08000080 jmp reloc.target.getPageLengthEPROM ; RELOC 32 getPageLengthEPROM @@ -370,6 +374,7 @@ EXPECT=<