- Dec 05, 2018
-
-
Andrea Gussoni authored
Fixes for the following things that caused errors in the translated module due to changes introduced in the `prune-eh` optimization pass: - `Support.c` is now compiled with support for exceptions, to avoid marking the `raise_exception_helper` function to be marked `unwind` during the link phase. - Added a fake `ret` at the end of the `catchblock` to avoid optimizations. - Marked the `invoke` instructions not as candidate for function inlining.
-
- Nov 30, 2018
-
-
Alessandro Di Federico authored
-
Alessandro Di Federico authored
`revcc` is a simple script that forwards its arguments to a specified compiler, except in the case in which the compiler is asked to link the final program. In such case, the compiler is invoked as appropriate, but the resulting binary is then translated using rev.ng and replaced by the translated version.
-
- Nov 29, 2018
-
-
Andrea Gussoni authored
Fix for a situation where the fallthrough basic block of an instruction calling a helper function is not in an executable segment and therefore not created.
-
Andrea Gussoni authored
Quick fix to detect overflow in SET interval computation.
-
Alessandro Di Federico authored
This commit fixes a huge performance issue due to performing a orphan basic block cleanup every time `JumpTargetManager::peek` was called instead of only when actual harvesting was required.
-
Pietro Fezzardi authored
-
Andrea Gussoni authored
Now using the `root` function of the cloned module as a starting point for the isolation process. In this way we can ignore the old module, and in particular we can drop the `ModuleCloningVMap`, a giant map that was used to keep the match between old and new global objects and was used in the instruction cloning phase. Also changed the creation of the trampoline for the isolated function, using a new basic block and later purging all the unreachable basic blocks in the `root` function.
-
Andrea Gussoni authored
Moved the definition of `OBJ` before its first use. Moved the definition of `CSV` outside the lifting scope, to avoid erroneous behaviors when invoking the script with the `-s` option.
-
- Nov 15, 2018
-
-
Alessandro Di Federico authored
-
Alessandro Di Federico authored
This commit uses SET, information about canonical values and labels to detect if an indirect function call is targeting an external symbol. The strings used for the name of external symbols are uniqued global variables. This commit also uses this approach for the disassembly of original instructions, which used to be metadata.
-
Alessandro Di Federico authored
-
Alessandro Di Federico authored
So far we've been tracking only base-relative relocations in an ad-hoc fashion. This commit introduces a data structure that can describe the most common relocations, including those for `.got`, `.got.plt`, base-relative and `R_*_COPY`. A label describes a range of the binary. A label can be generated from a symbol (basically assigning a name to range of the binary) or from a relocation, describing the content of a certain range. This commit generates labels from symbols and relocations, including MIPS implicit relocations. This commit also introduces canonical values. A register can have a canonical value, i.e., a value that register will assume when the analyzed module is being run. This is typically useful for the value of the global pointer, which is different from one module to another but, within a module, is stable. This commit registers the canonical value of `gp` (in MIPS), if available.
-
- Nov 14, 2018
-
-
Alessandro Di Federico authored
-
Alessandro Di Federico authored
`segments_count` provides a way for the runtime to know how many executable segments the original program had. This is used to implement the `is_executable` function. While the `segment_boundaries` contained only the executable segments, `segments_count` included non-executable segments too, leading to an out-of-bound read which sometimes led to a spurious `Unknown PC` error.
-
Alessandro Di Federico authored
-
Alessandro Di Federico authored
-
Alessandro Di Federico authored
-
Alessandro Di Federico authored
-
Alessandro Di Federico authored
-
Alessandro Di Federico authored
While translating the code, it might happen that a basic block needs to be splitted and the second part to be revisited. In such cases, the second part is register for being "purged" at the next iteration. Translation failed if we met such a basic block before purging. This commit correctly handles such situations.
-
Alessandro Di Federico authored
In certain cases we find more than one instruction storing the return address to a register. In particular, this happens with a `bltzal` instruction in MIPS, where the return address is stored both in `ra` and `btarget`. For now, do not consider these as actual function calls.
-
Alessandro Di Federico authored
-
Alessandro Di Federico authored
-
Pietro Fezzardi authored
-
Alessandro Di Federico authored
We used to check if the address associated to the `PT_DYNAMIC` program header matched the one of the `.dynamic` section. However, we were not recording it, which is required in case sections headers are missing/corrupt.
-
Alessandro Di Federico authored
-
Alessandro Di Federico authored
-
Alessandro Di Federico authored
In QEMU we should suppress the emission of the debug_insn pseudo-instruction (which delimits the tiny code instructions corresponding to an original input instruction) in case of a delay slot. However, this was not happening due to a wrong `#ifdef`. Since this has now been fixed in QEMU, this commit updates the results of the tests accordingly.
-
Alessandro Di Federico authored
-
Alessandro Di Federico authored
`DebugAnnotationWriter` creates debug information for each instruction in the generated LLVM IR module. Before this commit, it used to clobber any debug information in any function, which lead to wrong debug information on helper functions. This commit ensures that debug information of helper functions are untouched, so that they can be used while debugging.
-
- Nov 13, 2018
-
-
Pietro Fezzardi authored
Updating to LLVM 7 mainly involved the following steps: * Upgrade APIs for folding ConstantExpr. * Upgrade APIs for GraphTraits. * Upgrade APIs for DominatorTreeBase. * Upgrade APIs for BinaryFormat to parse ELFs. * Fix the LLVM Linker to properly link the QEMU helpers. * Disable the new optnone attribute even with optimization -O0. This is necessary to allow SROA to do its job properly. * Upgrade APIs to delete Instructions. * Properly cleaning up orphaned metadata still referring to Instructions that have been destroyed. Recent versions of LLVM are more strict in this respect, and will assert when compiled in debug. * Avoid using LLVM `getGlobalContext` which has been removed from newer versions of LLVM. * Upgrade tests to use the new APIs. * Upgrade APIs for instruction iterators and reverse iterators.
-
- Oct 24, 2018
-
-
Alessandro Di Federico authored
A method in RDA was returning nullptr when a basic block *had* a color and a dangling reference when it did not.
-
- Oct 16, 2018
-
-
Alessandro Di Federico authored
-
Alessandro Di Federico authored
This commit reimplements the (conditional) reaching definitions passes as an instance of a monotone framework. The `ConditionNumberingPass` has also been reworked in the way it exposes its results, but it's otherwise unchanged. A proper unit testing framework is also available to ensure everything works as supposed to.
-
Alessandro Di Federico authored
An `assert` used to check the type of a deleted object. This commit delays the deletion of such object.
-
Alessandro Di Federico authored
-
Alessandro Di Federico authored
In case of a top `BoundedValue` which appears to be used with an inconsistent signedness, simply change the signedness and keep it to top.
-
Alessandro Di Federico authored
This message used to be emitted unconditionally. It is now emitted only as appropriate.
-
Alessandro Di Federico authored
This commit introduces a new logger that prints out the name and reason for each newly registered basic block.
-