mirror of
https://github.com/revng/revng
synced 2026-06-21 14:07:57 +00:00
Add CPUStateAccessAnalysisPass
This commit adds a new analysis pass: `CPUStateAccessAnalysisPass`.
This pass currently performs 4 operations.
1. A preliminary analysis of the call graph, to select the functions
that are reachable from the root function through direct calls. All
the other performed operations are executed on this set of reachable
functions.
2. An interprocedural forward taint analysis, starting from the uses of
`env`, the global variable pointing to the QEMU struct continaint the
CPU. This analysis taints all the instructions that use the address
of `env`, until a load or a store is met. If a load or a store uses a
tainted Value as address it means that it is accessing a CSV at a
given offset (which at this point is still unknown).
3. An interprocedural offset analysis, which deduces the possible
offsets used by every tainted load/store to access the CSV. This
analysis initially works backwards, exploring all the Values that
contribute at the computation of the addresses used by tainted
load/stores. Once it finds all the sources, it starts propagating the
values forward, collecting the offsets computed along the way. It
does this until it reaches the tainted load/stores again. At that
point the analysis knows all the possible offsets used by each
tainted load/store to access the CPU state.
4. The results of the previous steps are used to do 3 things:
* marking all the indirect calls with tainted arguments as illegal;
this is necessary because those calls may access the CPU State in
unpredictable ways;
* attaching metadata to all the call sites to QEMU helpers in the root
function; these metadata provide information on which parts of the
CPU State may be accessed from that call site, which is a
potentially useful information for users of libtinycode that we also
plan to use in other parts of revamb;
* substituting loads, stores, and memcpys to and from the CPU state
with accesses to global variables; this operation effectively
replaces what was previously done by the CorrectCPUStateUsagePass,
which is now obsolete and was removed in this commit.
This commit is contained in:
committed by
Alessandro Di Federico
parent
83992ba4c3
commit
f90f9451fa
+1
-1
@@ -950,7 +950,7 @@ void CodeGenerator::translate(uint64_t VirtualAddress) {
|
||||
legacy::PassManager PM;
|
||||
PM.add(createSROAPass());
|
||||
PM.add(new CpuLoopExitPass(&Variables));
|
||||
PM.add(Variables.createCorrectCPUStateUsagePass());
|
||||
PM.add(Variables.createCPUStateAccessAnalysisPass());
|
||||
PM.add(createDeadCodeEliminationPass());
|
||||
PM.run(*TheModule);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user