Commit Graph

6113 Commits

Author SHA1 Message Date
Andrea Gussoni 1bca91fff9 Fix untangle when postdominator direct successor
Fix the untangle optimization when the immediate postdominator is an
immediate successor of the conditional node that triggered the inlining.
2019-05-10 17:55:55 +02:00
Andrea Gussoni 8095e1851c Handle CheckNodes in the untangle
Handle the cloning of the `CheckNode`s and their successors during the
untangle optimization.
2019-05-10 17:55:55 +02:00
Andrea Gussoni 7df3a13629 Untangle first draft
Introduce the untangle pass.

This preprocessing phase is in charge of the untangling optimization.
This optimization searches for conditional node, where, if a branch is
completely inlined (i.e., the entire path until reaching the exit is
duplicated and directly attached to it) we can save duplication in the
combing phase.

The untanle is based on a euristics, which consists of estimating the
duplication that could be introduced by the combing (computing the
weight for the nodes not dominated from the conditional node, of both
branches), with respect to the weight of duplicating the path that will
be inlined (the weight of all the nodes of the branch inlined plus the
weight of the nodes from the immediate postdominator of the conditional
until the exits).

The current implementation of the untangle is very conservative (no
untangle is performed if the `then` and `else` branches share some
nodes, or if there isn't at least one of the two branches which
dominates all the nodes until the postdominator).

The euristics also does not take into consideration the weight for
collapsed nodes.
2019-05-10 17:55:55 +02:00
Andrea Gussoni 560aaac9c8 New comb implementation
Implementation of the `comb` algorithm without dominator and
postdominator trees.

The comb now uses a list of nodes kept in reverse postorder (and updated
at each dummy insertion, node duplication and node removal), and various
sets of nodes that contains elements still to eplore under a certain
conditional node, nodes already visited, and so on.

Also the set of immediate post dominator (the point at which the comb
stops during its exploration) is computed only once at the beginning of
the algorithm, and simply kept updated at dummy insertion and removal.

The phase that checked if a conditional node dominates all the nodes
until the postdominator, has been replaced by a check which looks if all
the predecessors of a certain node have been visited during the current
exploration (which is perfomed in reverse postorder). If this condition
does not verify, it means that there is an incoming arc incoming in the
node under analysis which is not dominated by the current conditional
node.

There is still margin for improving the performance of this, this is
only a first implementation.
2019-05-10 17:55:22 +02:00
Andrea Gussoni d7d7355f9e revng-c include file now installed
Dropped the use of a temporary file containing the necessary includes
for clang-tooling to work correctly (at the moment `#include <stdint.h>`
) in favor of a single file which is installed in `root/share/revngc`
and used by clang-tooling.
2019-05-10 17:38:05 +02:00
Andrea Gussoni 60e8c4a507 Add file serialization for decompiled functions
If the `-decompiled-prefix` is passed to the `revng opt` command the
decompilation pass takes care of serializing the decompiled code of each
function in a different file.

