mirror of
https://github.com/revng/revng
synced 2026-06-21 14:07:57 +00:00
68 lines
1.5 KiB
C++
68 lines
1.5 KiB
C++
#pragma once
|
|
|
|
//
|
|
// This file is distributed under the MIT License. See LICENSE.md for details.
|
|
//
|
|
|
|
#include "llvm/IR/PassManager.h"
|
|
#include "llvm/Pass.h"
|
|
|
|
#include "revng/Model/Binary.h"
|
|
|
|
inline const char *ModelMetadataName = "revng.model";
|
|
|
|
model::Binary loadModel(const llvm::Module &M);
|
|
|
|
class ModelWrapper {
|
|
private:
|
|
model::Binary TheBinary;
|
|
bool HasChanged = false;
|
|
|
|
public:
|
|
ModelWrapper(model::Binary TheBinary) : TheBinary(TheBinary) {}
|
|
|
|
public:
|
|
const model::Binary &getReadOnlyModel() const { return TheBinary; }
|
|
|
|
model::Binary &getWriteableModel() {
|
|
HasChanged = true;
|
|
return TheBinary;
|
|
}
|
|
|
|
bool hasChanged() const { return HasChanged; }
|
|
|
|
template<typename IRUnitT, typename PreservedAnalysesT, typename InvalidatorT>
|
|
bool invalidate(IRUnitT &, const PreservedAnalysesT &, InvalidatorT &) {
|
|
return false;
|
|
}
|
|
};
|
|
|
|
class LoadModelWrapperPass : public llvm::ImmutablePass {
|
|
public:
|
|
static char ID;
|
|
|
|
private:
|
|
std::optional<ModelWrapper> Wrapper;
|
|
|
|
public:
|
|
LoadModelWrapperPass() : llvm::ImmutablePass(ID) {}
|
|
|
|
public:
|
|
bool doInitialization(llvm::Module &M) override final;
|
|
bool doFinalization(llvm::Module &M) override final;
|
|
|
|
public:
|
|
ModelWrapper &get() { return *Wrapper; }
|
|
};
|
|
|
|
class LoadModelAnalysis : public llvm::AnalysisInfoMixin<LoadModelAnalysis> {
|
|
friend llvm::AnalysisInfoMixin<LoadModelAnalysis>;
|
|
static llvm::AnalysisKey Key;
|
|
|
|
public:
|
|
using Result = ModelWrapper;
|
|
|
|
Result run(llvm::Module &M, llvm::ModuleAnalysisManager &);
|
|
Result run(llvm::Function &F, llvm::FunctionAnalysisManager &);
|
|
};
|