Commit Graph

1429 Commits

Author SHA1 Message Date
Alessandro Di Federico 6e6aeac45d Keep sum of pushed values in RunningStatistics 2020-06-02 10:57:02 +02:00
Alessandro Di Federico 1f7b23bb5a Introduce harvesting statistics 2020-06-02 10:57:02 +02:00
Alessandro Di Federico 99486d0b6b Update tests' references after new dispatcher 2020-06-02 10:57:02 +02:00
Alessandro Di Federico 773e386f22 Prevent SIGSEGV in translation with guard pages
When translation of code overflows into an unmapped page, we can get a
SIGSEGV. To avoid this, for each set of contiguous pages, we add "guard
page" containing an architecture-specific pattern that ensure basic
block termination.
2020-06-02 10:57:02 +02:00
Alessandro Di Federico d10178483d Introduce the new MetaAddress
Unlike the previous iteration of `MetaAddress`, which tried to stuff all
the parts of `MetaAddress` within the existing `PC` CSV, this
implementation adds a set of new CSVs (or marks some existing ones as) to
represent the four portions of the current PC's `MetaAddress`.

* Introduce `ProgramCounterHandler`: a class responsible to maintain the
  PC-related CSVs. This class is also used to manipulate the new
  dispatcher.
* `AdvancedValueInfo`: update for new MetaAddress.
* External jump handler: do not clobber registers.
  When introducing support for dynamic binaries, we didn't realize that
  in x86-64 we were clobbering `r11`. To avoid this, we have to jump to
  an address stored in memory. However, due to the new `MetaAddress`,
  obtaining a *jumpable* address from the PC-related CSVs might require
  some computations (and it does in ARM). Therefore, we introduce a new
  global variable, `jumpablepc`, whose only role is to contain the
  jumpable version of the program counter and then be the target of the
  memory-indirect jump instruction.
* Labels care only about absolute addresses.
* CSAA: mark call site, even if no accesses.
2020-06-02 10:57:02 +02:00
Alessandro Di Federico 10435feb59 Whitespace and other minor changes 2020-05-14 22:55:18 +02:00
Alessandro Di Federico 89258b832d Add ARM's PCMContextIndex
`PCMContextIndex` is the index of the PC register within the `mcontex_t`
`struct`.
2020-05-14 22:55:18 +02:00
Alessandro Di Federico 1e5fd5cc25 BinaryFile::readRawValue: prevent invalid reads
It might happend that, while parsing an input binary, we are request to
read at a valid address, but a for a size leading outside of a valid
page.

This commit, copies as much data as possible from the valid page into a
temporary buffer of the appropriate size, and then performs the read on
that temporary buffer.
2020-05-14 22:22:31 +02:00
Alessandro Di Federico 429567b885 Handle binaries without ELF program headers
Not all binaries have ELF program headers, e.g., Mach-O binaries.
2020-05-14 22:22:31 +02:00
Alessandro Di Federico 20d346aaf7 Fix handling of Mach-O LC_UNIXTHREAD 2020-05-14 22:22:31 +02:00
Alessandro Di Federico b5d719efb5 Indent multiline log entries 2020-05-14 22:03:37 +02:00
Alessandro Di Federico 2e8e594304 StackAnalysis: handle UndefValue 2020-05-14 21:59:04 +02:00
Alessandro Di Federico 885d705938 FunctionIsolation: handle nullptr and undefs 2020-05-14 21:59:04 +02:00
Alessandro Di Federico b5a1fa2c32 Disable Architecture's copy constructor 2020-05-14 21:59:03 +02:00
Alessandro Di Federico d704e88550 getBasicBlockPC: handle empty blocks 2020-05-14 11:59:05 +02:00
Alessandro Di Federico 2548df7092 QuickMetadata: improve ConstantInt handling 2020-05-14 11:59:05 +02:00
Alessandro Di Federico 22232441dd getName: print pointer as fallback 2020-05-14 11:59:05 +02:00
Alessandro Di Federico 34d7a8e364 Let ConstantRangeSet::dump work on any stream 2020-05-14 11:59:05 +02:00
Alessandro Di Federico e51d6e5458 Make the revng script compatible with clang's ASan 2020-05-14 11:59:05 +02:00
Alessandro Di Federico de172232e6 Run the most specific tests first 2020-05-14 11:59:05 +02:00
Alessandro Di Federico 149ef61759 Fix unit tests linking
For unit tests we used to call `add_executable` directly. However, this
prevents using RPATH as appropriate.
2020-05-14 11:59:05 +02:00
Alessandro Di Federico aea5ebe0cc Enable "autobrief" doxygen comments
This option automatically detects brief description without `\brief`.
2020-05-14 11:59:05 +02:00
Alessandro Di Federico 9e52b0c473 Switch ARM tests to Thumb 2020-05-14 11:59:05 +02:00
Alessandro Di Federico 2531cc3c60 The link register has to be an ABI register
This is to prevent the PC (or similar CSVs) from being considerate as a
link register.
2020-05-14 11:59:05 +02:00
Alessandro Di Federico 9cfb96c18c Run InstCombine on generated code
We now run InstCombine on the generated code in order to simplify
further analyses. In particular this is useful to handle code such as
the following:

    %pc = load @pc
    %is_thumb = and %pc, 1
    %address = and %pc, ~1
    %pc2 = or %is_thumb, %pc