The filename is composed by the prefix string passed as parameter and by
the function name.
2019-05-10 17:37:18 +02:00
Pietro Fezzardi 494570f3df CDecompilerAction: fix assignments of PHINodes 2019-05-10 15:38:06 +02:00
Pietro Fezzardi ef3daf7a60 Refactor building AST for BasicBlocks 2019-05-10 11:53:28 +02:00
Pietro Fezzardi b058c326c6 Enforce coding style 2019-05-08 17:40:53 +02:00
Pietro Fezzardi b68f4fd89c Print all types before variable declarations 2019-05-08 17:40:53 +02:00
Pietro Fezzardi 1f07736523 Merge branch 'feature/switch-break' 2019-05-06 11:20:41 +02:00
Pietro Fezzardi 8ab637df8a Fix missing default statements from switches 2019-05-06 11:19:41 +02:00
Pietro Fezzardi de7089cbc4 Handle breaks from loops from within switches 2019-05-06 11:19:41 +02:00
Pietro Fezzardi 08f68994bd Add SwitchBreakNodes in fixSwitchBreaks() 2019-05-06 11:19:41 +02:00
Pietro Fezzardi 0d38a5cc8d Remove unused member function from ASTTree 2019-05-06 11:19:41 +02:00
Pietro Fezzardi d04f6ba9de Add skeleton for fixSwitchBreaks() 2019-05-06 11:19:41 +02:00
Pietro Fezzardi a946f2ba9a Add SwitchBreakNode 2019-05-06 11:19:41 +02:00
Pietro Fezzardi 7c15a58f72 Merge branch 'feature/preliminary-c-tests' 2019-05-06 11:18:08 +02:00
Andrea Gussoni e8ad1e542b Fixes and improvements suggested by MR 2019-05-03 15:46:07 +02:00
Andrea Gussoni dee4db8216 DOT and AST only enabled in debug mode
To avoid skeing the results the serialization of `DOT` intermediate file
for both restructuring and AST semplification passes are now serialized
only when the corresponding loggers (`CombLogger` and `BeautifyLogger`)
are enabled.
2019-04-24 16:21:34 +02:00
Andrea Gussoni 3e18b199bb Use DotFileObject library provided in revng
Now use the `DotFileObject provided by `revng` instead of using our own.
2019-04-23 16:35:37 +02:00
Andrea Gussoni 2999e442c4 Move internal SetNode before extern CheckNode
When a retreating edge involves as source node a `SetNode` belonging to
an internal region (which should be the default `SetNode` that remains
outside the collpased node), move it just after the `CheckNode` that is
being introduced, so that the semantics of the code remains untouched.
2019-04-23 14:37:13 +02:00
Alessandro Di Federico feb06d180c Use revng --verbose in tests
This enables more informative debug logs.
2019-04-22 05:40:28 +02:00
Alessandro Di Federico 17eaaa1b0c Whitelist architectures in tests
We used to list all the architectures supported by QEMU in tests,
however this not optimal. This commit switches to a whitelist for the
list of architectures to tests so that we don't test architectures for
which we have a toolchain but aren't ready for the testsuite.
2019-04-22 05:40:28 +02:00
Alessandro Di Federico d411978af7 revng translate: invoke revng-lift directly 2019-04-22 05:40:27 +02:00
Andrea Gussoni 616c162523 DotGraph and DotNode
This commit implements a simple wrapper class able to parse a GraphViz
file in an object implementing the LLVM `GraphTraits`.
2019-04-22 05:40:27 +02:00
Alessandro Di Federico 4d5493fe7f Warning on translation of non-x86-64 dynamic ELF
We can currently successfully translate only dynamic binaries for
x86-64. Warn the user about this early on instead of failing in
`revng-merge-dynamic`.
2019-04-21 10:17:08 +02:00
Alessandro Di Federico 39a5a217c4 revng script: detect AArch64 2019-04-21 10:16:51 +02:00
Andrea Gussoni 0bbfeff053 clang-format 2019-04-19 12:30:13 +02:00
Andrea Gussoni cfa2ba41f4 Use llvm::SmallString' for BBNode` name field
Use a `llvm::SmallString` for the `Name` field of `BasicBlockNode`.
This enables us to modify the name of the node, which is very useful
during debugging and manual inspection of the graph serialized in
output.
2019-04-19 12:13:22 +02:00
Andrea Gussoni 675ed76ea1 Clang-format 2019-04-19 11:36:54 +02:00
Andrea Gussoni 1a63c6ced6 Add assertion to early catch bugs
Add some assertions in the restructuring phase aimed to early catch bugs
which we found in the last bugfix iteration.
2019-04-19 11:34:27 +02:00
Andrea Gussoni e0d605ca8c Fix metaregions identification phase
Fix the metaregion identification phase, in particular the add of the
addditional nodes merged when encountering a node which is the target of
a backedge identifying another metaregion.

