Files
revng-revng/lib/Pipes/Pipes.cpp
Kacper Kołodziej 46e9ea0e10 HexDump implementation
HexDumpPipe dumps content of binary file in the similar way as hexdump
tool with addition of PTML markup for instructions addresses.

Continuous parts of binary code are wrapped with <span
data-location-definition=""></span> where data-location-definition
attribute contains Entry/BasicBlock/Instruction addresses in generic
form. <span> tags can be nested if byte(s) belong to many instructions
in code.

At the end of the line every <span> is closed and opened on the next
line again if it still applies to the next byte.

MetaAddress are converted to IntervalMetaAddress (which implements own,
optional-less operator-) and stored in boost::icl::intruval_map. This
map is used to get addresses of instructions to which each byte belongs.
2023-07-31 11:29:41 +02:00

101 lines
3.0 KiB
C++

/// \file Pipes.cpp
/// Contains the definition of the pipe registry.
//
// This file is distributed under the MIT License. See LICENSE.md for details.
//
#include <array>
#include <memory>
#include <string>
#include "llvm/ADT/StringMap.h"
#include "llvm/ADT/StringRef.h"
#include "llvm/ADT/StringSet.h"
#include "llvm/CodeGen/CommandFlags.h"
#include "llvm/IR/Function.h"
#include "llvm/IR/LLVMContext.h"
#include "llvm/IR/Module.h"
#include "llvm/InitializePasses.h"
#include "llvm/Pass.h"
#include "llvm/PassRegistry.h"
#include "llvm/Support/CommandLine.h"
#include "llvm/Support/DynamicLibrary.h"
#include "llvm/Support/Error.h"
#include "llvm/Support/InitLLVM.h"
#include "llvm/Support/MemoryBuffer.h"
#include "llvm/Support/TargetSelect.h"
#include "revng/Model/LoadModelPass.h"
#include "revng/Pipeline/AllRegistries.h"
#include "revng/Pipeline/Context.h"
#include "revng/Pipeline/LLVMKind.h"
#include "revng/Pipeline/Target.h"
#include "revng/Pipes/FileContainer.h"
#include "revng/Pipes/ModelGlobal.h"
#include "revng/Pipes/RootKind.h"
#include "revng/Recompile/CompileModulePipe.h"
#include "revng/Support/Statistics.h"
using namespace std;
using namespace pipeline;
using namespace ::revng::pipes;
using namespace ::revng::kinds;
namespace revng::pipes {
static RegisterLLVMPass<O2Pipe> P2;
static RegisterDefaultConstructibleContainer<BinaryFileContainer> F1;
static RegisterDefaultConstructibleContainer<ObjectFileContainer> F2;
static RegisterDefaultConstructibleContainer<TranslatedFileContainer> F4;
static RegisterDefaultConstructibleContainer<HexDumpFileContainer> F5;
class LLVMPipelineRegistry : public Registry {
public:
void registerContainersAndPipes(Loader &Loader) override {
using namespace llvm;
auto &Ctx = Loader.getContext();
auto MaybeLLVMContext = Ctx.getExternalContext<LLVMContext>("LLVMContext");
if (!MaybeLLVMContext)
return;
auto &PipeContext = Loader.getContext();
auto &LLVMContext = **MaybeLLVMContext;
auto Factory = ContainerFactory::fromGlobal<LLVMContainer>(&PipeContext,
&LLVMContext);
Loader.addContainerFactory("LLVMContainer", std::move(Factory));
}
void registerKinds(KindsRegistry &KindDictionary) override {}
void libraryInitialization() override {
llvm::codegen::RegisterCodeGenFlags Reg;
llvm::InitializeNativeTarget();
llvm::InitializeNativeTargetAsmPrinter();
llvm::InitializeNativeTargetAsmParser();
auto &Registry = *llvm::PassRegistry::getPassRegistry();
llvm::initializeCore(Registry);
llvm::initializeTransformUtils(Registry);
llvm::initializeScalarOpts(Registry);
llvm::initializeVectorization(Registry);
llvm::initializeInstCombine(Registry);
llvm::initializeIPO(Registry);
llvm::initializeAnalysis(Registry);
llvm::initializeCodeGen(Registry);
llvm::initializeGlobalISel(Registry);
llvm::initializeTarget(Registry);
}
~LLVMPipelineRegistry() override = default;
};
static LLVMPipelineRegistry Registry;
} // namespace revng::pipes