Commit Graph

3168 Commits

Author SHA1 Message Date
Andrea Gussoni 4777c81800 Add dummy node as source of retreating edges
Add a new dummy node as the source of each backedge found in the graph,
during the preprocessing.

This help in the semplification phase of the SCS, since the new dummy
node helps triggering merging of metaregions with have a non empty
intersection.
2019-05-24 18:35:52 +02:00
Andrea Gussoni 84aec352a3 Head election now always elect the first RPOT node
For now, we disable the complex criterion for the head election of an
SCS with a simple election of the first node of the region in RPOT
2019-05-24 18:35:52 +02:00
Andrea Gussoni ac34e38b2f New merge criterion for SCS regions
The new SCS merging criterion, checks that there are no abnormal
retreating nodes between SCS, meaning retreatings which exit from the
current SCS and do not point to the head of another SCS.

This kind of situation, if ignored could cause the introduction of some
cycles between outlined nodes and existing nodes, inserting new cycles
during the restructuring, which is a behavior which we aim to avoid.
2019-05-24 18:35:45 +02:00
Andrea Gussoni ead83260d6 Outlined nodes inserted in parent metaregions
When outlining nodes, we now include them in eventual parent metaregions
that included the nodes collapsed.

This should lead to minor duplication (as in the `cp` benchmark), since
we avoid duplicating two times nodes if also the external region causes
the first iteration outlining.
2019-05-24 16:10:02 +02:00
Alessandro Di Federico 5009074e9e Introduce AdvancedValueInfo for JT discovery
* Introduce `ShrinkInstructionOperandsPass`: a transformation shrinking
  operands and the results of instructions if they are
  zero/sign-extended immediately before and after the instruction.
* Introduce `ConstantRangeSet`: similar to `ConstantRange` but allows
  disjoint ranges.
* Introduce `MaterializedValue`: a class that can represent a constant
  value or a symbol plus offset pair.
* Introduce `DropHelperCallsPass`: a transformation removing calls to
  helpers and replacing them with a function call reading the CSVs that
  the helper reads and writing the CSVs that the helper writes
  (according to CSAA).
* Introduce `DropRangeMetadataPass`: a transformation dropping the
  `range` metadata, which, in certain situations, lowers the quality of
  the results provided by `LazyValueInfo`.
* Introduce `AdvancedValueInfo`: an analysis exploiting results of
  `LazyValueInfo` but collecting them as `ConstantRangeSet` with a
  monotone framework. It produces `MaterializedValue`.
* Anticipate linking of helpers: `AVI` requires `CSAA`, which requires
  helper functions to be linked in.
* Drop `--no-link`.
* Force x86-64 `DataLayout`.
* Reorganize harvesting to either collect simple literals or go with
  (incremental) `AVI`.
* Drop `SET`, `OSRA`, the reaching definition analysis, the
  `SimplifyComparisonsPass` and all the sumjump-related code: e now
  clone `root`, optimize it and analyze it with `AVI`.
* Temporarily drop the `NoReturnAnalysis`.
* Link `libLLVMInstCombine`, `libLLVMCodeGen` and `libLLVMPasses`.
* Introduce tests for `AdvancedValueInfo`,
  `ShrinkInstructionOperandsPass` and `ConstantRangeSet`.
* Fix test results.
* Add `llvm.bswap.i64` and `@pc` to the LLVM template module for unit
  tests.
2019-05-22 21:30:29 +02:00
Alessandro Di Federico c8998cdece StackAnalysis: election of return SP value
Any stack pointer value greater than or equal to the original one used
to be OK for stack analysis to recognize an instruction as a
return. This commit changes this policy by collecting the value of the
stack pointer on all the return points and, at the end, elect a final
stack pointer value. All non-compliant returns are marked a
`BranchType::BrokenReturn`. The function is now considered fake only if
all the return instructions agree on a specific value of the stack
pointer, and it's lower than the original one.

* Drop `BranchType::IndirectTail`.
* `s/BranchType::FunctionSummary/BranchType::RegularFunction/`.
2019-05-22 21:30:29 +02:00
Alessandro Di Federico a9de053243 Introduce GraphAlgorithms
A series of algorithms working on `llvm::GraphTraits`.

* `nodesBetween` computes the set of nodes on all the paths from a node
  A to B.
* Factor out code to iterate over infinite loops into
  `exitless_scc_range`.
* Introduce unit tests.
2019-05-22 18:42:32 +02:00
Alessandro Di Federico b7ce437469 EnforceABI: completely ignore the stack pointer 2019-05-22 18:42:32 +02:00
Alessandro Di Federico 09cf8ecfbc StackAnalysis: fix bug involving EmptyCallSummary 2019-05-22 18:42:32 +02:00
Alessandro Di Federico 0e9d453be3 ZipMapIterator changes
* Introduce `KeyContainer::compare` and drop the `getKey` method.
* Let users of ZipMapIterator specify a trait class instead of using the
  default one.
2019-05-22 18:42:32 +02:00
Andrea Gussoni f9a46b26c1 Update RPOT instead of re-computing it
We know keep updated the RPOT during node removals (otherwise we have
situation of pointer clashes) instead of recomputing it at each
metaregion restructuring iteration.
2019-05-22 16:03:10 +02:00
Alessandro Di Federico 6ae3b6f22f Whitespace and other minor changes
* `GeneratedCodeBasicInfo::getCSVUsedByHelperCall` and
  `GeneratedCodeBasicInfo::extractCSVs`: make the call argument an
  `Instruction`.
* Introduce `blockByName`
* Introduce `getUniqueUser`.
* Fix linking issues.
2019-05-14 16:27:13 +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 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 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
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
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
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 84105a81ee Add test for the ReachabilityPass 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
Andrea Gussoni f4f877c569 Change SetNode interface 2019-04-15 10:05:17 +02:00
Andrea Gussoni 1c66c145cb RegionCFG::initialize method now template
The `RegionCFG::initialize` method is now a template method, which
accepts as input any kind of object which exposes the `GraphTraits`.

In this way we can build a `RegionCFG` object not only starting from
LLVM IR, which can be very useful for testing purpose.

Since we also removed the information about the original
`llvm::BasicBlock` inside the `BasicBlockNode`, we need to keep this
link to later feed this information to the GHAST in an external data
structure (potentially a `std::map`).
2019-04-15 10:04:40 +02:00