Skip to content

Commit

Permalink
Bring merge sort and insertion sort cmp function semantics together
Browse files Browse the repository at this point in the history
Merge sort uses cmp (a, b) < 0 for its first test branch, and insertion
sort cmp (a, b) > 0 ; which means the 0 boundary goes in one case in one
branch, and in the other sort function in the other branch.

We keep the semantics of the insertion sort, because some code already
relies on this, like register sorting and re-indexing in libr/reg/reg.c;
it makes it possible to support compare function that return true/false
instead of a distance between items.

Add a test that was previously failing for merge sort (but working with
insertion sort); based on real-world data of a list of registers that
went from < 43 elements (insertion sort) to 104 elements (merge sort).
The main difference is the test function that sends true/false instead
of a difference between two integers.

Fix merge sort similarly in shlr/sdb/src/ls which combines both
insertion sort and merge sort with the same bugs.

Update tests that were broken because of wrong register ordering.
  • Loading branch information
anisse committed Aug 16, 2020
1 parent 3af2889 commit b44905d
Show file tree
Hide file tree
Showing 8 changed files with 222 additions and 173 deletions.
2 changes: 1 addition & 1 deletion libr/util/list.c
Expand Up @@ -479,7 +479,7 @@ static RListIter *_merge(RListIter *first, RListIter *second, RListComparator cm
} else if (!first) {
next = second;
second = second->n;
} else if (cmp (first->data, second->data) < 0) {
} else if (cmp (first->data, second->data) <= 0) {
next = first;
first = first->n;
} else {
Expand Down
2 changes: 1 addition & 1 deletion shlr/sdb/src/ls.c
Expand Up @@ -45,7 +45,7 @@ static SdbListIter *_merge(SdbListIter *first, SdbListIter *second, SdbListCompa
} else if (!first) {
next = second;
second = second->n;
} else if (cmp (first->data, second->data) < 0) {
} else if (cmp (first->data, second->data) <= 0) {
next = first;
first = first->n;
} else {
Expand Down
2 changes: 1 addition & 1 deletion test/db/anal/vars
Expand Up @@ -151,8 +151,8 @@ afv
EOF
EXPECT=<<EOF
arg int64_t arg3 @ r8
arg int64_t arg2 @ rdx
arg const char * s @ rcx
arg int64_t arg2 @ rdx
EOF
RUN

Expand Down
2 changes: 1 addition & 1 deletion test/db/anal/x86_64
Expand Up @@ -1570,8 +1570,8 @@ EXPECT=<<EOF
var int64_t var_14h @ rbp-0x14
var int64_t var_10h @ rbp-0x10
var int64_t var_8h @ rbp-0x8
arg int64_t arg1 @ rdi
arg int64_t arg2 @ rsi
arg int64_t arg1 @ rdi
EOF
RUN

Expand Down
294 changes: 147 additions & 147 deletions test/db/archos/linux-x64/dbg_drt
Expand Up @@ -135,188 +135,188 @@ CMDS=<<EOF
drt all~[0]
EOF
EXPECT=<<EOF
ymm15
ymm14
ymm13
ymm12
ymm11
ymm10
ymm9
ymm8
ymm7
ymm6
ymm5
ymm4
ymm3
ymm2
ymm1
ymm0
x64
xmm15h
xmm15
xmm14l
xmm14h
xmm14
xmm13l
xmm13h
xmm13
xmm12l
xmm12h
xmm12
xmm11l
xmm11h
xmm11
xmm10l
xmm10h
xmm10
xmm9l
xmm9h
xmm9
xmm8l
xmm8h
xmm8
xmm7l
xmm7h
xmm7
xmm6l
xmm6h
xmm6
xmm5l
xmm5h
xmm5
xmm4l
xmm4h
xmm4
xmm3l
xmm3h
xmm3
xmm2l
xmm2h
xmm2
xmm1l
xmm1h
xmm1
xmm0l
xmm0h
xmm0
mm7
mm6
mm5
mm4
mm3
mm2
mm1
mm0
st7
st6
st5
st4
st3
st2
st1
st0
mxcr_mask
mxcsr
frdp
frip
fop
ftw
swd
cwd
dr7
dr6
dr3
dr2
dr1
dr0
gs_base
fs_base
es
ds
gs
fs
ss
orax
of
df
if
tf
sf
zf
af
pf
cf
eflags
rflags
cs
rip
bpl
bp
ebp
rbp
spl
sp
esp
rsp
dil
di
edi
rdi
sil
si
esi
rsi
r15b
r15w
cwd
r15d
r15
dr0
ymm0
swd
ftw
fop
r14b
r14w
r14d
r14
dr1
frip
r13b
r13w
r13d
r13
dr2
frdp
r12b
r12w
r12d
mxcsr
r12
dr3
mxcr_mask
bpl
bp
ebp
rbp
mm0
st0
ymm1
bl
bx
ebx
rbx
bh
r11b
r11w
r11d
r11
dr6
mm1
st1
r10b
r10w
r10d
r10
dr7
r9b
r9w
r9d
r9
mm2
st2
ymm2
r8b
r8w
r8d
r8
dl
dh
dx
edx
rdx
cl
ch
cx
ecx
rcx
bl
bh
bx
ebx
rbx
al
ah
ax
eax
rax
mm3
st3
ah
cl
cx
ecx
rcx
ch
dl
dx
edx
rdx
mm4
st4
dh
ymm3
sil
si
esi
rsi
dil
di
edi
rdi
mm5
st5
orax
rip
mm6
st6
ymm4
cs
cf
eflags
pf
rflags
mm7
af
st7
zf
sf
tf
if
df
of
spl
sp
esp
rsp
ss
xmm0h
xmm0
ymm5
fs
xmm0l
gs
xmm1h
xmm1
ds
xmm1l
es
xmm2h
xmm2
ymm6
fs_base
xmm2l
gs_base
xmm3h
xmm3
xmm3l
xmm4h
xmm4
ymm7
xmm4l
xmm5h
xmm5
xmm5l
xmm6h
xmm6
ymm8
xmm6l
xmm7h
xmm7
xmm7l
xmm8h
xmm8
ymm9
xmm8l
xmm9h
xmm9
xmm9l
xmm10h
xmm10
ymm10
xmm10l
xmm11h
xmm11
xmm11l
xmm12h
xmm12
ymm11
xmm12l
xmm13h
xmm13
xmm13l
xmm14h
xmm14
ymm12
xmm14l
xmm15h
xmm15
x64
ymm13
ymm14
ymm15
EOF
RUN

0 comments on commit b44905d

Please sign in to comment.