After InstCombine `%pc` and `%pc2` are collapsed.
2020-05-14 11:59:05 +02:00
Pietro Fezzardi 1c02dfd2a5 CSAA: strip bitcasts on pointers to env 2020-05-14 11:59:02 +02:00
Alessandro Di Federico dc48188f37 Introduce MetaAddress
`MetaAddress` replaces all the `uint64_t` used to represent a virtual
address. Its main features are:

* It has a non-zero representation of invalid addresses.
* It supports tags to represent code that has different interpretations but
  resides at the same address in memory (namely ARM vs Thumb).
* Arithmetic operations cannot overflow.
* It supports epochs, a way we intend to employ to handle self-modifying code
  (i.e., different code at the same address at different times).
* It supports "address spaces", which enable handling architectures with
  multiple address spaces.
* It fits in two 64-bit registers.
2020-05-14 11:58:18 +02:00
Alessandro Di Federico e336a33545 Move GCBI::getPC to IRHepers.h 2020-05-14 11:58:18 +02:00
Alessandro Di Federico 58a070349b Fixes in handling DWARF information 2020-05-14 11:58:18 +02:00
Alessandro Di Federico 35171a789d Sort translated basic blocks in reverse post-order
After translation, `revng-lift` now sorts all the basic blocks in
reverse post-order to ease manual reading of the generated modules.
2020-05-14 11:58:18 +02:00
Alessandro Di Federico 20c367b88f Add ArchitectureName to revng.input.architecture 2020-05-14 11:58:18 +02:00
Alessandro Di Federico da9e6094d3 Introduce Label::hasValue 2020-05-14 11:58:18 +02:00
Alessandro Di Federico d83eca0902 Use ConstantExpr::isCast()
Simplify `getConstValue` in `IRHelpers.h` to use `ConstantExpr::isCast`.
2020-05-14 11:58:18 +02:00
Alessandro Di Federico cb803dce70 BinaryFile::parseELF: fix labels creation
The loop creating the labes in `BinaryFile::parseELF` was badly indent
and resulted in the creation of labels only if the `.dynamic` section
was available.
2020-05-14 11:58:18 +02:00
Alessandro Di Federico a52fb24e02 Various improvements to StackAnalysis
* Ignore casts in `BasicBlockState::get`
* Fix some types
* Do not move `Element::bottom()`
2020-05-14 11:58:18 +02:00
Alessandro Di Federico 78dafb04da IFI::cloneInstruction: handle ConstantAggregate 2020-05-14 11:58:18 +02:00
Alessandro Di Federico 72fc95bda9 Purge OriginalInstructionAddresses when deleting
`JumpTargetManager::purgeTranslation` deletes some basic blocks that
need to re-translated, however references to some instructions remained
in `OriginalInstructionAddresses`.
2020-05-14 11:58:18 +02:00
Alessandro Di Federico 8deab9c7ea Whitespace and other minor changes
* Drop unused argument names from function prototypes
* Make `static` some methods
* Disable some copy constructors
* Fix casing of Doxygen `\file` directives
* Add some casts to make the compiler happy
* Initialize `hasRelocationAddend` for AArch64
* Use references in range-for where possible
* Drop default for `switch` statements covering all the entries of an `enum`
* Make some global variables `static`
* Drop dead functions
2020-05-14 11:58:18 +02:00
Alessandro Di Federico c1a768ff21 Drop InstructionTranslator::ForceNewPC
It was a leftover for a problem (marking post-helper addresses as jump
targets) that we appear to have solved in another way.
2020-03-02 12:38:01 +01:00
Pietro Fezzardi 5d0f5fef71 Drop TransformIterator
LLVM already implements an analogous `mapped_iterator` type in
`STLExtras.h` header.  `llvm::mapped_iterator` has been used to
substitute `TransformIterator` in the project so that we don't need to
reinvent the wheel.
2020-02-27 12:28:28 +01:00
Alain Carlucci 469ef9cae8 Rename emit to flush in Debug.h
The `emit` keyword is used in Qt and, if the method is called `emit`,
rev.ng headers cannot be included in a Qt project.
2020-02-27 12:12:25 +01:00
Andrea Gussoni 2896664cab JTM::readFromPointer: handle ConstantNullPointer 2020-02-27 11:57:34 +01:00
Pietro Fezzardi 890be7d6a2 Uniform dumpToString interface
Before this commit, the `dumpToString()` function defined in
`include/revng/Support/IRHelpers.h` was only defined with arguments of
type `const llvm::Module *` and `const llvm::Value *`.
This is not very ergonomic, because lots of types in LLVM have a
`print()` method that dumps the representation on a
`llvm::raw_ostream``.

This commit introduces function templates to handle all possible types
in LLVM that have a method `void print(llvm::raw_ostream &)`.

The templates are defined so that they should work with every possible
combination of references and pointer types, along with const
qualifiers.

To achieve this, the code makes use of `std::enable_if`` to provide
different definitions of the `dumpToString()` template helper function,
which only participate in overload resolution for specific types:
1. for `llvm::Module` and `llvm::Function`, which share the same
prototype for the `print()` method
2. for `llvm::Value` which has yet another prototype for the `print()`
method
3. for all other types that provide a method with the signature
`void print(llvm::raw_ostream &)`.

