mirror of
https://github.com/revng/revng
synced 2026-06-21 14:07:57 +00:00
b1feb5b989
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.
58 lines
1.8 KiB
C++
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())) {
|
|
}
|
|
}
|