mirror of
https://github.com/revng/revng
synced 2026-06-21 14:07:57 +00:00
Ensure no duplicate opaque types in headers
This commit is contained in:
committed by
Pietro Fezzardi
parent
5cd3556765
commit
a83521d337
@@ -10,6 +10,10 @@
|
||||
#include "revng/CliftEmitC/Configuration.h"
|
||||
#include "revng/PTML/CTokenEmitter.h"
|
||||
|
||||
namespace model {
|
||||
class Binary;
|
||||
}
|
||||
|
||||
void emitCommonIncludes(ptml::CTokenEmitter &Tokens,
|
||||
const CDataModel &DataModel);
|
||||
|
||||
@@ -23,7 +27,8 @@ void emitTypeAndGlobalHeader(ptml::CTokenEmitter &Tokens,
|
||||
bool DefineOpaqueTypes = true);
|
||||
|
||||
void emitHelperHeader(ptml::CTokenEmitter &Tokens,
|
||||
llvm::ArrayRef<mlir::ModuleOp> Modules);
|
||||
llvm::ArrayRef<mlir::ModuleOp> Modules,
|
||||
const model::Binary &Binary);
|
||||
|
||||
void emitSingleTypeDefinition(ptml::CTokenEmitter &Tokens,
|
||||
const CDataModel &DataModel,
|
||||
|
||||
@@ -100,7 +100,7 @@ using HHBase = clift::impl::CliftEmitHelperHeaderBase<T>;
|
||||
clift::PassPtr<mlir::ModuleOp> clift::createEmitHelperHeaderPass() {
|
||||
static constexpr auto Impl = [](mlir::ModuleOp Module,
|
||||
ptml::CTokenEmitter &Tokens) {
|
||||
emitHelperHeader(Tokens, { Module });
|
||||
emitHelperHeader(Tokens, { Module }, model::Binary{});
|
||||
return true;
|
||||
};
|
||||
|
||||
|
||||
@@ -280,7 +280,8 @@ void emitTypeAndGlobalHeader(ptml::CTokenEmitter &Tokens,
|
||||
}
|
||||
|
||||
void emitHelperHeader(ptml::CTokenEmitter &Tokens,
|
||||
llvm::ArrayRef<mlir::ModuleOp> Modules) {
|
||||
llvm::ArrayRef<mlir::ModuleOp> Modules,
|
||||
const model::Binary &Binary) {
|
||||
revng_check(not Modules.empty());
|
||||
|
||||
const CDataModel &DataModel = clift::getDataModel(Modules.front());
|
||||
@@ -301,7 +302,13 @@ void emitHelperHeader(ptml::CTokenEmitter &Tokens,
|
||||
// This trick is practically a `const_cast`.
|
||||
mlir::MLIRContext &Context = *mlir::ModuleOp(Modules.front()).getContext();
|
||||
|
||||
Emitter.emitOpaqueTypes(Context, Emitter.collectOpaqueByteSizes(Modules));
|
||||
std::set<std::uint64_t> NonModelOpaqueTypes;
|
||||
std::ranges::set_difference(Emitter.collectOpaqueByteSizes(Modules),
|
||||
Binary.collectAllTypeSizes(),
|
||||
std::inserter(NonModelOpaqueTypes,
|
||||
NonModelOpaqueTypes.end()));
|
||||
|
||||
Emitter.emitOpaqueTypes(Context, NonModelOpaqueTypes);
|
||||
}
|
||||
|
||||
void emitSingleTypeDefinition(ptml::CTokenEmitter &Tokens,
|
||||
|
||||
@@ -68,9 +68,10 @@ static void emitTypeAndGlobalHeaderImpl(llvm::raw_ostream &Out,
|
||||
static void
|
||||
emitHelperHeaderImpl(llvm::raw_ostream &Out,
|
||||
std::vector<mlir::ModuleOp> Modules,
|
||||
const model::Binary &Binary,
|
||||
ptml::Tagging Tagging = ptml::Tagging::Enabled) {
|
||||
ptml::CTokenEmitter Tokens(Out, Tagging);
|
||||
emitHelperHeader(Tokens, Modules);
|
||||
emitHelperHeader(Tokens, Modules, Binary);
|
||||
|
||||
Out.flush();
|
||||
}
|
||||
@@ -169,7 +170,9 @@ public:
|
||||
const revng::pipes::CliftFunctionContainer &CliftContainer,
|
||||
HelperHeaderContainer &HeaderFile) {
|
||||
llvm::raw_string_ostream Stream = HeaderFile.asStream();
|
||||
emitHelperHeaderImpl(Stream, { CliftContainer.getModule() });
|
||||
emitHelperHeaderImpl(Stream,
|
||||
{ CliftContainer.getModule() },
|
||||
*revng::getModelFromContext(EC));
|
||||
EC.commitUniqueTarget(HeaderFile);
|
||||
}
|
||||
};
|
||||
@@ -230,6 +233,7 @@ void EmitHelperHeader::run() {
|
||||
|
||||
emitHelperHeaderImpl(*Out,
|
||||
FunctionModules,
|
||||
Binary,
|
||||
Configuration.DisableMarkup ? ptml::Tagging::Disabled :
|
||||
ptml::Tagging::Enabled);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user