macaw/x86/tests
Tristan Ravitch 6a4f406c68 Revisit handling of tail calls
It turns out that we have to be more conservative with tail call identification,
as incorrectly identifying a block as the target of a tail call (instead of a
branch) can cause other branch classifiers to fail if that block is the target
of another jump.

Ultimately, we will need to give up some tail call recognition (since they are
in general indistinguishable from jumps), and instead only identify known call
targets as tail call candidates.

With additional global analysis we could do better.

Fixes #294
2022-06-27 15:02:43 -07:00
..
x64 Revisit handling of tail calls 2022-06-27 15:02:43 -07:00
ElfX64Linux.hs [x86] Add an option to save macaw IR from test cases 2022-06-27 15:02:43 -07:00
Main.hs [x86] Add an option to save macaw IR from test cases 2022-06-27 15:02:43 -07:00
README.rst Introduce CValue; clarify function arguments fields. 2019-08-06 09:37:41 -07:00

This directory contains some automated tests for macaw-x86.  The tests
currently cover the code discovery implementation in macaw.
Specifically, they check:

1) That the correct number of functions are found,
2) Each function starts at the expected address,
3) Each function contains the correct number of basic blocks,
4) Each basic block starts at the expected address

The ``Makefile`` in the tests directory rebuilds the test files from
source.  The resulting binaries are checked in to the repository so
that Mac OS users can run the tests without having to have a Linux
build toolchain available.  Additionally, having the binaries in the
repository keeps the code layout stable.  Expected addresses are
hard-coded into the expected results of the test suite; regenerating
the binaries on a different system or with a different compiler could
change the offsets in the test binaries, which would require the
expected results to be tweaked.  This is unfortunate, but difficult to
avoid in a robust way.

Note that the tests are bare-bones and do not link against libc.  They
issue the exit system call directly to terminate.  This lets us get
small and comprehensible test cases.