The last implementation (3) also works for all non-LLVM types provide a
method with the signature `void print(llvm::raw_ostream &)`.
In this sense, if in the future we want our own type to be easily dumped
to string (handy for logging), we can just implement the method
`void print(llvm::raw_ostream &)` and the `dumpToString()` function
template added in this commit will work out ot the box.
2020-02-27 11:55:09 +01:00
Pietro Fezzardi a0102592b5 Lifting non-x86 dynamic ELFs: fix error message 2020-02-27 11:55:09 +01:00
Andrea Gussoni 0c05c0c75b AVI: handle ConstantPointerNull and UndefValue
Handle `ConstantPointerNull` explicitly in Advanced Value Info, instead
of trying to obtain the analysis result for its operand (which is by
design a `nullptr`).
2020-02-27 11:55:09 +01:00
Pietro Fezzardi 433ce5613b Drop old useless header MemoryAccess.h
This was a leftover from the OSRA era.
2020-02-27 10:48:17 +01:00
Pietro Fezzardi ae948500eb Move LLVM header where it's really needed
Before this commit, the header `revng/Support/DebugHelper.h` could only
be included after explicitly including
`llvm/IR/AssemblyAnnotationWriter.h`, since `DebugHelper.h` used the
LLVM class `AssemblyAnnotationWriter`, that is not defined in
`DebugHelper.h`.

This commit includes `llvm/IR/AssemblyAnnotationWriter.h` directly into
`revng/Support/DebugHelper.h`, which can now be included alone without
compilation errors.
2020-02-27 10:47:07 +01:00
Pietro Fezzardi 6d5699c174 Unit Tests: replace revng_assert with revng_check
Calls to `revng_assert` are removed when compiling in release, calls to
`revng_check` are not.
This replacemente makes tests more robust in release.
2020-02-26 18:35:59 +01:00
Alessandro Di Federico ebb8673551 Merge branch 'feature/qa' 2020-02-21 00:20:12 +01:00
Alessandro Di Federico 12d093b459 Rethink testing
This commit performs the changes necessary in order to integrate with
revng-qa, the new project for cross-project quality assurance.

Basically, the source code of all the tests has been moved in revng-qa,
which will take care of producing "artifacts" (i.e., compiled programs),
using the appropriate cross-compilers.

revng will then consume them and produce new artifacts to be consumed by
other tools down the pipeline.

The directory structure of the tests has been reworked to reflect
`revng-qa`. A large amount of boilerplate code has been dropped.

Note that certain actions, that used to be carried out during testing,
are now part of the regular build process. Specifically, lifting the
tests is performed at build time, so that they can be installed.
2020-02-20 12:16:56 +01:00