Files
Alessandro Di Federico 1429b526ab Introduce libtcg
This commit drops libptc in favor of its new form libtcg.

It brings several improvements, among which:

* The QEMU version we work on has been upgraded.
* CPUStateAccessAnalysis has been reimplemented in a way that makes it
  easier to debug and solves some limitations (e.g., tracking leaking
  pointers).
* Identification of pieces of the CPU state that are read by each helper
  and fixing access to the CPU state is now performed at build-time.
* We no longer mmap the code we need to translate, dropping all the
  issues related to code that needed to be mapped where something is
  already present.
* We now have two distinct flavors of helper modules: the full one and
  the "slim" one. The latter contains the definition only of functions
  we intend to inline. It is used in most of the pipeline, a good thing
  since we spend less time optimizing code we don't really care about.
  The full module is only used on the re-compilation branch of the
  pipeline.
* We no longer split the `cpu_loop` function.
* We change MetaAddress to rely on architectures from `model::` as
  opposed to the LLVM ones.
* We no longer attach debug info to LLVM IR containing the original
  assembly.
* We now verify that the lifted code only contains code we expect.
2025-10-31 17:25:03 +01:00

45 lines
1.1 KiB
C++

/// \file Context.cpp
//
// This file is distributed under the MIT License. See LICENSE.md for details.
//
#include "revng/ADT/RecursiveCoroutine.h"
#include "Context.h"
namespace aua {
RecursiveCoroutine<const Value *>
Context::replaceArguments(const Value &Original,
const llvm::DenseMap<uint64_t, const Value *>
&NewArguments) {
if (auto *Argument = llvm::dyn_cast<ArgumentValue>(&Original)) {
auto It = NewArguments.find(Argument->index());
if (It != NewArguments.end())
rc_return It->second;
else
rc_return &Original;
}
SmallVector<const Value *, 2> NewOperandList;
for (const Value *V : Original.Operands) {
const Value *Replacement = rc_recur replaceArguments(*V, NewArguments);
NewOperandList.push_back(Replacement);
}
if (NewOperandList == Original.Operands) {
rc_return &Original;
} else {
rc_return Original.upcast([this, &NewOperandList](auto &Upcasted)
-> const Value * {
auto Copy = Upcasted;
Copy.Operands = NewOperandList;
return &get(std::move(Copy));
});
}
}
} // namespace aua