The add of the additional nodes must be done in a fixed point fashion,
otherwise in case of dependent insertions the order of the nodes
triggers different behaviours (and bugs).
2019-04-19 11:04:11 +02:00
Andrea Gussoni 67bbd24361 Improve metaregions creation order 2019-04-19 10:55:53 +02:00
Andrea Gussoni d9d1730f5e Improve debug information for metaregions
Improved the debugging informations provided by the restructuring pass
on the identified metaregions.
2019-04-19 10:47:14 +02:00
Andrea Gussoni 485a253dec Improve serialization on files 2019-04-19 10:34:31 +02:00
Andrea Gussoni 8a90516915 Update the reverse post order
Update the reverse post order at each restructuring iteration.
2019-04-19 09:49:47 +02:00
Andrea Gussoni abb72c3b23 Coding style and improvements in MR 2019-04-16 17:37:57 +02:00
Andrea Gussoni e6ec54c9bc Enforce const on member functions 2019-04-16 10:19:34 +02:00
Andrea Gussoni 95ddb2b36b BasicBlockNode and RegionCFG now template
`BasicBlockNode` and `RegionCFG` classes are now template classes. This
means that the `BasicBlockNode` class can be used as a generic wrapper
for any type of object in the original graph (it is usually used to wrap
a `llvm::BasicBlock *` for decompilation purposes, but in tests it can
be used to wrap a `DotNode` object) that implementes `GraphTraits`.
2019-04-15 17:30:37 +02:00
Andrea Gussoni 6574255e8a Improve StringRef use for BasicBlockNode
Improved the interaction with the `StringRef` name field of
`BasicBlockNode`.

In case of artificial nodes, the name is left empty and created
on-the-fly for serialization purposes.
2019-04-15 10:22:11 +02:00
Andrea Gussoni 20b380c0d1 NDuplicates passed as reference to Mark
Removed the computation of the information contained in the
`NDuplicates` prevously done in the `MarkForSerialization` pass, since
the information is now precomputed in the `RestructureCFG` pass and
exposed with a dedicated method.
2019-04-15 10:16:05 +02:00
Andrea Gussoni 7633274a7e Add tests for combing
Added tests for the combing pass.
2019-04-15 10:11:26 +02:00
Andrea Gussoni 84105a81ee Add test for the ReachabilityPass 2019-04-15 10:11:26 +02:00
Andrea Gussoni 656cffaac5 Boost test infrastructure
Add the skeleton for the `boost` testing infrastrucure.
2019-04-15 10:11:26 +02:00
Andrea Gussoni 076f7069de RegionCFG helpers for tests
Add a couple of method wrappers and helpers for the `RegionCFG` class,
which are necessary for the testing infrastructure.
2019-04-15 10:11:26 +02:00
Andrea Gussoni 479c6c5fb7 DotGrap class to load RegionCFG from .dot
Add a `DotGraph` and `DotNode` classes, which implements `GraphTraits`,
so that we can create a `RegionCFG` starting from a graph specified in
a `.dot` file.

The `DotClass` implements a minimal parser for graph specified in `.dot`
format.

The `.dot` should begin with the specification of the name of the graph
`digraph TestGraph {`, followed by an arbitrary number of lines which
specify the edges in the graph (no attributes allowed, e.g., `a -> b;`).
The file should end with a single line ending in `}`.
2019-04-15 10:11:26 +02:00
Andrea Gussoni 7a04f6e52f Add topological graph equivalence function.
Add helpers to test if two `RegionCFG` objects can be considered
equivalent.

This will be used in the test environment to check if the comb
transformation is consistent with the expected behavior.
2019-04-15 10:11:26 +02:00
Andrea Gussoni 2b53f04f31 Compute information about node cloning
Compute how many times an original `llvm::BasicBlock` has been
duplicated during the comb pass.
2019-04-15 10:05:17 +02:00
Andrea Gussoni 3aaf4d939e Update OriginalBB map when moving nodes.
Update the `OriginalBB` map (which will be later used for retrieving the
original basic block linked to a certain BBNode) during nested
`RegionCFG` creation and during flattening, which are steps that modify
the allocation of the `BBNode` objects.
2019-04-15 10:05:17 +02:00