Files
revng-revng/lib/Recompile/OriginalAssemblyAnnotationWriter.cpp
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

58 lines
1.8 KiB
C++

/// \file OriginalAssemblyAnnotationWriter.cpp
/// This file handles debugging information generation.
//
// This file is distributed under the MIT License. See LICENSE.md for details.
//
#include "llvm/IR/BasicBlock.h"
#include "llvm/IR/Function.h"
#include "llvm/IR/Instruction.h"
#include "llvm/Support/FormattedStream.h"
#include "revng/ADT/STLExtras.h"
#include "revng/Model/FunctionTags.h"
#include "revng/Recompile/OriginalAssemblyAnnotationWriter.h"
#include "revng/Support/IRHelpers.h"
using namespace llvm;
/// Writes the text contained in the metadata with the specified kind ID to the
/// output stream, unless that metadata is exactly the same as in the previous
/// instruction.
static void writeMetadataIfNew(const Instruction *I,
unsigned MDKind,
formatted_raw_ostream &Output,
StringRef Prefix) {
auto BeginIt = I->getParent()->begin();
StringRef Text = getText(I, MDKind);
if (Text.size()) {
StringRef LastText;
do {
if (I->getIterator() == BeginIt) {
I = nullptr;
} else {
I = I->getPrevNode();
LastText = getText(I, MDKind);
}
} while (I != nullptr && LastText.size() == 0);
if (I == nullptr or LastText != Text) {
std::string TextToSerialize = Text.str();
replaceAll(TextToSerialize, "\n", " ");
Output << Prefix.data() << TextToSerialize << "\n";
}
}
}
using OAAW = OriginalAssemblyAnnotationWriter;
void OAAW::emitInstructionAnnot(const Instruction *I,
formatted_raw_ostream &Output) {
// Ignore whatever is outside the root and the isolated functions
writeMetadataIfNew(I, PTCInstrMDKind, Output, "\n ; ");
if (isRootOrLifted(I->getParent()->getParent())) {
}
}