Ensure no duplicate opaque types in headers

This commit is contained in:
Ivan Krysak
2026-05-28 14:29:50 +00:00
committed by Pietro Fezzardi
parent 5cd3556765
commit a83521d337
4 changed files with 22 additions and 6 deletions
+6 -1
View File
@@ -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,
+1 -1
View File
@@ -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;
};
+9 -2
View File
@@ -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,
+6 -2
View File
@@ -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);
}