From ffe721c6a5d96c6145fa58fd2a94280779415d9a Mon Sep 17 00:00:00 2001 From: Daniel Haag <121057143+denialhaag@users.noreply.github.com> Date: Thu, 30 Apr 2026 15:40:53 +0200 Subject: [PATCH 01/21] Improve CMake setup --- cmake/ExternalDependencies.cmake | 43 +++++++++++++++++++++++++++++++- lib/Translation/CMakeLists.txt | 10 +++++--- 2 files changed, 48 insertions(+), 5 deletions(-) diff --git a/cmake/ExternalDependencies.cmake b/cmake/ExternalDependencies.cmake index 52e7e35..504beb6 100644 --- a/cmake/ExternalDependencies.cmake +++ b/cmake/ExternalDependencies.cmake @@ -1,4 +1,5 @@ include(FetchContent) +include(ExternalProject) set(FETCH_PACKAGES "") if(BUILD_JEFF_MLIR_TRANSLATION) @@ -9,7 +10,47 @@ if(BUILD_JEFF_MLIR_TRANSLATION) ) list(APPEND FETCH_PACKAGES jeff) - find_package(CapnProto REQUIRED) + set(CAPNPROTO_PREFIX ${CMAKE_BINARY_DIR}/_deps/capnproto-install) + file(MAKE_DIRECTORY ${CAPNPROTO_PREFIX}/include) + file(MAKE_DIRECTORY ${CAPNPROTO_PREFIX}/lib) + + if(WIN32) + set(CAPNP_IMPORTED_LIB ${CAPNPROTO_PREFIX}/lib/capnp.lib) + set(KJ_IMPORTED_LIB ${CAPNPROTO_PREFIX}/lib/kj.lib) + else() + set(CAPNP_IMPORTED_LIB + ${CAPNPROTO_PREFIX}/lib/${CMAKE_STATIC_LIBRARY_PREFIX}capnp${CMAKE_STATIC_LIBRARY_SUFFIX} + ) + set(KJ_IMPORTED_LIB + ${CAPNPROTO_PREFIX}/lib/${CMAKE_STATIC_LIBRARY_PREFIX}kj${CMAKE_STATIC_LIBRARY_SUFFIX} + ) + endif() + + ExternalProject_Add( + capnproto_external + GIT_REPOSITORY https://github.com/capnproto/capnproto.git + GIT_TAG v1.3.0 + SOURCE_SUBDIR c++ + CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${CAPNPROTO_PREFIX} -DBUILD_TESTING=OFF + -DBUILD_SHARED_LIBS=OFF + STEP_TARGETS install + UPDATE_DISCONNECTED ON + BUILD_BYPRODUCTS ${CAPNP_IMPORTED_LIB} ${KJ_IMPORTED_LIB} + ) + + add_library(capnp_external_lib UNKNOWN IMPORTED) + set_target_properties(capnp_external_lib PROPERTIES IMPORTED_LOCATION "${CAPNP_IMPORTED_LIB}") + add_dependencies(capnp_external_lib capnproto_external) + + add_library(kj_external_lib UNKNOWN IMPORTED) + set_target_properties(kj_external_lib PROPERTIES IMPORTED_LOCATION "${KJ_IMPORTED_LIB}") + add_dependencies(kj_external_lib capnproto_external) + + add_library(CapnProto::capnp INTERFACE IMPORTED) + set_target_properties( + CapnProto::capnp PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${CAPNPROTO_PREFIX}/include" + INTERFACE_LINK_LIBRARIES "capnp_external_lib;kj_external_lib" + ) endif() if(BUILD_JEFF_MLIR_TESTS) diff --git a/lib/Translation/CMakeLists.txt b/lib/Translation/CMakeLists.txt index 8663e6a..a377bc9 100644 --- a/lib/Translation/CMakeLists.txt +++ b/lib/Translation/CMakeLists.txt @@ -9,12 +9,14 @@ add_mlir_library( DISABLE_INSTALL ) -target_compile_definitions(MLIRJeffTranslation PRIVATE ${CAPNP_DEFINITIONS}) +add_dependencies(MLIRJeffTranslation capnproto_external-install) +if(TARGET obj.MLIRJeffTranslation) + add_dependencies(obj.MLIRJeffTranslation capnproto_external-install) +endif() target_include_directories( - MLIRJeffTranslation - PRIVATE ${CAPNP_INCLUDE_DIRS} - PUBLIC ${jeff_SOURCE_DIR}/impl/cpp/src/capnp ${jeff_BINARY_DIR}/impl/cpp/src/capnp + MLIRJeffTranslation PUBLIC ${jeff_SOURCE_DIR}/impl/cpp/src/capnp + ${jeff_BINARY_DIR}/impl/cpp/src/capnp ) target_sources(MLIRJeffTranslation PUBLIC ${jeff_SOURCE_DIR}/impl/cpp/src/capnp/jeff.capnp.c++) From 00a46f894f2c0e0dede5c1c54fc855adf9ea2588 Mon Sep 17 00:00:00 2001 From: Daniel Haag <121057143+denialhaag@users.noreply.github.com> Date: Thu, 30 Apr 2026 15:42:53 +0200 Subject: [PATCH 02/21] Add empty line --- cmake/ExternalDependencies.cmake | 1 + 1 file changed, 1 insertion(+) diff --git a/cmake/ExternalDependencies.cmake b/cmake/ExternalDependencies.cmake index 504beb6..9b49890 100644 --- a/cmake/ExternalDependencies.cmake +++ b/cmake/ExternalDependencies.cmake @@ -1,5 +1,6 @@ include(FetchContent) include(ExternalProject) + set(FETCH_PACKAGES "") if(BUILD_JEFF_MLIR_TRANSLATION) From ac73aba91c1101a571851a472ae2b76a5587e7b7 Mon Sep 17 00:00:00 2001 From: Daniel Haag <121057143+denialhaag@users.noreply.github.com> Date: Thu, 30 Apr 2026 16:53:57 +0200 Subject: [PATCH 03/21] Add functions to serialize to and deserialize from memory buffers --- include/jeff/Translation/Deserialize.hpp | 14 +++++- include/jeff/Translation/Serialize.hpp | 16 ++++++- lib/Translation/Deserialize.cpp | 43 +++++++++++-------- lib/Translation/Serialize.cpp | 9 +++- .../Conversion/test_native_round_trip.cpp | 18 +------- unittests/Translation/test_round_trip.cpp | 18 +------- 6 files changed, 66 insertions(+), 52 deletions(-) diff --git a/include/jeff/Translation/Deserialize.hpp b/include/jeff/Translation/Deserialize.hpp index 92659ae..cdb34a1 100644 --- a/include/jeff/Translation/Deserialize.hpp +++ b/include/jeff/Translation/Deserialize.hpp @@ -1,14 +1,26 @@ #pragma once +#include +#include #include #include #include #include +/** + * @brief Deserialize a flat word array into an MLIR module. + * @param context The MLIR context to use for the deserialization. + * @param data A flat word array containing the serialized module. + * @return An owning reference to the deserialized MLIR module. + */ +mlir::OwningOpRef deserialize(mlir::MLIRContext* context, + kj::ArrayPtr data); + /** * @brief Deserialize a .jeff file into an MLIR module. * @param context The MLIR context to use for the deserialization. * @param path The path to the .jeff file. * @return An owning reference to the deserialized MLIR module. */ -mlir::OwningOpRef deserialize(mlir::MLIRContext* context, llvm::StringRef path); +mlir::OwningOpRef deserializeFromFile(mlir::MLIRContext* context, + llvm::StringRef path); diff --git a/include/jeff/Translation/Serialize.hpp b/include/jeff/Translation/Serialize.hpp index 51ade60..464c3cd 100644 --- a/include/jeff/Translation/Serialize.hpp +++ b/include/jeff/Translation/Serialize.hpp @@ -1,8 +1,22 @@ #pragma once +#include +#include #include #include +/** + * @brief Serialize an MLIR module into a flat word array. + * @param module The MLIR module to serialize. + * @return A flat word array containing the serialized module. + * + * @details + * Known limitations: + * + * - Only one-dimensional tensors with dynamic size are supported. + */ +kj::Array serialize(mlir::ModuleOp module); + /** * @brief Serialize an MLIR module into a .jeff file. * @param module The MLIR module to serialize. @@ -13,4 +27,4 @@ * * - Only one-dimensional tensors with dynamic size are supported. */ -void serialize(mlir::ModuleOp module, llvm::StringRef path); +void serializeToFile(mlir::ModuleOp module, llvm::StringRef path); diff --git a/lib/Translation/Deserialize.cpp b/lib/Translation/Deserialize.cpp index dca8d25..b564813 100644 --- a/lib/Translation/Deserialize.cpp +++ b/lib/Translation/Deserialize.cpp @@ -8,6 +8,7 @@ #include #include #include +#include #include #include #include @@ -1579,25 +1580,12 @@ void deserializeFunction(mlir::ImplicitLocOpBuilder& builder, jeff::Function::Re } // namespace -mlir::OwningOpRef deserialize(mlir::MLIRContext* context, llvm::StringRef path) { +mlir::OwningOpRef deserialize(mlir::MLIRContext* context, + kj::ArrayPtr data) { DeserializationContext ctx; - // Get jeff module from file - llvm::sys::fs::file_t file = 0; - if (llvm::sys::fs::openFileForRead(path, file)) { - llvm::report_fatal_error("Could not open file"); - } - -#ifdef _WIN32 - kj::AutoCloseHandle autoCloseHandle(file); - kj::HandleInputStream input(std::move(autoCloseHandle)); -#else - kj::AutoCloseFd autoCloseFd(file); - kj::FdInputStream input(std::move(autoCloseFd)); -#endif - - capnp::MallocMessageBuilder message; - capnp::readMessageCopy(input, message); + // Get jeff module from data + capnp::FlatArrayMessageReader message(data); jeff::Module::Reader jeffModule = message.getRoot(); // Create MLIR builder @@ -1663,3 +1651,24 @@ mlir::OwningOpRef deserialize(mlir::MLIRContext* context, llvm:: return mlirModule; } + +mlir::OwningOpRef deserializeFromFile(mlir::MLIRContext* context, + llvm::StringRef path) { + // Get jeff module from file + llvm::sys::fs::file_t file = 0; + if (llvm::sys::fs::openFileForRead(path, file)) { + llvm::report_fatal_error("Could not open file"); + } + +#ifdef _WIN32 + kj::AutoCloseHandle autoCloseHandle(file); + kj::HandleInputStream input(std::move(autoCloseHandle)); +#else + kj::AutoCloseFd autoCloseFd(file); + kj::FdInputStream input(std::move(autoCloseFd)); +#endif + + capnp::MallocMessageBuilder message; + capnp::readMessageCopy(input, message); + return deserialize(context, capnp::messageToFlatArray(message)); +} diff --git a/lib/Translation/Serialize.cpp b/lib/Translation/Serialize.cpp index 87b4ad5..89b7c40 100644 --- a/lib/Translation/Serialize.cpp +++ b/lib/Translation/Serialize.cpp @@ -8,6 +8,7 @@ #include #include #include +#include #include #include #include @@ -1719,7 +1720,13 @@ void writeMessage(mlir::ModuleOp module, capnp::MallocMessageBuilder& message) { } // namespace -void serialize(mlir::ModuleOp module, llvm::StringRef path) { +kj::Array serialize(mlir::ModuleOp module) { + capnp::MallocMessageBuilder message; + writeMessage(module, message); + return capnp::messageToFlatArray(message); +} + +void serializeToFile(mlir::ModuleOp module, llvm::StringRef path) { llvm::sys::fs::file_t file = 0; if (llvm::sys::fs::openFileForWrite(path, file)) { llvm::errs() << "Failed to open file: " << path << "\n"; diff --git a/unittests/Conversion/test_native_round_trip.cpp b/unittests/Conversion/test_native_round_trip.cpp index d34f6f2..c5b5dae 100644 --- a/unittests/Conversion/test_native_round_trip.cpp +++ b/unittests/Conversion/test_native_round_trip.cpp @@ -139,7 +139,7 @@ TEST_P(NativeRoundTripTest, RoundTrip) { auto original = readJeffFile(path.string()); // Deserialize jeff module - auto mlirModule = deserialize(&context, path.string()); + auto mlirModule = deserializeFromFile(&context, path.string()); llvm::errs() << "Input MLIR module:\n"; mlirModule->print(llvm::errs()); @@ -162,22 +162,8 @@ TEST_P(NativeRoundTripTest, RoundTrip) { mlirModule->print(llvm::errs()); llvm::errs() << "\n\n"; - // Create temporary file - llvm::SmallString<128> tempFilePath; - if (llvm::sys::fs::createTemporaryFile("test", "jeff", tempFilePath)) { - llvm::report_fatal_error("Could not create temporary file"); - } - // Serialize MLIR module - serialize(*mlirModule, tempFilePath.str()); - - // Load serialized jeff module - auto serialized = readJeffFile(tempFilePath.str()); - - // Remove temporary file - if (llvm::sys::fs::remove(tempFilePath)) { - llvm::errs() << "Failed to remove temporary file\n"; - } + auto serialized = serialize(*mlirModule); // Compare textual representations capnp::FlatArrayMessageReader originalMessage(original); diff --git a/unittests/Translation/test_round_trip.cpp b/unittests/Translation/test_round_trip.cpp index 4cb2395..8b2418a 100644 --- a/unittests/Translation/test_round_trip.cpp +++ b/unittests/Translation/test_round_trip.cpp @@ -97,28 +97,14 @@ TEST_P(RoundTripTest, RoundTrip) { auto original = readJeffFile(path.string()); // Deserialize jeff module - auto mlirModule = deserialize(&context, path.string()); + auto mlirModule = deserializeFromFile(&context, path.string()); llvm::errs() << "Deserialized MLIR module:\n"; mlirModule->print(llvm::errs()); llvm::errs() << "\n\n"; - // Create temporary file - llvm::SmallString<128> tempFilePath; - if (llvm::sys::fs::createTemporaryFile("test", "jeff", tempFilePath)) { - llvm::report_fatal_error("Could not create temporary file"); - } - // Serialize MLIR module - serialize(*mlirModule, tempFilePath.str()); - - // Load serialized jeff module - auto serialized = readJeffFile(tempFilePath.str()); - - // Remove temporary file - if (llvm::sys::fs::remove(tempFilePath)) { - llvm::errs() << "Failed to remove temporary file\n"; - } + auto serialized = serialize(*mlirModule); // Compare textual representations capnp::FlatArrayMessageReader originalMessage(original); From e11e44a85523618c77679aa75b7ef9734c33b0b6 Mon Sep 17 00:00:00 2001 From: Daniel Haag <121057143+denialhaag@users.noreply.github.com> Date: Thu, 30 Apr 2026 17:18:51 +0200 Subject: [PATCH 04/21] Fix linter errors --- include/jeff/Translation/Deserialize.hpp | 2 +- lib/Translation/Deserialize.cpp | 2 +- lib/Translation/Serialize.cpp | 1 + unittests/Conversion/test_native_round_trip.cpp | 1 - unittests/Translation/test_round_trip.cpp | 1 - 5 files changed, 3 insertions(+), 4 deletions(-) diff --git a/include/jeff/Translation/Deserialize.hpp b/include/jeff/Translation/Deserialize.hpp index cdb34a1..c8f9f14 100644 --- a/include/jeff/Translation/Deserialize.hpp +++ b/include/jeff/Translation/Deserialize.hpp @@ -1,7 +1,7 @@ #pragma once #include -#include +#include #include #include #include diff --git a/lib/Translation/Deserialize.cpp b/lib/Translation/Deserialize.cpp index b564813..20f2726 100644 --- a/lib/Translation/Deserialize.cpp +++ b/lib/Translation/Deserialize.cpp @@ -8,7 +8,7 @@ #include #include #include -#include +#include #include #include #include diff --git a/lib/Translation/Serialize.cpp b/lib/Translation/Serialize.cpp index 89b7c40..903a858 100644 --- a/lib/Translation/Serialize.cpp +++ b/lib/Translation/Serialize.cpp @@ -4,6 +4,7 @@ #include "jeff/IR/JeffInterfaces.h" #include "jeff/IR/JeffOps.h" +#include #include #include #include diff --git a/unittests/Conversion/test_native_round_trip.cpp b/unittests/Conversion/test_native_round_trip.cpp index c5b5dae..00ecdd4 100644 --- a/unittests/Conversion/test_native_round_trip.cpp +++ b/unittests/Conversion/test_native_round_trip.cpp @@ -12,7 +12,6 @@ #include #include #include -#include #include #include #include diff --git a/unittests/Translation/test_round_trip.cpp b/unittests/Translation/test_round_trip.cpp index 8b2418a..59ec25d 100644 --- a/unittests/Translation/test_round_trip.cpp +++ b/unittests/Translation/test_round_trip.cpp @@ -10,7 +10,6 @@ #include #include #include -#include #include #include #include From 10c0ef4aa17b1ac5f84cb8c09c4a6379359a0a18 Mon Sep 17 00:00:00 2001 From: Daniel Haag <121057143+denialhaag@users.noreply.github.com> Date: Thu, 30 Apr 2026 17:32:24 +0200 Subject: [PATCH 05/21] Further improve CMake setup --- cmake/ExternalDependencies.cmake | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/cmake/ExternalDependencies.cmake b/cmake/ExternalDependencies.cmake index 9b49890..8480639 100644 --- a/cmake/ExternalDependencies.cmake +++ b/cmake/ExternalDependencies.cmake @@ -48,10 +48,8 @@ if(BUILD_JEFF_MLIR_TRANSLATION) add_dependencies(kj_external_lib capnproto_external) add_library(CapnProto::capnp INTERFACE IMPORTED) - set_target_properties( - CapnProto::capnp PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${CAPNPROTO_PREFIX}/include" - INTERFACE_LINK_LIBRARIES "capnp_external_lib;kj_external_lib" - ) + target_include_directories(CapnProto::capnp INTERFACE ${CAPNPROTO_PREFIX}/include) + target_link_libraries(CapnProto::capnp INTERFACE capnp_external_lib kj_external_lib) endif() if(BUILD_JEFF_MLIR_TESTS) From fb3be2d7d02bdf97e489ff9a76ae3991b64c7f95 Mon Sep 17 00:00:00 2001 From: Daniel Haag <121057143+denialhaag@users.noreply.github.com> Date: Thu, 30 Apr 2026 17:53:23 +0200 Subject: [PATCH 06/21] Make serialize() and deserialize() independent of Cap'n Proto --- include/jeff/Translation/Deserialize.hpp | 12 ++++---- include/jeff/Translation/Serialize.hpp | 12 ++++---- lib/Translation/Deserialize.cpp | 14 +++++---- lib/Translation/Serialize.cpp | 8 +++-- .../Conversion/test_native_round_trip.cpp | 30 ++++++++++++------- unittests/Translation/test_round_trip.cpp | 30 ++++++++++++------- 6 files changed, 65 insertions(+), 41 deletions(-) diff --git a/include/jeff/Translation/Deserialize.hpp b/include/jeff/Translation/Deserialize.hpp index c8f9f14..725448d 100644 --- a/include/jeff/Translation/Deserialize.hpp +++ b/include/jeff/Translation/Deserialize.hpp @@ -1,20 +1,20 @@ #pragma once -#include -#include -#include #include #include #include +#include + +#include /** - * @brief Deserialize a flat word array into an MLIR module. + * @brief Deserialize a byte buffer into an MLIR module. * @param context The MLIR context to use for the deserialization. - * @param data A flat word array containing the serialized module. + * @param data A byte buffer containing the serialized module. * @return An owning reference to the deserialized MLIR module. */ mlir::OwningOpRef deserialize(mlir::MLIRContext* context, - kj::ArrayPtr data); + llvm::ArrayRef data); /** * @brief Deserialize a .jeff file into an MLIR module. diff --git a/include/jeff/Translation/Serialize.hpp b/include/jeff/Translation/Serialize.hpp index 464c3cd..f72af31 100644 --- a/include/jeff/Translation/Serialize.hpp +++ b/include/jeff/Translation/Serialize.hpp @@ -1,21 +1,21 @@ #pragma once -#include -#include -#include #include +#include + +#include /** - * @brief Serialize an MLIR module into a flat word array. + * @brief Serialize an MLIR module into a byte buffer. * @param module The MLIR module to serialize. - * @return A flat word array containing the serialized module. + * @return A byte buffer containing the serialized module. * * @details * Known limitations: * * - Only one-dimensional tensors with dynamic size are supported. */ -kj::Array serialize(mlir::ModuleOp module); +llvm::SmallVector serialize(mlir::ModuleOp module); /** * @brief Serialize an MLIR module into a .jeff file. diff --git a/lib/Translation/Deserialize.cpp b/lib/Translation/Deserialize.cpp index 20f2726..2013b56 100644 --- a/lib/Translation/Deserialize.cpp +++ b/lib/Translation/Deserialize.cpp @@ -1581,11 +1581,14 @@ void deserializeFunction(mlir::ImplicitLocOpBuilder& builder, jeff::Function::Re } // namespace mlir::OwningOpRef deserialize(mlir::MLIRContext* context, - kj::ArrayPtr data) { + llvm::ArrayRef data) { DeserializationContext ctx; + auto words = kj::heapArray(data.size() / sizeof(capnp::word)); + std::memcpy(words.begin(), data.data(), data.size()); + // Get jeff module from data - capnp::FlatArrayMessageReader message(data); + capnp::FlatArrayMessageReader message(words); jeff::Module::Reader jeffModule = message.getRoot(); // Create MLIR builder @@ -1668,7 +1671,8 @@ mlir::OwningOpRef deserializeFromFile(mlir::MLIRContext* context kj::FdInputStream input(std::move(autoCloseFd)); #endif - capnp::MallocMessageBuilder message; - capnp::readMessageCopy(input, message); - return deserialize(context, capnp::messageToFlatArray(message)); + auto data = input.readAllBytes(); + auto bytes = data.asBytes(); + llvm::ArrayRef buffer(reinterpret_cast(bytes.begin()), bytes.size()); + return deserialize(context, buffer); } diff --git a/lib/Translation/Serialize.cpp b/lib/Translation/Serialize.cpp index 903a858..f1de5d0 100644 --- a/lib/Translation/Serialize.cpp +++ b/lib/Translation/Serialize.cpp @@ -1721,10 +1721,14 @@ void writeMessage(mlir::ModuleOp module, capnp::MallocMessageBuilder& message) { } // namespace -kj::Array serialize(mlir::ModuleOp module) { +llvm::SmallVector serialize(mlir::ModuleOp module) { capnp::MallocMessageBuilder message; writeMessage(module, message); - return capnp::messageToFlatArray(message); + + auto words = capnp::messageToFlatArray(message); + auto bytes = words.asBytes(); + return llvm::SmallVector(reinterpret_cast(bytes.begin()), + reinterpret_cast(bytes.end())); } void serializeToFile(mlir::ModuleOp module, llvm::StringRef path) { diff --git a/unittests/Conversion/test_native_round_trip.cpp b/unittests/Conversion/test_native_round_trip.cpp index 00ecdd4..fdae244 100644 --- a/unittests/Conversion/test_native_round_trip.cpp +++ b/unittests/Conversion/test_native_round_trip.cpp @@ -9,9 +9,10 @@ #include #include #include -#include #include #include +#include +#include #include #include #include @@ -45,7 +46,7 @@ std::ostream& operator<<(std::ostream& os, const NativeRoundTripTestCase& testCa class NativeRoundTripTest : public ::testing::Test, public ::testing::WithParamInterface {}; -kj::Array readJeffFile(llvm::StringRef path) { +llvm::SmallVector readJeffFile(llvm::StringRef path) { llvm::sys::fs::file_t file = 0; if (llvm::sys::fs::openFileForRead(path, file)) { llvm::errs() << "Failed to open file: " << path << "\n"; @@ -60,9 +61,20 @@ kj::Array readJeffFile(llvm::StringRef path) { kj::FdInputStream input(std::move(autoCloseFd)); #endif + auto words = input.readAllBytes(); + auto bytes = words.asBytes(); + return llvm::SmallVector(reinterpret_cast(bytes.begin()), + reinterpret_cast(bytes.end())); +} + +std::string moduleTextFromBytes(llvm::ArrayRef data) { + kj::ArrayPtr bytes(reinterpret_cast(data.data()), data.size()); + kj::ArrayInputStream input(bytes); + capnp::MallocMessageBuilder message; capnp::readMessageCopy(input, message); - return capnp::messageToFlatArray(message); + auto module = message.getRoot(); + return std::string(module.toString().flatten().cStr()); } mlir::LogicalResult convertJeffToNative(mlir::ModuleOp module) { @@ -165,16 +177,12 @@ TEST_P(NativeRoundTripTest, RoundTrip) { auto serialized = serialize(*mlirModule); // Compare textual representations - capnp::FlatArrayMessageReader originalMessage(original); - auto originalModule = originalMessage.getRoot(); - auto originalText = originalModule.toString().flatten(); + auto originalText = moduleTextFromBytes(original); - capnp::FlatArrayMessageReader serializedMessage(serialized); - auto serializedModule = serializedMessage.getRoot(); - auto serializedText = serializedModule.toString().flatten(); + auto serializedText = moduleTextFromBytes(serialized); - llvm::errs() << "Original module:\n" << originalText.cStr() << "\n\n"; - llvm::errs() << "Serialized module:\n" << serializedText.cStr() << "\n\n"; + llvm::errs() << "Original module:\n" << originalText << "\n\n"; + llvm::errs() << "Serialized module:\n" << serializedText << "\n\n"; ASSERT_EQ(originalText, serializedText); } diff --git a/unittests/Translation/test_round_trip.cpp b/unittests/Translation/test_round_trip.cpp index 59ec25d..28c1865 100644 --- a/unittests/Translation/test_round_trip.cpp +++ b/unittests/Translation/test_round_trip.cpp @@ -7,9 +7,10 @@ #include #include #include -#include #include #include +#include +#include #include #include #include @@ -38,7 +39,7 @@ std::ostream& operator<<(std::ostream& os, const RoundTripTestCase& testCase) { class RoundTripTest : public ::testing::Test, public ::testing::WithParamInterface {}; -kj::Array readJeffFile(llvm::StringRef path) { +llvm::SmallVector readJeffFile(llvm::StringRef path) { llvm::sys::fs::file_t file = 0; if (llvm::sys::fs::openFileForRead(path, file)) { llvm::errs() << "Failed to open file: " << path << "\n"; @@ -53,9 +54,20 @@ kj::Array readJeffFile(llvm::StringRef path) { kj::FdInputStream input(std::move(autoCloseFd)); #endif + auto words = input.readAllBytes(); + auto bytes = words.asBytes(); + return llvm::SmallVector(reinterpret_cast(bytes.begin()), + reinterpret_cast(bytes.end())); +} + +std::string moduleTextFromBytes(llvm::ArrayRef data) { + kj::ArrayPtr bytes(reinterpret_cast(data.data()), data.size()); + kj::ArrayInputStream input(bytes); + capnp::MallocMessageBuilder message; capnp::readMessageCopy(input, message); - return capnp::messageToFlatArray(message); + auto module = message.getRoot(); + return std::string(module.toString().flatten().cStr()); } std::vector getTestCases() { @@ -106,16 +118,12 @@ TEST_P(RoundTripTest, RoundTrip) { auto serialized = serialize(*mlirModule); // Compare textual representations - capnp::FlatArrayMessageReader originalMessage(original); - auto originalModule = originalMessage.getRoot(); - auto originalText = originalModule.toString().flatten(); + auto originalText = moduleTextFromBytes(original); - capnp::FlatArrayMessageReader serializedMessage(serialized); - auto serializedModule = serializedMessage.getRoot(); - auto serializedText = serializedModule.toString().flatten(); + auto serializedText = moduleTextFromBytes(serialized); - llvm::errs() << "Original module:\n" << originalText.cStr() << "\n\n"; - llvm::errs() << "Serialized module:\n" << serializedText.cStr() << "\n\n"; + llvm::errs() << "Original module:\n" << originalText << "\n\n"; + llvm::errs() << "Serialized module:\n" << serializedText << "\n\n"; ASSERT_EQ(originalText, serializedText); } From 384c299bd1d3ac832aa25d68ddf0b4e341fc0c65 Mon Sep 17 00:00:00 2001 From: Daniel Haag <121057143+denialhaag@users.noreply.github.com> Date: Thu, 30 Apr 2026 18:14:57 +0200 Subject: [PATCH 07/21] Fix linter errors --- lib/Translation/Deserialize.cpp | 3 ++- lib/Translation/Serialize.cpp | 5 ++--- unittests/Conversion/test_native_round_trip.cpp | 9 +++++---- unittests/Translation/test_round_trip.cpp | 9 +++++---- 4 files changed, 14 insertions(+), 12 deletions(-) diff --git a/lib/Translation/Deserialize.cpp b/lib/Translation/Deserialize.cpp index 2013b56..1cfc6e8 100644 --- a/lib/Translation/Deserialize.cpp +++ b/lib/Translation/Deserialize.cpp @@ -5,9 +5,9 @@ #include #include -#include #include #include +#include #include #include #include @@ -31,6 +31,7 @@ #include #include +#include #include #include #include diff --git a/lib/Translation/Serialize.cpp b/lib/Translation/Serialize.cpp index f1de5d0..863cf13 100644 --- a/lib/Translation/Serialize.cpp +++ b/lib/Translation/Serialize.cpp @@ -4,7 +4,6 @@ #include "jeff/IR/JeffInterfaces.h" #include "jeff/IR/JeffOps.h" -#include #include #include #include @@ -1727,8 +1726,8 @@ llvm::SmallVector serialize(mlir::ModuleOp module) { auto words = capnp::messageToFlatArray(message); auto bytes = words.asBytes(); - return llvm::SmallVector(reinterpret_cast(bytes.begin()), - reinterpret_cast(bytes.end())); + return {reinterpret_cast(bytes.begin()), + reinterpret_cast(bytes.end())}; } void serializeToFile(mlir::ModuleOp module, llvm::StringRef path) { diff --git a/unittests/Conversion/test_native_round_trip.cpp b/unittests/Conversion/test_native_round_trip.cpp index fdae244..4c70900 100644 --- a/unittests/Conversion/test_native_round_trip.cpp +++ b/unittests/Conversion/test_native_round_trip.cpp @@ -4,11 +4,11 @@ #include "jeff/Translation/Deserialize.hpp" #include "jeff/Translation/Serialize.hpp" -#include #include #include #include #include +#include #include #include #include @@ -25,6 +25,7 @@ #include #include +#include #include #include #include @@ -63,8 +64,8 @@ llvm::SmallVector readJeffFile(llvm::StringRef path) { auto words = input.readAllBytes(); auto bytes = words.asBytes(); - return llvm::SmallVector(reinterpret_cast(bytes.begin()), - reinterpret_cast(bytes.end())); + return {reinterpret_cast(bytes.begin()), + reinterpret_cast(bytes.end())}; } std::string moduleTextFromBytes(llvm::ArrayRef data) { @@ -74,7 +75,7 @@ std::string moduleTextFromBytes(llvm::ArrayRef data) { capnp::MallocMessageBuilder message; capnp::readMessageCopy(input, message); auto module = message.getRoot(); - return std::string(module.toString().flatten().cStr()); + return module.toString().flatten().cStr(); } mlir::LogicalResult convertJeffToNative(mlir::ModuleOp module) { diff --git a/unittests/Translation/test_round_trip.cpp b/unittests/Translation/test_round_trip.cpp index 28c1865..d381f4b 100644 --- a/unittests/Translation/test_round_trip.cpp +++ b/unittests/Translation/test_round_trip.cpp @@ -2,11 +2,11 @@ #include "jeff/Translation/Deserialize.hpp" #include "jeff/Translation/Serialize.hpp" -#include #include #include #include #include +#include #include #include #include @@ -18,6 +18,7 @@ #include #include +#include #include #include #include @@ -56,8 +57,8 @@ llvm::SmallVector readJeffFile(llvm::StringRef path) { auto words = input.readAllBytes(); auto bytes = words.asBytes(); - return llvm::SmallVector(reinterpret_cast(bytes.begin()), - reinterpret_cast(bytes.end())); + return {reinterpret_cast(bytes.begin()), + reinterpret_cast(bytes.end())}; } std::string moduleTextFromBytes(llvm::ArrayRef data) { @@ -67,7 +68,7 @@ std::string moduleTextFromBytes(llvm::ArrayRef data) { capnp::MallocMessageBuilder message; capnp::readMessageCopy(input, message); auto module = message.getRoot(); - return std::string(module.toString().flatten().cStr()); + return module.toString().flatten().cStr(); } std::vector getTestCases() { From faba2052e73950bce49c0a6dd57bcf826ba8f47d Mon Sep 17 00:00:00 2001 From: Daniel Haag <121057143+denialhaag@users.noreply.github.com> Date: Thu, 30 Apr 2026 18:18:57 +0200 Subject: [PATCH 08/21] Remove capnp installation from CI --- .github/workflows/lint.yml | 8 -------- .github/workflows/test.yml | 8 -------- 2 files changed, 16 deletions(-) diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index 02a57fa..69e7210 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -23,14 +23,6 @@ jobs: runs-on: ubuntu-24.04 steps: - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - - name: Install capnp - run: | - curl -O https://capnproto.org/capnproto-c++-1.3.0.tar.gz - tar zxf capnproto-c++-1.3.0.tar.gz - cd capnproto-c++-1.3.0 - ./configure - make -j6 check - sudo make install - name: Set up Clang ${{ env.CLANG_VERSION }} env: TEMP_DIR: ${{ runner.temp }} diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 0ee2ff7..fcebec6 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -19,14 +19,6 @@ jobs: runs-on: ubuntu-24.04 steps: - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - - name: Install capnp - run: | - curl -O https://capnproto.org/capnproto-c++-1.3.0.tar.gz - tar zxf capnproto-c++-1.3.0.tar.gz - cd capnproto-c++-1.3.0 - ./configure - make -j6 check - sudo make install - name: Set up MLIR uses: munich-quantum-software/setup-mlir@97da765dfa9dc8e055611ca934fe51bcade8140c # v1.3.0 with: From ba5bbf22e4a48d49461a91fded3235c1d08d8a74 Mon Sep 17 00:00:00 2001 From: Daniel Haag <121057143+denialhaag@users.noreply.github.com> Date: Thu, 30 Apr 2026 18:42:05 +0200 Subject: [PATCH 09/21] Clean up a bit --- lib/Translation/Deserialize.cpp | 9 ++++----- lib/Translation/Serialize.cpp | 2 +- unittests/Conversion/test_native_round_trip.cpp | 1 - unittests/Translation/test_round_trip.cpp | 1 - 4 files changed, 5 insertions(+), 8 deletions(-) diff --git a/lib/Translation/Deserialize.cpp b/lib/Translation/Deserialize.cpp index 1cfc6e8..015f24a 100644 --- a/lib/Translation/Deserialize.cpp +++ b/lib/Translation/Deserialize.cpp @@ -1585,10 +1585,10 @@ mlir::OwningOpRef deserialize(mlir::MLIRContext* context, llvm::ArrayRef data) { DeserializationContext ctx; + // Get jeff module from data auto words = kj::heapArray(data.size() / sizeof(capnp::word)); std::memcpy(words.begin(), data.data(), data.size()); - // Get jeff module from data capnp::FlatArrayMessageReader message(words); jeff::Module::Reader jeffModule = message.getRoot(); @@ -1672,8 +1672,7 @@ mlir::OwningOpRef deserializeFromFile(mlir::MLIRContext* context kj::FdInputStream input(std::move(autoCloseFd)); #endif - auto data = input.readAllBytes(); - auto bytes = data.asBytes(); - llvm::ArrayRef buffer(reinterpret_cast(bytes.begin()), bytes.size()); - return deserialize(context, buffer); + auto bytes = input.readAllBytes(); + llvm::ArrayRef data(reinterpret_cast(bytes.begin()), bytes.size()); + return deserialize(context, data); } diff --git a/lib/Translation/Serialize.cpp b/lib/Translation/Serialize.cpp index 863cf13..0e750b8 100644 --- a/lib/Translation/Serialize.cpp +++ b/lib/Translation/Serialize.cpp @@ -1723,8 +1723,8 @@ void writeMessage(mlir::ModuleOp module, capnp::MallocMessageBuilder& message) { llvm::SmallVector serialize(mlir::ModuleOp module) { capnp::MallocMessageBuilder message; writeMessage(module, message); - auto words = capnp::messageToFlatArray(message); + auto bytes = words.asBytes(); return {reinterpret_cast(bytes.begin()), reinterpret_cast(bytes.end())}; diff --git a/unittests/Conversion/test_native_round_trip.cpp b/unittests/Conversion/test_native_round_trip.cpp index 4c70900..c5fb305 100644 --- a/unittests/Conversion/test_native_round_trip.cpp +++ b/unittests/Conversion/test_native_round_trip.cpp @@ -179,7 +179,6 @@ TEST_P(NativeRoundTripTest, RoundTrip) { // Compare textual representations auto originalText = moduleTextFromBytes(original); - auto serializedText = moduleTextFromBytes(serialized); llvm::errs() << "Original module:\n" << originalText << "\n\n"; diff --git a/unittests/Translation/test_round_trip.cpp b/unittests/Translation/test_round_trip.cpp index d381f4b..8b5e7ee 100644 --- a/unittests/Translation/test_round_trip.cpp +++ b/unittests/Translation/test_round_trip.cpp @@ -120,7 +120,6 @@ TEST_P(RoundTripTest, RoundTrip) { // Compare textual representations auto originalText = moduleTextFromBytes(original); - auto serializedText = moduleTextFromBytes(serialized); llvm::errs() << "Original module:\n" << originalText << "\n\n"; From 10e262d0b88a68caef6ad97800ce6c7648e74e72 Mon Sep 17 00:00:00 2001 From: Daniel Haag <121057143+denialhaag@users.noreply.github.com> Date: Thu, 30 Apr 2026 18:56:10 +0200 Subject: [PATCH 10/21] Make it work on Windows --- lib/Translation/Deserialize.cpp | 19 ++++++------------- lib/Translation/Serialize.cpp | 19 ++++++------------- .../Conversion/test_native_round_trip.cpp | 16 ++++------------ unittests/Translation/test_round_trip.cpp | 16 ++++------------ 4 files changed, 20 insertions(+), 50 deletions(-) diff --git a/lib/Translation/Deserialize.cpp b/lib/Translation/Deserialize.cpp index 015f24a..9373899 100644 --- a/lib/Translation/Deserialize.cpp +++ b/lib/Translation/Deserialize.cpp @@ -16,6 +16,7 @@ #include #include #include +#include #include #include #include @@ -1658,21 +1659,13 @@ mlir::OwningOpRef deserialize(mlir::MLIRContext* context, mlir::OwningOpRef deserializeFromFile(mlir::MLIRContext* context, llvm::StringRef path) { - // Get jeff module from file - llvm::sys::fs::file_t file = 0; - if (llvm::sys::fs::openFileForRead(path, file)) { + auto file = llvm::MemoryBuffer::getFile(path); + if (!file) { + llvm::errs() << "Failed to open file: " << path << "\n"; llvm::report_fatal_error("Could not open file"); } -#ifdef _WIN32 - kj::AutoCloseHandle autoCloseHandle(file); - kj::HandleInputStream input(std::move(autoCloseHandle)); -#else - kj::AutoCloseFd autoCloseFd(file); - kj::FdInputStream input(std::move(autoCloseFd)); -#endif - - auto bytes = input.readAllBytes(); - llvm::ArrayRef data(reinterpret_cast(bytes.begin()), bytes.size()); + auto bytes = file.get()->getBuffer(); + llvm::ArrayRef data(reinterpret_cast(bytes.data()), bytes.size()); return deserialize(context, data); } diff --git a/lib/Translation/Serialize.cpp b/lib/Translation/Serialize.cpp index 0e750b8..eb08dca 100644 --- a/lib/Translation/Serialize.cpp +++ b/lib/Translation/Serialize.cpp @@ -29,6 +29,7 @@ #include #include +#include #include static void checkRank(mlir::RankedTensorType tensorType) { @@ -1731,21 +1732,13 @@ llvm::SmallVector serialize(mlir::ModuleOp module) { } void serializeToFile(mlir::ModuleOp module, llvm::StringRef path) { - llvm::sys::fs::file_t file = 0; - if (llvm::sys::fs::openFileForWrite(path, file)) { + std::error_code ec; + llvm::raw_fd_ostream output(path, ec); + if (ec) { llvm::errs() << "Failed to open file: " << path << "\n"; llvm::report_fatal_error("Could not open file"); } -#ifdef _WIN32 - kj::AutoCloseHandle autoCloseHandle(file); - kj::HandleOutputStream output(std::move(autoCloseHandle)); -#else - kj::AutoCloseFd autoCloseFd(file); - kj::FdOutputStream output(std::move(autoCloseFd)); -#endif - - capnp::MallocMessageBuilder message; - writeMessage(module, message); - capnp::writeMessage(output, message); + auto bytes = serialize(module); + output.write(reinterpret_cast(bytes.data()), bytes.size()); } diff --git a/unittests/Conversion/test_native_round_trip.cpp b/unittests/Conversion/test_native_round_trip.cpp index c5fb305..2f868b6 100644 --- a/unittests/Conversion/test_native_round_trip.cpp +++ b/unittests/Conversion/test_native_round_trip.cpp @@ -15,6 +15,7 @@ #include #include #include +#include #include #include #include @@ -48,22 +49,13 @@ class NativeRoundTripTest : public ::testing::Test, public ::testing::WithParamInterface {}; llvm::SmallVector readJeffFile(llvm::StringRef path) { - llvm::sys::fs::file_t file = 0; - if (llvm::sys::fs::openFileForRead(path, file)) { + auto file = llvm::MemoryBuffer::getFile(path); + if (!file) { llvm::errs() << "Failed to open file: " << path << "\n"; llvm::report_fatal_error("Could not open file"); } -#ifdef _WIN32 - kj::AutoCloseHandle autoCloseHandle(file); - kj::HandleInputStream input(std::move(autoCloseHandle)); -#else - kj::AutoCloseFd autoCloseFd(file); - kj::FdInputStream input(std::move(autoCloseFd)); -#endif - - auto words = input.readAllBytes(); - auto bytes = words.asBytes(); + auto bytes = file.get()->getBuffer(); return {reinterpret_cast(bytes.begin()), reinterpret_cast(bytes.end())}; } diff --git a/unittests/Translation/test_round_trip.cpp b/unittests/Translation/test_round_trip.cpp index 8b5e7ee..dcbed3c 100644 --- a/unittests/Translation/test_round_trip.cpp +++ b/unittests/Translation/test_round_trip.cpp @@ -13,6 +13,7 @@ #include #include #include +#include #include #include #include @@ -41,22 +42,13 @@ class RoundTripTest : public ::testing::Test, public ::testing::WithParamInterface {}; llvm::SmallVector readJeffFile(llvm::StringRef path) { - llvm::sys::fs::file_t file = 0; - if (llvm::sys::fs::openFileForRead(path, file)) { + auto file = llvm::MemoryBuffer::getFile(path); + if (!file) { llvm::errs() << "Failed to open file: " << path << "\n"; llvm::report_fatal_error("Could not open file"); } -#ifdef _WIN32 - kj::AutoCloseHandle autoCloseHandle(file); - kj::HandleInputStream input(std::move(autoCloseHandle)); -#else - kj::AutoCloseFd autoCloseFd(file); - kj::FdInputStream input(std::move(autoCloseFd)); -#endif - - auto words = input.readAllBytes(); - auto bytes = words.asBytes(); + auto bytes = file.get()->getBuffer(); return {reinterpret_cast(bytes.begin()), reinterpret_cast(bytes.end())}; } From dfa736ad75ac9cd1fd1b7e9b8619ffe28fe6e9c1 Mon Sep 17 00:00:00 2001 From: Daniel Haag <121057143+denialhaag@users.noreply.github.com> Date: Thu, 30 Apr 2026 19:04:23 +0200 Subject: [PATCH 11/21] Fix linter errors --- lib/Translation/Deserialize.cpp | 4 ---- lib/Translation/Serialize.cpp | 3 --- unittests/Conversion/test_native_round_trip.cpp | 2 -- unittests/Translation/test_round_trip.cpp | 2 -- 4 files changed, 11 deletions(-) diff --git a/lib/Translation/Deserialize.cpp b/lib/Translation/Deserialize.cpp index 9373899..36f31cb 100644 --- a/lib/Translation/Deserialize.cpp +++ b/lib/Translation/Deserialize.cpp @@ -8,14 +8,11 @@ #include #include #include -#include -#include #include #include #include #include #include -#include #include #include #include @@ -35,7 +32,6 @@ #include #include #include -#include namespace { diff --git a/lib/Translation/Serialize.cpp b/lib/Translation/Serialize.cpp index eb08dca..929a5a8 100644 --- a/lib/Translation/Serialize.cpp +++ b/lib/Translation/Serialize.cpp @@ -9,7 +9,6 @@ #include #include #include -#include #include #include #include @@ -17,7 +16,6 @@ #include #include #include -#include #include #include #include @@ -30,7 +28,6 @@ #include #include #include -#include static void checkRank(mlir::RankedTensorType tensorType) { if (tensorType.getRank() != 1) { diff --git a/unittests/Conversion/test_native_round_trip.cpp b/unittests/Conversion/test_native_round_trip.cpp index 2f868b6..7fb272d 100644 --- a/unittests/Conversion/test_native_round_trip.cpp +++ b/unittests/Conversion/test_native_round_trip.cpp @@ -14,7 +14,6 @@ #include #include #include -#include #include #include #include @@ -30,7 +29,6 @@ #include #include #include -#include #include namespace fs = std::filesystem; diff --git a/unittests/Translation/test_round_trip.cpp b/unittests/Translation/test_round_trip.cpp index dcbed3c..77a3fe6 100644 --- a/unittests/Translation/test_round_trip.cpp +++ b/unittests/Translation/test_round_trip.cpp @@ -12,7 +12,6 @@ #include #include #include -#include #include #include #include @@ -23,7 +22,6 @@ #include #include #include -#include #include namespace fs = std::filesystem; From 781a8e5912693c402145d7c8b891044d07f671da Mon Sep 17 00:00:00 2001 From: burgholzer Date: Mon, 4 May 2026 23:05:15 +0200 Subject: [PATCH 12/21] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20Use=20`llvm::MemoryB?= =?UTF-8?q?uffer`=20for=20serialization=20and=20deserialization=20and=20tr?= =?UTF-8?q?y=20to=20avoid=20copies?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- include/jeff/Translation/Deserialize.hpp | 10 ++--- include/jeff/Translation/Serialize.hpp | 12 +++--- lib/Translation/Deserialize.cpp | 21 +++++----- lib/Translation/Serialize.cpp | 38 ++++++++++++++----- .../Conversion/test_native_round_trip.cpp | 27 +++++++------ unittests/Translation/test_round_trip.cpp | 27 +++++++------ 6 files changed, 77 insertions(+), 58 deletions(-) diff --git a/include/jeff/Translation/Deserialize.hpp b/include/jeff/Translation/Deserialize.hpp index 725448d..e7a6d86 100644 --- a/include/jeff/Translation/Deserialize.hpp +++ b/include/jeff/Translation/Deserialize.hpp @@ -1,20 +1,18 @@ #pragma once +#include #include #include #include -#include - -#include /** - * @brief Deserialize a byte buffer into an MLIR module. + * @brief Deserialize a memory buffer containing a serialized .jeff module into an MLIR module. * @param context The MLIR context to use for the deserialization. - * @param data A byte buffer containing the serialized module. + * @param buffer A memory buffer containing the serialized jeff module. * @return An owning reference to the deserialized MLIR module. */ mlir::OwningOpRef deserialize(mlir::MLIRContext* context, - llvm::ArrayRef data); + llvm::MemoryBufferRef buffer); /** * @brief Deserialize a .jeff file into an MLIR module. diff --git a/include/jeff/Translation/Serialize.hpp b/include/jeff/Translation/Serialize.hpp index f72af31..980ab14 100644 --- a/include/jeff/Translation/Serialize.hpp +++ b/include/jeff/Translation/Serialize.hpp @@ -1,24 +1,24 @@ #pragma once +#include #include -#include -#include +#include /** - * @brief Serialize an MLIR module into a byte buffer. + * @brief Serialize an MLIR module containing a jeff program into a memory buffer. * @param module The MLIR module to serialize. - * @return A byte buffer containing the serialized module. + * @return An owned memory buffer containing the serialized jeff module. * * @details * Known limitations: * * - Only one-dimensional tensors with dynamic size are supported. */ -llvm::SmallVector serialize(mlir::ModuleOp module); +std::unique_ptr serialize(mlir::ModuleOp module); /** - * @brief Serialize an MLIR module into a .jeff file. + * @brief Serialize an MLIR module containing a jeff program into a .jeff file. * @param module The MLIR module to serialize. * @param path The path to the .jeff file. * diff --git a/lib/Translation/Deserialize.cpp b/lib/Translation/Deserialize.cpp index 36f31cb..56a7a52 100644 --- a/lib/Translation/Deserialize.cpp +++ b/lib/Translation/Deserialize.cpp @@ -7,7 +7,6 @@ #include #include #include -#include #include #include #include @@ -29,9 +28,9 @@ #include #include -#include #include #include +#include namespace { @@ -1579,12 +1578,17 @@ void deserializeFunction(mlir::ImplicitLocOpBuilder& builder, jeff::Function::Re } // namespace mlir::OwningOpRef deserialize(mlir::MLIRContext* context, - llvm::ArrayRef data) { + llvm::MemoryBufferRef buffer) { DeserializationContext ctx; - // Get jeff module from data - auto words = kj::heapArray(data.size() / sizeof(capnp::word)); - std::memcpy(words.begin(), data.data(), data.size()); + // Get jeff module from buffer + const auto bytes = buffer.getBuffer(); + assert(bytes.size() % sizeof(capnp::word) == 0 && + "Serialized module size must be a multiple of capnp::word size"); + assert(reinterpret_cast(bytes.data()) % alignof(capnp::word) == 0 && + "Serialized module buffer must be aligned to capnp::word alignment"); + auto words = kj::ArrayPtr(reinterpret_cast(bytes.data()), + bytes.size() / sizeof(capnp::word)); capnp::FlatArrayMessageReader message(words); jeff::Module::Reader jeffModule = message.getRoot(); @@ -1661,7 +1665,6 @@ mlir::OwningOpRef deserializeFromFile(mlir::MLIRContext* context llvm::report_fatal_error("Could not open file"); } - auto bytes = file.get()->getBuffer(); - llvm::ArrayRef data(reinterpret_cast(bytes.data()), bytes.size()); - return deserialize(context, data); + const auto ownedBuffer = std::move(*file); + return deserialize(context, *ownedBuffer); } diff --git a/lib/Translation/Serialize.cpp b/lib/Translation/Serialize.cpp index 929a5a8..f0fbbfb 100644 --- a/lib/Translation/Serialize.cpp +++ b/lib/Translation/Serialize.cpp @@ -27,7 +27,9 @@ #include #include +#include #include +#include static void checkRank(mlir::RankedTensorType tensorType) { if (tensorType.getRank() != 1) { @@ -1716,26 +1718,44 @@ void writeMessage(mlir::ModuleOp module, capnp::MallocMessageBuilder& message) { llvm::cast(module->getAttr("jeff.versionPatch")).getUInt()); } +class CapnpWordMemoryBuffer final : public llvm::MemoryBuffer { + public: + CapnpWordMemoryBuffer(kj::Array words, llvm::StringRef bufferIdentifier) + : words(std::move(words)), bufferIdentifier(bufferIdentifier.str()) { + auto bytes = this->words.asBytes(); + auto* start = reinterpret_cast(bytes.begin()); + init(start, start + bytes.size(), false); + } + + llvm::StringRef getBufferIdentifier() const override { return bufferIdentifier; } + + BufferKind getBufferKind() const override { return MemoryBuffer_Malloc; } + + private: + kj::Array words; + std::string bufferIdentifier; +}; + } // namespace -llvm::SmallVector serialize(mlir::ModuleOp module) { +std::unique_ptr serialize(mlir::ModuleOp module) { capnp::MallocMessageBuilder message; writeMessage(module, message); - auto words = capnp::messageToFlatArray(message); - - auto bytes = words.asBytes(); - return {reinterpret_cast(bytes.begin()), - reinterpret_cast(bytes.end())}; + return std::make_unique(capnp::messageToFlatArray(message), + ""); } void serializeToFile(mlir::ModuleOp module, llvm::StringRef path) { std::error_code ec; llvm::raw_fd_ostream output(path, ec); if (ec) { - llvm::errs() << "Failed to open file: " << path << "\n"; + llvm::errs() << "Failed to open file: " << path << '\n'; llvm::report_fatal_error("Could not open file"); } - auto bytes = serialize(module); - output.write(reinterpret_cast(bytes.data()), bytes.size()); + capnp::MallocMessageBuilder message; + writeMessage(module, message); + auto words = capnp::messageToFlatArray(message); + auto bytes = words.asBytes(); + output.write(reinterpret_cast(bytes.begin()), bytes.size()); } diff --git a/unittests/Conversion/test_native_round_trip.cpp b/unittests/Conversion/test_native_round_trip.cpp index 7fb272d..fb7b676 100644 --- a/unittests/Conversion/test_native_round_trip.cpp +++ b/unittests/Conversion/test_native_round_trip.cpp @@ -12,7 +12,6 @@ #include #include #include -#include #include #include #include @@ -25,10 +24,11 @@ #include #include -#include #include +#include #include #include +#include #include namespace fs = std::filesystem; @@ -46,25 +46,24 @@ std::ostream& operator<<(std::ostream& os, const NativeRoundTripTestCase& testCa class NativeRoundTripTest : public ::testing::Test, public ::testing::WithParamInterface {}; -llvm::SmallVector readJeffFile(llvm::StringRef path) { +std::unique_ptr readJeffFile(llvm::StringRef path) { auto file = llvm::MemoryBuffer::getFile(path); if (!file) { llvm::errs() << "Failed to open file: " << path << "\n"; llvm::report_fatal_error("Could not open file"); } - auto bytes = file.get()->getBuffer(); - return {reinterpret_cast(bytes.begin()), - reinterpret_cast(bytes.end())}; + return std::move(*file); } -std::string moduleTextFromBytes(llvm::ArrayRef data) { - kj::ArrayPtr bytes(reinterpret_cast(data.data()), data.size()); - kj::ArrayInputStream input(bytes); +std::string moduleTextFromBuffer(const llvm::MemoryBufferRef& buffer) { + const auto bytes = buffer.getBuffer(); + const kj::ArrayPtr kjBytes(reinterpret_cast(bytes.data()), bytes.size()); + kj::ArrayInputStream input(kjBytes); capnp::MallocMessageBuilder message; capnp::readMessageCopy(input, message); - auto module = message.getRoot(); + const auto module = message.getRoot(); return module.toString().flatten().cStr(); } @@ -138,7 +137,7 @@ TEST_P(NativeRoundTripTest, RoundTrip) { const auto& path = inputsDir / testCase.filename; // Load original jeff module - auto original = readJeffFile(path.string()); + const auto original = readJeffFile(path.string()); // Deserialize jeff module auto mlirModule = deserializeFromFile(&context, path.string()); @@ -165,11 +164,11 @@ TEST_P(NativeRoundTripTest, RoundTrip) { llvm::errs() << "\n\n"; // Serialize MLIR module - auto serialized = serialize(*mlirModule); + const auto serialized = serialize(*mlirModule); // Compare textual representations - auto originalText = moduleTextFromBytes(original); - auto serializedText = moduleTextFromBytes(serialized); + const auto originalText = moduleTextFromBuffer(*original); + const auto serializedText = moduleTextFromBuffer(*serialized); llvm::errs() << "Original module:\n" << originalText << "\n\n"; llvm::errs() << "Serialized module:\n" << serializedText << "\n\n"; diff --git a/unittests/Translation/test_round_trip.cpp b/unittests/Translation/test_round_trip.cpp index 77a3fe6..e16a73b 100644 --- a/unittests/Translation/test_round_trip.cpp +++ b/unittests/Translation/test_round_trip.cpp @@ -10,7 +10,6 @@ #include #include #include -#include #include #include #include @@ -18,10 +17,11 @@ #include #include -#include #include +#include #include #include +#include #include namespace fs = std::filesystem; @@ -39,25 +39,24 @@ std::ostream& operator<<(std::ostream& os, const RoundTripTestCase& testCase) { class RoundTripTest : public ::testing::Test, public ::testing::WithParamInterface {}; -llvm::SmallVector readJeffFile(llvm::StringRef path) { +std::unique_ptr readJeffFile(llvm::StringRef path) { auto file = llvm::MemoryBuffer::getFile(path); if (!file) { llvm::errs() << "Failed to open file: " << path << "\n"; llvm::report_fatal_error("Could not open file"); } - auto bytes = file.get()->getBuffer(); - return {reinterpret_cast(bytes.begin()), - reinterpret_cast(bytes.end())}; + return std::move(*file); } -std::string moduleTextFromBytes(llvm::ArrayRef data) { - kj::ArrayPtr bytes(reinterpret_cast(data.data()), data.size()); - kj::ArrayInputStream input(bytes); +std::string moduleTextFromBuffer(const llvm::MemoryBufferRef& buffer) { + const auto bytes = buffer.getBuffer(); + const kj::ArrayPtr kjBytes(reinterpret_cast(bytes.data()), bytes.size()); + kj::ArrayInputStream input(kjBytes); capnp::MallocMessageBuilder message; capnp::readMessageCopy(input, message); - auto module = message.getRoot(); + const auto module = message.getRoot(); return module.toString().flatten().cStr(); } @@ -96,7 +95,7 @@ TEST_P(RoundTripTest, RoundTrip) { const auto& path = inputsDir / testCase.filename; // Load original jeff module - auto original = readJeffFile(path.string()); + const auto original = readJeffFile(path.string()); // Deserialize jeff module auto mlirModule = deserializeFromFile(&context, path.string()); @@ -106,11 +105,11 @@ TEST_P(RoundTripTest, RoundTrip) { llvm::errs() << "\n\n"; // Serialize MLIR module - auto serialized = serialize(*mlirModule); + const auto serialized = serialize(*mlirModule); // Compare textual representations - auto originalText = moduleTextFromBytes(original); - auto serializedText = moduleTextFromBytes(serialized); + const auto originalText = moduleTextFromBuffer(*original); + const auto serializedText = moduleTextFromBuffer(*serialized); llvm::errs() << "Original module:\n" << originalText << "\n\n"; llvm::errs() << "Serialized module:\n" << serializedText << "\n\n"; From bdb05bb8c1a1fa5efa77c062fc0632a87cfdf46c Mon Sep 17 00:00:00 2001 From: burgholzer Date: Mon, 4 May 2026 23:15:02 +0200 Subject: [PATCH 13/21] =?UTF-8?q?=F0=9F=8E=A8=20Use=20references=20over=20?= =?UTF-8?q?values=20wherever=20feasible=20in=20deserialization?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/Translation/Deserialize.cpp | 251 ++++++++++++++++---------------- 1 file changed, 122 insertions(+), 129 deletions(-) diff --git a/lib/Translation/Deserialize.cpp b/lib/Translation/Deserialize.cpp index 56a7a52..fcd9e57 100644 --- a/lib/Translation/Deserialize.cpp +++ b/lib/Translation/Deserialize.cpp @@ -110,29 +110,29 @@ struct DeserializationContext { // Qubit operations //===----------------------------------------------------------------------===// -void deserializeQubitAlloc(mlir::ImplicitLocOpBuilder& builder, jeff::Op::Reader operation, +void deserializeQubitAlloc(mlir::ImplicitLocOpBuilder& builder, const jeff::Op::Reader& operation, DeserializationContext& ctx) { auto allocOp = mlir::jeff::QubitAllocOp::create(builder); ctx.setValue(operation.getOutputs()[0], allocOp.getResult()); } -void deserializeQubitFree(mlir::ImplicitLocOpBuilder& builder, jeff::Op::Reader operation, +void deserializeQubitFree(mlir::ImplicitLocOpBuilder& builder, const jeff::Op::Reader& operation, DeserializationContext& ctx) { mlir::jeff::QubitFreeOp::create(builder, ctx.getValue(operation.getInputs()[0])); } -void deserializeQubitFreeZero(mlir::ImplicitLocOpBuilder& builder, jeff::Op::Reader operation, - DeserializationContext& ctx) { +void deserializeQubitFreeZero(mlir::ImplicitLocOpBuilder& builder, + const jeff::Op::Reader& operation, DeserializationContext& ctx) { mlir::jeff::QubitFreeZeroOp::create(builder, ctx.getValue(operation.getInputs()[0])); } -void deserializeMeasure(mlir::ImplicitLocOpBuilder& builder, jeff::Op::Reader operation, +void deserializeMeasure(mlir::ImplicitLocOpBuilder& builder, const jeff::Op::Reader& operation, DeserializationContext& ctx) { auto op = mlir::jeff::QubitMeasureOp::create(builder, ctx.getValue(operation.getInputs()[0])); ctx.setValue(operation.getOutputs()[0], op.getResult()); } -void deserializeMeasureNd(mlir::ImplicitLocOpBuilder& builder, jeff::Op::Reader operation, +void deserializeMeasureNd(mlir::ImplicitLocOpBuilder& builder, const jeff::Op::Reader& operation, DeserializationContext& ctx) { const auto inputs = operation.getInputs(); const auto outputs = operation.getOutputs(); @@ -141,7 +141,7 @@ void deserializeMeasureNd(mlir::ImplicitLocOpBuilder& builder, jeff::Op::Reader ctx.setValue(outputs[1], op.getResult()); } -void deserializeReset(mlir::ImplicitLocOpBuilder& builder, jeff::Op::Reader operation, +void deserializeReset(mlir::ImplicitLocOpBuilder& builder, const jeff::Op::Reader& operation, DeserializationContext& ctx) { const auto inputs = operation.getInputs(); const auto outputs = operation.getOutputs(); @@ -151,7 +151,8 @@ void deserializeReset(mlir::ImplicitLocOpBuilder& builder, jeff::Op::Reader oper template void deserializeOneTargetZeroParameter(mlir::ImplicitLocOpBuilder& builder, - jeff::Op::Reader operation, DeserializationContext& ctx) { + const jeff::Op::Reader& operation, + DeserializationContext& ctx) { const auto inputs = operation.getInputs(); const auto outputs = operation.getOutputs(); const auto gate = operation.getInstruction().getQubit().getGate(); @@ -171,7 +172,8 @@ void deserializeOneTargetZeroParameter(mlir::ImplicitLocOpBuilder& builder, template void deserializeOneTargetOneParameter(mlir::ImplicitLocOpBuilder& builder, - jeff::Op::Reader operation, DeserializationContext& ctx) { + const jeff::Op::Reader& operation, + DeserializationContext& ctx) { const auto inputs = operation.getInputs(); const auto outputs = operation.getOutputs(); const auto gate = operation.getInstruction().getQubit().getGate(); @@ -190,7 +192,7 @@ void deserializeOneTargetOneParameter(mlir::ImplicitLocOpBuilder& builder, } } -void deserializeU(mlir::ImplicitLocOpBuilder& builder, jeff::Op::Reader operation, +void deserializeU(mlir::ImplicitLocOpBuilder& builder, const jeff::Op::Reader& operation, DeserializationContext& ctx) { const auto inputs = operation.getInputs(); const auto outputs = operation.getOutputs(); @@ -212,7 +214,7 @@ void deserializeU(mlir::ImplicitLocOpBuilder& builder, jeff::Op::Reader operatio } } -void deserializeSwap(mlir::ImplicitLocOpBuilder& builder, jeff::Op::Reader operation, +void deserializeSwap(mlir::ImplicitLocOpBuilder& builder, const jeff::Op::Reader& operation, DeserializationContext& ctx) { const auto inputs = operation.getInputs(); const auto outputs = operation.getOutputs(); @@ -232,7 +234,7 @@ void deserializeSwap(mlir::ImplicitLocOpBuilder& builder, jeff::Op::Reader opera } } -void deserializeGPhase(mlir::ImplicitLocOpBuilder& builder, jeff::Op::Reader operation, +void deserializeGPhase(mlir::ImplicitLocOpBuilder& builder, const jeff::Op::Reader& operation, DeserializationContext& ctx) { const auto inputs = operation.getInputs(); const auto outputs = operation.getOutputs(); @@ -251,10 +253,9 @@ void deserializeGPhase(mlir::ImplicitLocOpBuilder& builder, jeff::Op::Reader ope } } -void deserializeWellKnown(mlir::ImplicitLocOpBuilder& builder, jeff::Op::Reader operation, +void deserializeWellKnown(mlir::ImplicitLocOpBuilder& builder, const jeff::Op::Reader& operation, DeserializationContext& ctx) { - const auto wellKnown = operation.getInstruction().getQubit().getGate().getWellKnown(); - switch (wellKnown) { + switch (const auto wellKnown = operation.getInstruction().getQubit().getGate().getWellKnown()) { case jeff::WellKnownGate::X: deserializeOneTargetZeroParameter(builder, operation, ctx); break; @@ -304,7 +305,7 @@ void deserializeWellKnown(mlir::ImplicitLocOpBuilder& builder, jeff::Op::Reader } } -void deserializeCustom(mlir::ImplicitLocOpBuilder& builder, jeff::Op::Reader operation, +void deserializeCustom(mlir::ImplicitLocOpBuilder& builder, const jeff::Op::Reader& operation, DeserializationContext& ctx) { const auto inputs = operation.getInputs(); const auto outputs = operation.getOutputs(); @@ -338,7 +339,7 @@ void deserializeCustom(mlir::ImplicitLocOpBuilder& builder, jeff::Op::Reader ope } } -void deserializePpr(mlir::ImplicitLocOpBuilder& builder, jeff::Op::Reader operation, +void deserializePpr(mlir::ImplicitLocOpBuilder& builder, const jeff::Op::Reader& operation, DeserializationContext& ctx) { const auto inputs = operation.getInputs(); const auto outputs = operation.getOutputs(); @@ -372,10 +373,9 @@ void deserializePpr(mlir::ImplicitLocOpBuilder& builder, jeff::Op::Reader operat } } -void deserializeGate(mlir::ImplicitLocOpBuilder& builder, jeff::Op::Reader operation, +void deserializeGate(mlir::ImplicitLocOpBuilder& builder, const jeff::Op::Reader& operation, DeserializationContext& ctx) { - const auto gate = operation.getInstruction().getQubit().getGate(); - switch (gate.which()) { + switch (const auto gate = operation.getInstruction().getQubit().getGate(); gate.which()) { case jeff::QubitGate::WELL_KNOWN: deserializeWellKnown(builder, operation, ctx); break; @@ -386,16 +386,14 @@ void deserializeGate(mlir::ImplicitLocOpBuilder& builder, jeff::Op::Reader opera deserializePpr(builder, operation, ctx); break; default: - llvm::errs() << "Cannot deserialize gate instruction " << static_cast(gate.which()) - << "\n"; + llvm::errs() << "Cannot deserialize gate instruction " << gate.which() << "\n"; llvm::report_fatal_error("Unknown gate instruction"); } } -void deserializeQubit(mlir::ImplicitLocOpBuilder& builder, jeff::Op::Reader operation, +void deserializeQubit(mlir::ImplicitLocOpBuilder& builder, const jeff::Op::Reader& operation, DeserializationContext& ctx) { - const auto qubit = operation.getInstruction().getQubit(); - switch (qubit.which()) { + switch (const auto qubit = operation.getInstruction().getQubit(); qubit.which()) { case jeff::QubitOp::ALLOC: deserializeQubitAlloc(builder, operation, ctx); break; @@ -418,8 +416,7 @@ void deserializeQubit(mlir::ImplicitLocOpBuilder& builder, jeff::Op::Reader oper deserializeGate(builder, operation, ctx); break; default: - llvm::errs() << "Cannot deserialize qubit instruction " << static_cast(qubit.which()) - << "\n"; + llvm::errs() << "Cannot deserialize qubit instruction " << qubit.which() << "\n"; llvm::report_fatal_error("Unknown qubit instruction"); } } @@ -428,7 +425,7 @@ void deserializeQubit(mlir::ImplicitLocOpBuilder& builder, jeff::Op::Reader oper // Qureg operations //===----------------------------------------------------------------------===// -void deserializeQuregAlloc(mlir::ImplicitLocOpBuilder& builder, jeff::Op::Reader operation, +void deserializeQuregAlloc(mlir::ImplicitLocOpBuilder& builder, const jeff::Op::Reader& operation, DeserializationContext& ctx) { const auto inputs = operation.getInputs(); const auto outputs = operation.getOutputs(); @@ -437,13 +434,13 @@ void deserializeQuregAlloc(mlir::ImplicitLocOpBuilder& builder, jeff::Op::Reader ctx.setValue(outputs[0], allocOp.getResult()); } -void deserializeQuregFreeZero(mlir::ImplicitLocOpBuilder& builder, jeff::Op::Reader operation, - DeserializationContext& ctx) { +void deserializeQuregFreeZero(mlir::ImplicitLocOpBuilder& builder, + const jeff::Op::Reader& operation, DeserializationContext& ctx) { mlir::jeff::QuregFreeZeroOp::create(builder, ctx.getValue(operation.getInputs()[0])); } -void deserializeQuregExtractIndex(mlir::ImplicitLocOpBuilder& builder, jeff::Op::Reader operation, - DeserializationContext& ctx) { +void deserializeQuregExtractIndex(mlir::ImplicitLocOpBuilder& builder, + const jeff::Op::Reader& operation, DeserializationContext& ctx) { const auto inputs = operation.getInputs(); const auto outputs = operation.getOutputs(); auto op = mlir::jeff::QuregExtractIndexOp::create(builder, ctx.getValue(inputs[0]), @@ -452,8 +449,8 @@ void deserializeQuregExtractIndex(mlir::ImplicitLocOpBuilder& builder, jeff::Op: ctx.setValue(outputs[1], op.getOutQubit()); } -void deserializeQuregInsertIndex(mlir::ImplicitLocOpBuilder& builder, jeff::Op::Reader operation, - DeserializationContext& ctx) { +void deserializeQuregInsertIndex(mlir::ImplicitLocOpBuilder& builder, + const jeff::Op::Reader& operation, DeserializationContext& ctx) { const auto inputs = operation.getInputs(); const auto outputs = operation.getOutputs(); auto op = mlir::jeff::QuregInsertIndexOp::create( @@ -461,8 +458,8 @@ void deserializeQuregInsertIndex(mlir::ImplicitLocOpBuilder& builder, jeff::Op:: ctx.setValue(outputs[0], op.getOutQreg()); } -void deserializeQuregExtractSlice(mlir::ImplicitLocOpBuilder& builder, jeff::Op::Reader operation, - DeserializationContext& ctx) { +void deserializeQuregExtractSlice(mlir::ImplicitLocOpBuilder& builder, + const jeff::Op::Reader& operation, DeserializationContext& ctx) { const auto inputs = operation.getInputs(); const auto outputs = operation.getOutputs(); auto outQregType = mlir::jeff::QuregType::get(builder.getContext(), ctx.getLength(outputs[0])); @@ -474,8 +471,8 @@ void deserializeQuregExtractSlice(mlir::ImplicitLocOpBuilder& builder, jeff::Op: ctx.setValue(outputs[1], op.getNewQreg()); } -void deserializeQuregInsertSlice(mlir::ImplicitLocOpBuilder& builder, jeff::Op::Reader operation, - DeserializationContext& ctx) { +void deserializeQuregInsertSlice(mlir::ImplicitLocOpBuilder& builder, + const jeff::Op::Reader& operation, DeserializationContext& ctx) { const auto inputs = operation.getInputs(); const auto outputs = operation.getOutputs(); auto op = mlir::jeff::QuregInsertSliceOp::create( @@ -483,7 +480,7 @@ void deserializeQuregInsertSlice(mlir::ImplicitLocOpBuilder& builder, jeff::Op:: ctx.setValue(outputs[0], op.getOutQreg()); } -void deserializeQuregLength(mlir::ImplicitLocOpBuilder& builder, jeff::Op::Reader operation, +void deserializeQuregLength(mlir::ImplicitLocOpBuilder& builder, const jeff::Op::Reader& operation, DeserializationContext& ctx) { const auto inputs = operation.getInputs(); const auto outputs = operation.getOutputs(); @@ -492,7 +489,7 @@ void deserializeQuregLength(mlir::ImplicitLocOpBuilder& builder, jeff::Op::Reade ctx.setValue(outputs[1], op.getLength()); } -void deserializeQuregSplit(mlir::ImplicitLocOpBuilder& builder, jeff::Op::Reader operation, +void deserializeQuregSplit(mlir::ImplicitLocOpBuilder& builder, const jeff::Op::Reader& operation, DeserializationContext& ctx) { const auto inputs = operation.getInputs(); const auto outputs = operation.getOutputs(); @@ -504,7 +501,7 @@ void deserializeQuregSplit(mlir::ImplicitLocOpBuilder& builder, jeff::Op::Reader ctx.setValue(outputs[1], op.getOutQregTwo()); } -void deserializeQuregJoin(mlir::ImplicitLocOpBuilder& builder, jeff::Op::Reader operation, +void deserializeQuregJoin(mlir::ImplicitLocOpBuilder& builder, const jeff::Op::Reader& operation, DeserializationContext& ctx) { const auto inputs = operation.getInputs(); const auto outputs = operation.getOutputs(); @@ -514,7 +511,7 @@ void deserializeQuregJoin(mlir::ImplicitLocOpBuilder& builder, jeff::Op::Reader ctx.setValue(outputs[0], op.getOutQreg()); } -void deserializeQuregCreate(mlir::ImplicitLocOpBuilder& builder, jeff::Op::Reader operation, +void deserializeQuregCreate(mlir::ImplicitLocOpBuilder& builder, const jeff::Op::Reader& operation, DeserializationContext& ctx) { const auto inputs = operation.getInputs(); const auto outputs = operation.getOutputs(); @@ -528,15 +525,14 @@ void deserializeQuregCreate(mlir::ImplicitLocOpBuilder& builder, jeff::Op::Reade ctx.setValue(outputs[0], op.getOutQreg()); } -void deserializeQuregFree(mlir::ImplicitLocOpBuilder& builder, jeff::Op::Reader operation, +void deserializeQuregFree(mlir::ImplicitLocOpBuilder& builder, const jeff::Op::Reader& operation, DeserializationContext& ctx) { mlir::jeff::QuregFreeOp::create(builder, ctx.getValue(operation.getInputs()[0])); } -void deserializeQureg(mlir::ImplicitLocOpBuilder& builder, jeff::Op::Reader operation, +void deserializeQureg(mlir::ImplicitLocOpBuilder& builder, const jeff::Op::Reader& operation, DeserializationContext& ctx) { - const auto qureg = operation.getInstruction().getQureg(); - switch (qureg.which()) { + switch (const auto qureg = operation.getInstruction().getQureg(); qureg.which()) { case jeff::QuregOp::ALLOC: deserializeQuregAlloc(builder, operation, ctx); break; @@ -571,8 +567,7 @@ void deserializeQureg(mlir::ImplicitLocOpBuilder& builder, jeff::Op::Reader oper deserializeQuregFree(builder, operation, ctx); break; default: - llvm::errs() << "Cannot deserialize qureg instruction " << static_cast(qureg.which()) - << "\n"; + llvm::errs() << "Cannot deserialize qureg instruction " << qureg.which() << "\n"; llvm::report_fatal_error("Unknown qureg instruction"); } } @@ -583,7 +578,8 @@ void deserializeQureg(mlir::ImplicitLocOpBuilder& builder, jeff::Op::Reader oper #define DESERIALIZE_INT_CONST(BIT_WIDTH) \ void deserializeIntConst##BIT_WIDTH(mlir::ImplicitLocOpBuilder& builder, \ - jeff::Op::Reader operation, DeserializationContext& ctx) { \ + const jeff::Op::Reader& operation, \ + DeserializationContext& ctx) { \ const auto value = operation.getInstruction().getInt().getConst##BIT_WIDTH(); \ auto intType = builder.getI##BIT_WIDTH##Type(); \ auto intAttr = mlir::IntegerAttr::get(intType, value); \ @@ -599,7 +595,7 @@ DESERIALIZE_INT_CONST(64) #undef DESERIALIZE_INT_CONST -void deserializeIntUnaryOp(mlir::ImplicitLocOpBuilder& builder, jeff::Op::Reader operation, +void deserializeIntUnaryOp(mlir::ImplicitLocOpBuilder& builder, const jeff::Op::Reader& operation, mlir::jeff::IntUnaryOperation unaryOperation, DeserializationContext& ctx) { const auto inputs = operation.getInputs(); @@ -608,7 +604,7 @@ void deserializeIntUnaryOp(mlir::ImplicitLocOpBuilder& builder, jeff::Op::Reader ctx.setValue(outputs[0], op.getB()); } -void deserializeIntBinaryOp(mlir::ImplicitLocOpBuilder& builder, jeff::Op::Reader operation, +void deserializeIntBinaryOp(mlir::ImplicitLocOpBuilder& builder, const jeff::Op::Reader& operation, mlir::jeff::IntBinaryOperation binaryOperation, DeserializationContext& ctx) { const auto inputs = operation.getInputs(); @@ -618,7 +614,8 @@ void deserializeIntBinaryOp(mlir::ImplicitLocOpBuilder& builder, jeff::Op::Reade ctx.setValue(outputs[0], op.getC()); } -void deserializeIntComparisonOp(mlir::ImplicitLocOpBuilder& builder, jeff::Op::Reader operation, +void deserializeIntComparisonOp(mlir::ImplicitLocOpBuilder& builder, + const jeff::Op::Reader& operation, mlir::jeff::IntComparisonOperation comparisonOperation, DeserializationContext& ctx) { const auto inputs = operation.getInputs(); @@ -651,10 +648,9 @@ void deserializeIntComparisonOp(mlir::ImplicitLocOpBuilder& builder, jeff::Op::R mlir::jeff::IntComparisonOperation::_##MLIR_ENUM_SUFFIX, ctx); \ break; -void deserializeInt(mlir::ImplicitLocOpBuilder& builder, jeff::Op::Reader operation, +void deserializeInt(mlir::ImplicitLocOpBuilder& builder, const jeff::Op::Reader& operation, DeserializationContext& ctx) { - const auto intInstr = operation.getInstruction().getInt(); - switch (intInstr.which()) { + switch (const auto intInstr = operation.getInstruction().getInt(); intInstr.which()) { ADD_CONST_CASE(1) ADD_CONST_CASE(8) ADD_CONST_CASE(16) @@ -685,8 +681,7 @@ void deserializeInt(mlir::ImplicitLocOpBuilder& builder, jeff::Op::Reader operat ADD_COMPARISON_CASE(LT_U, ltU) ADD_COMPARISON_CASE(LTE_U, lteU) default: - llvm::errs() << "Cannot deserialize int instruction " << static_cast(intInstr.which()) - << "\n"; + llvm::errs() << "Cannot deserialize int instruction " << intInstr.which() << "\n"; llvm::report_fatal_error("Unknown int instruction"); } } @@ -700,8 +695,8 @@ void deserializeInt(mlir::ImplicitLocOpBuilder& builder, jeff::Op::Reader operat // IntArray operations //===----------------------------------------------------------------------===// -void deserializeIntArrayConst1(mlir::ImplicitLocOpBuilder& builder, jeff::Op::Reader operation, - DeserializationContext& ctx) { +void deserializeIntArrayConst1(mlir::ImplicitLocOpBuilder& builder, + const jeff::Op::Reader& operation, DeserializationContext& ctx) { const auto outputs = operation.getOutputs(); const auto values = operation.getInstruction().getIntArray().getConst1(); llvm::SmallVector inArray; @@ -717,7 +712,7 @@ void deserializeIntArrayConst1(mlir::ImplicitLocOpBuilder& builder, jeff::Op::Re #define DESERIALIZE_INT_ARRAY_CONST(BIT_WIDTH) \ void deserializeIntArrayConst##BIT_WIDTH(mlir::ImplicitLocOpBuilder& builder, \ - jeff::Op::Reader operation, \ + const jeff::Op::Reader& operation, \ DeserializationContext& ctx) { \ const auto outputs = operation.getOutputs(); \ const auto values = operation.getInstruction().getIntArray().getConst##BIT_WIDTH(); \ @@ -741,7 +736,7 @@ DESERIALIZE_INT_ARRAY_CONST(64) #undef DESERIALIZE_INT_ARRAY_CONST -void deserializeIntArrayZero(mlir::ImplicitLocOpBuilder& builder, jeff::Op::Reader operation, +void deserializeIntArrayZero(mlir::ImplicitLocOpBuilder& builder, const jeff::Op::Reader& operation, DeserializationContext& ctx) { const auto inputs = operation.getInputs(); const auto outputs = operation.getOutputs(); @@ -752,8 +747,8 @@ void deserializeIntArrayZero(mlir::ImplicitLocOpBuilder& builder, jeff::Op::Read ctx.setValue(outputs[0], op.getOutArray()); } -void deserializeIntArrayGetIndex(mlir::ImplicitLocOpBuilder& builder, jeff::Op::Reader operation, - DeserializationContext& ctx) { +void deserializeIntArrayGetIndex(mlir::ImplicitLocOpBuilder& builder, + const jeff::Op::Reader& operation, DeserializationContext& ctx) { const auto inputs = operation.getInputs(); const auto outputs = operation.getOutputs(); auto tensorType = ctx.getValue(inputs[0]).getType(); @@ -763,8 +758,8 @@ void deserializeIntArrayGetIndex(mlir::ImplicitLocOpBuilder& builder, jeff::Op:: ctx.setValue(outputs[0], op.getValue()); } -void deserializeIntArraySetIndex(mlir::ImplicitLocOpBuilder& builder, jeff::Op::Reader operation, - DeserializationContext& ctx) { +void deserializeIntArraySetIndex(mlir::ImplicitLocOpBuilder& builder, + const jeff::Op::Reader& operation, DeserializationContext& ctx) { const auto inputs = operation.getInputs(); const auto outputs = operation.getOutputs(); auto tensorType = ctx.getValue(inputs[0]).getType(); @@ -774,16 +769,16 @@ void deserializeIntArraySetIndex(mlir::ImplicitLocOpBuilder& builder, jeff::Op:: ctx.setValue(outputs[0], op.getOutArray()); } -void deserializeIntArrayLength(mlir::ImplicitLocOpBuilder& builder, jeff::Op::Reader operation, - DeserializationContext& ctx) { +void deserializeIntArrayLength(mlir::ImplicitLocOpBuilder& builder, + const jeff::Op::Reader& operation, DeserializationContext& ctx) { const auto inputs = operation.getInputs(); const auto outputs = operation.getOutputs(); auto op = mlir::jeff::IntArrayLengthOp::create(builder, ctx.getValue(inputs[0])); ctx.setValue(outputs[0], op.getLength()); } -void deserializeIntArrayCreate(mlir::ImplicitLocOpBuilder& builder, jeff::Op::Reader operation, - DeserializationContext& ctx) { +void deserializeIntArrayCreate(mlir::ImplicitLocOpBuilder& builder, + const jeff::Op::Reader& operation, DeserializationContext& ctx) { const auto inputs = operation.getInputs(); const auto outputs = operation.getOutputs(); llvm::SmallVector inArray; @@ -797,10 +792,9 @@ void deserializeIntArrayCreate(mlir::ImplicitLocOpBuilder& builder, jeff::Op::Re ctx.setValue(outputs[0], op.getOutArray()); } -void deserializeIntArray(mlir::ImplicitLocOpBuilder& builder, jeff::Op::Reader operation, +void deserializeIntArray(mlir::ImplicitLocOpBuilder& builder, const jeff::Op::Reader& operation, DeserializationContext& ctx) { - const auto intArray = operation.getInstruction().getIntArray(); - switch (intArray.which()) { + switch (const auto intArray = operation.getInstruction().getIntArray(); intArray.which()) { case jeff::IntArrayOp::CONST1: deserializeIntArrayConst1(builder, operation, ctx); break; @@ -832,8 +826,7 @@ void deserializeIntArray(mlir::ImplicitLocOpBuilder& builder, jeff::Op::Reader o deserializeIntArrayCreate(builder, operation, ctx); break; default: - llvm::errs() << "Cannot deserialize int array instruction " - << static_cast(intArray.which()) << "\n"; + llvm::errs() << "Cannot deserialize int array instruction " << intArray.which() << "\n"; llvm::report_fatal_error("Unknown int array instruction"); } } @@ -844,7 +837,7 @@ void deserializeIntArray(mlir::ImplicitLocOpBuilder& builder, jeff::Op::Reader o #define DESERIALIZE_FLOAT_CONST(BIT_WIDTH) \ void deserializeFloatConst##BIT_WIDTH(mlir::ImplicitLocOpBuilder& builder, \ - jeff::Op::Reader operation, \ + const jeff::Op::Reader& operation, \ DeserializationContext& ctx) { \ const auto value = operation.getInstruction().getFloat().getConst##BIT_WIDTH(); \ auto floatType = builder.getF##BIT_WIDTH##Type(); \ @@ -858,7 +851,7 @@ DESERIALIZE_FLOAT_CONST(64) #undef DESERIALIZE_FLOAT_CONST -void deserializeFloatUnaryOp(mlir::ImplicitLocOpBuilder& builder, jeff::Op::Reader operation, +void deserializeFloatUnaryOp(mlir::ImplicitLocOpBuilder& builder, const jeff::Op::Reader& operation, mlir::jeff::FloatUnaryOperation unaryOperation, DeserializationContext& ctx) { const auto inputs = operation.getInputs(); @@ -867,7 +860,8 @@ void deserializeFloatUnaryOp(mlir::ImplicitLocOpBuilder& builder, jeff::Op::Read ctx.setValue(outputs[0], op.getB()); } -void deserializeFloatBinaryOp(mlir::ImplicitLocOpBuilder& builder, jeff::Op::Reader operation, +void deserializeFloatBinaryOp(mlir::ImplicitLocOpBuilder& builder, + const jeff::Op::Reader& operation, mlir::jeff::FloatBinaryOperation binaryOperation, DeserializationContext& ctx) { const auto inputs = operation.getInputs(); @@ -877,7 +871,8 @@ void deserializeFloatBinaryOp(mlir::ImplicitLocOpBuilder& builder, jeff::Op::Rea ctx.setValue(outputs[0], op.getC()); } -void deserializeFloatComparisonOp(mlir::ImplicitLocOpBuilder& builder, jeff::Op::Reader operation, +void deserializeFloatComparisonOp(mlir::ImplicitLocOpBuilder& builder, + const jeff::Op::Reader& operation, mlir::jeff::FloatComparisonOperation comparisonOperation, DeserializationContext& ctx) { const auto inputs = operation.getInputs(); @@ -887,7 +882,7 @@ void deserializeFloatComparisonOp(mlir::ImplicitLocOpBuilder& builder, jeff::Op: ctx.setValue(outputs[0], op.getC()); } -void deserializeFloatIsOp(mlir::ImplicitLocOpBuilder& builder, jeff::Op::Reader operation, +void deserializeFloatIsOp(mlir::ImplicitLocOpBuilder& builder, const jeff::Op::Reader& operation, mlir::jeff::FloatIsOperation isOperation, DeserializationContext& ctx) { const auto inputs = operation.getInputs(); const auto outputs = operation.getOutputs(); @@ -924,10 +919,9 @@ void deserializeFloatIsOp(mlir::ImplicitLocOpBuilder& builder, jeff::Op::Reader mlir::jeff::FloatIsOperation::_is##MLIR_ENUM_SUFFIX, ctx); \ break; -void deserializeFloat(mlir::ImplicitLocOpBuilder& builder, jeff::Op::Reader operation, +void deserializeFloat(mlir::ImplicitLocOpBuilder& builder, const jeff::Op::Reader& operation, DeserializationContext& ctx) { - const auto floatInstr = operation.getInstruction().getFloat(); - switch (floatInstr.which()) { + switch (const auto floatInstr = operation.getInstruction().getFloat(); floatInstr.which()) { ADD_CONST_CASE(32) ADD_CONST_CASE(64) ADD_UNARY_CASE(SQRT, sqrt) @@ -961,8 +955,7 @@ void deserializeFloat(mlir::ImplicitLocOpBuilder& builder, jeff::Op::Reader oper ADD_IS_CASE(IS_NAN, Nan) ADD_IS_CASE(IS_INF, Inf) default: - llvm::errs() << "Cannot deserialize float instruction " - << static_cast(floatInstr.which()) << "\n"; + llvm::errs() << "Cannot deserialize float instruction " << floatInstr.which() << "\n"; llvm::report_fatal_error("Unknown float instruction"); } } @@ -977,8 +970,8 @@ void deserializeFloat(mlir::ImplicitLocOpBuilder& builder, jeff::Op::Reader oper // FloatArray operations //===----------------------------------------------------------------------===// -void deserializeFloatArrayConst32(mlir::ImplicitLocOpBuilder& builder, jeff::Op::Reader operation, - DeserializationContext& ctx) { +void deserializeFloatArrayConst32(mlir::ImplicitLocOpBuilder& builder, + const jeff::Op::Reader& operation, DeserializationContext& ctx) { const auto outputs = operation.getOutputs(); const auto values = operation.getInstruction().getFloatArray().getConst32(); llvm::SmallVector inArray; @@ -993,8 +986,8 @@ void deserializeFloatArrayConst32(mlir::ImplicitLocOpBuilder& builder, jeff::Op: ctx.setValue(outputs[0], op.getOutArray()); } -void deserializeFloatArrayConst64(mlir::ImplicitLocOpBuilder& builder, jeff::Op::Reader operation, - DeserializationContext& ctx) { +void deserializeFloatArrayConst64(mlir::ImplicitLocOpBuilder& builder, + const jeff::Op::Reader& operation, DeserializationContext& ctx) { const auto outputs = operation.getOutputs(); const auto values = operation.getInstruction().getFloatArray().getConst64(); llvm::SmallVector inArray; @@ -1009,8 +1002,8 @@ void deserializeFloatArrayConst64(mlir::ImplicitLocOpBuilder& builder, jeff::Op: ctx.setValue(outputs[0], op.getOutArray()); } -void deserializeFloatArrayZero(mlir::ImplicitLocOpBuilder& builder, jeff::Op::Reader operation, - DeserializationContext& ctx) { +void deserializeFloatArrayZero(mlir::ImplicitLocOpBuilder& builder, + const jeff::Op::Reader& operation, DeserializationContext& ctx) { const auto inputs = operation.getInputs(); const auto outputs = operation.getOutputs(); const auto zero = operation.getInstruction().getFloatArray().getZero(); @@ -1030,8 +1023,8 @@ void deserializeFloatArrayZero(mlir::ImplicitLocOpBuilder& builder, jeff::Op::Re ctx.setValue(outputs[0], op.getOutArray()); } -void deserializeFloatArrayGetIndex(mlir::ImplicitLocOpBuilder& builder, jeff::Op::Reader operation, - DeserializationContext& ctx) { +void deserializeFloatArrayGetIndex(mlir::ImplicitLocOpBuilder& builder, + const jeff::Op::Reader& operation, DeserializationContext& ctx) { const auto inputs = operation.getInputs(); const auto outputs = operation.getOutputs(); auto tensorType = ctx.getValue(inputs[0]).getType(); @@ -1041,8 +1034,8 @@ void deserializeFloatArrayGetIndex(mlir::ImplicitLocOpBuilder& builder, jeff::Op ctx.setValue(outputs[0], op.getValue()); } -void deserializeFloatArraySetIndex(mlir::ImplicitLocOpBuilder& builder, jeff::Op::Reader operation, - DeserializationContext& ctx) { +void deserializeFloatArraySetIndex(mlir::ImplicitLocOpBuilder& builder, + const jeff::Op::Reader& operation, DeserializationContext& ctx) { const auto inputs = operation.getInputs(); const auto outputs = operation.getOutputs(); auto tensorType = ctx.getValue(inputs[0]).getType(); @@ -1052,16 +1045,16 @@ void deserializeFloatArraySetIndex(mlir::ImplicitLocOpBuilder& builder, jeff::Op ctx.setValue(outputs[0], op.getOutArray()); } -void deserializeFloatArrayLength(mlir::ImplicitLocOpBuilder& builder, jeff::Op::Reader operation, - DeserializationContext& ctx) { +void deserializeFloatArrayLength(mlir::ImplicitLocOpBuilder& builder, + const jeff::Op::Reader& operation, DeserializationContext& ctx) { const auto inputs = operation.getInputs(); const auto outputs = operation.getOutputs(); auto op = mlir::jeff::FloatArrayLengthOp::create(builder, ctx.getValue(inputs[0])); ctx.setValue(outputs[0], op.getLength()); } -void deserializeFloatArrayCreate(mlir::ImplicitLocOpBuilder& builder, jeff::Op::Reader operation, - DeserializationContext& ctx) { +void deserializeFloatArrayCreate(mlir::ImplicitLocOpBuilder& builder, + const jeff::Op::Reader& operation, DeserializationContext& ctx) { const auto inputs = operation.getInputs(); const auto outputs = operation.getOutputs(); llvm::SmallVector inArray; @@ -1075,10 +1068,10 @@ void deserializeFloatArrayCreate(mlir::ImplicitLocOpBuilder& builder, jeff::Op:: ctx.setValue(outputs[0], op.getOutArray()); } -void deserializeFloatArray(mlir::ImplicitLocOpBuilder& builder, jeff::Op::Reader operation, +void deserializeFloatArray(mlir::ImplicitLocOpBuilder& builder, const jeff::Op::Reader& operation, DeserializationContext& ctx) { - const auto floatArray = operation.getInstruction().getFloatArray(); - switch (floatArray.which()) { + switch (const auto floatArray = operation.getInstruction().getFloatArray(); + floatArray.which()) { case jeff::FloatArrayOp::CONST32: deserializeFloatArrayConst32(builder, operation, ctx); break; @@ -1101,8 +1094,7 @@ void deserializeFloatArray(mlir::ImplicitLocOpBuilder& builder, jeff::Op::Reader deserializeFloatArrayCreate(builder, operation, ctx); break; default: - llvm::errs() << "Cannot deserialize float array instruction " - << static_cast(floatArray.which()) << "\n"; + llvm::errs() << "Cannot deserialize float array instruction " << floatArray.which() << "\n"; llvm::report_fatal_error("Unknown float array instruction"); } } @@ -1113,10 +1105,10 @@ void deserializeFloatArray(mlir::ImplicitLocOpBuilder& builder, jeff::Op::Reader // Forward declaration void deserializeOperations(mlir::ImplicitLocOpBuilder& builder, - capnp::List::Reader operations, + const capnp::List::Reader& operations, DeserializationContext& ctx); -void deserializeSwitch(mlir::ImplicitLocOpBuilder& builder, jeff::Op::Reader operation, +void deserializeSwitch(mlir::ImplicitLocOpBuilder& builder, const jeff::Op::Reader& operation, DeserializationContext& ctx) { auto loc = builder.getUnknownLoc(); const auto inputs = operation.getInputs(); @@ -1192,7 +1184,7 @@ void deserializeSwitch(mlir::ImplicitLocOpBuilder& builder, jeff::Op::Reader ope } } -void deserializeFor(mlir::ImplicitLocOpBuilder& builder, jeff::Op::Reader operation, +void deserializeFor(mlir::ImplicitLocOpBuilder& builder, const jeff::Op::Reader& operation, DeserializationContext& ctx) { auto loc = builder.getUnknownLoc(); const auto inputs = operation.getInputs(); @@ -1245,7 +1237,7 @@ void deserializeFor(mlir::ImplicitLocOpBuilder& builder, jeff::Op::Reader operat } template -void deserializeWhile(mlir::ImplicitLocOpBuilder& builder, jeff::Op::Reader operation, +void deserializeWhile(mlir::ImplicitLocOpBuilder& builder, const jeff::Op::Reader& operation, JEFF_WHILE_OP_READER_TYPE reader, DeserializationContext& ctx) { auto loc = builder.getUnknownLoc(); const auto inputs = operation.getInputs(); @@ -1313,10 +1305,9 @@ void deserializeWhile(mlir::ImplicitLocOpBuilder& builder, jeff::Op::Reader oper } } -void deserializeScf(mlir::ImplicitLocOpBuilder& builder, jeff::Op::Reader operation, +void deserializeScf(mlir::ImplicitLocOpBuilder& builder, const jeff::Op::Reader& operation, DeserializationContext& ctx) { - const auto scf = operation.getInstruction().getScf(); - switch (scf.which()) { + switch (const auto scf = operation.getInstruction().getScf(); scf.which()) { case jeff::ScfOp::SWITCH: deserializeSwitch(builder, operation, ctx); break; @@ -1332,8 +1323,7 @@ void deserializeScf(mlir::ImplicitLocOpBuilder& builder, jeff::Op::Reader operat builder, operation, scf.getDoWhile(), ctx); break; default: - llvm::errs() << "Cannot deserialize scf instruction " << static_cast(scf.which()) - << "\n"; + llvm::errs() << "Cannot deserialize scf instruction " << scf.which() << "\n"; llvm::report_fatal_error("Unknown scf instruction"); } } @@ -1342,7 +1332,7 @@ void deserializeScf(mlir::ImplicitLocOpBuilder& builder, jeff::Op::Reader operat // Func operations //===----------------------------------------------------------------------===// -void deserializeFunc(mlir::ImplicitLocOpBuilder& builder, jeff::Op::Reader operation, +void deserializeFunc(mlir::ImplicitLocOpBuilder& builder, const jeff::Op::Reader& operation, DeserializationContext& ctx) { const auto inputs = operation.getInputs(); const auto outputs = operation.getOutputs(); @@ -1363,7 +1353,8 @@ void deserializeFunc(mlir::ImplicitLocOpBuilder& builder, jeff::Op::Reader opera // Types //===----------------------------------------------------------------------===// -mlir::Type deserializeQuregType(mlir::ImplicitLocOpBuilder& builder, jeff::Type::Reader type) { +mlir::Type deserializeQuregType(const mlir::ImplicitLocOpBuilder& builder, + const jeff::Type::Reader& type) { const auto quregType = type.getQureg(); auto length = mlir::ShapedType::kDynamic; if (quregType.isStatic()) { @@ -1372,7 +1363,7 @@ mlir::Type deserializeQuregType(mlir::ImplicitLocOpBuilder& builder, jeff::Type: return mlir::jeff::QuregType::get(builder.getContext(), length); } -mlir::Type deserializeIntType(mlir::ImplicitLocOpBuilder& builder, jeff::Type::Reader type) { +mlir::Type deserializeIntType(mlir::ImplicitLocOpBuilder& builder, const jeff::Type::Reader& type) { switch (type.getInt()) { case 1: return builder.getI1Type(); @@ -1390,7 +1381,8 @@ mlir::Type deserializeIntType(mlir::ImplicitLocOpBuilder& builder, jeff::Type::R } } -mlir::Type deserializeIntArrayType(mlir::ImplicitLocOpBuilder& builder, jeff::Type::Reader type) { +mlir::Type deserializeIntArrayType(mlir::ImplicitLocOpBuilder& builder, + const jeff::Type::Reader& type) { const auto intArrayType = type.getIntArray(); auto length = mlir::ShapedType::kDynamic; if (intArrayType.getLength().isStatic()) { @@ -1414,7 +1406,8 @@ mlir::Type deserializeIntArrayType(mlir::ImplicitLocOpBuilder& builder, jeff::Ty } } -mlir::FloatType deserializeFloatType(mlir::ImplicitLocOpBuilder& builder, jeff::Type::Reader type) { +mlir::FloatType deserializeFloatType(mlir::ImplicitLocOpBuilder& builder, + const jeff::Type::Reader& type) { switch (type.getFloat()) { case jeff::FloatPrecision::FLOAT32: return builder.getF32Type(); @@ -1427,7 +1420,8 @@ mlir::FloatType deserializeFloatType(mlir::ImplicitLocOpBuilder& builder, jeff:: } } -mlir::Type deserializeFloatArrayType(mlir::ImplicitLocOpBuilder& builder, jeff::Type::Reader type) { +mlir::Type deserializeFloatArrayType(mlir::ImplicitLocOpBuilder& builder, + const jeff::Type::Reader& type) { const auto floatArrayType = type.getFloatArray(); auto length = mlir::ShapedType::kDynamic; if (floatArrayType.getLength().isStatic()) { @@ -1445,7 +1439,7 @@ mlir::Type deserializeFloatArrayType(mlir::ImplicitLocOpBuilder& builder, jeff:: } } -mlir::Type deserializeType(mlir::ImplicitLocOpBuilder& builder, jeff::Type::Reader type) { +mlir::Type deserializeType(mlir::ImplicitLocOpBuilder& builder, const jeff::Type::Reader& type) { switch (type.which()) { case jeff::Type::QUBIT: return mlir::jeff::QubitType::get(builder.getContext()); @@ -1460,17 +1454,16 @@ mlir::Type deserializeType(mlir::ImplicitLocOpBuilder& builder, jeff::Type::Read case jeff::Type::FLOAT_ARRAY: return deserializeFloatArrayType(builder, type); default: - llvm::errs() << "Cannot deserialize type " << static_cast(type.which()) << "\n"; + llvm::errs() << "Cannot deserialize type " << type.which() << "\n"; llvm::report_fatal_error("Unknown type"); } } -void deserializeOperations(mlir::ImplicitLocOpBuilder& builder, - capnp::List::Reader operations, - DeserializationContext& ctx) { +auto deserializeOperations(mlir::ImplicitLocOpBuilder& builder, + const capnp::List::Reader& operations, + DeserializationContext& ctx) -> void { for (auto operation : operations) { - const auto instruction = operation.getInstruction(); - switch (instruction.which()) { + switch (const auto instruction = operation.getInstruction(); instruction.which()) { case jeff::Op::Instruction::QUBIT: deserializeQubit(builder, operation, ctx); break; @@ -1496,15 +1489,15 @@ void deserializeOperations(mlir::ImplicitLocOpBuilder& builder, deserializeFunc(builder, operation, ctx); break; default: - llvm::errs() << "Cannot deserialize instruction " - << static_cast(instruction.which()) << "\n"; + llvm::errs() << "Cannot deserialize instruction " << instruction.which() << "\n"; llvm::report_fatal_error("Unknown instruction"); } } } -void deserializeFunction(mlir::ImplicitLocOpBuilder& builder, jeff::Function::Reader function, - uint16_t functionId, DeserializationContext& ctx) { +void deserializeFunction(mlir::ImplicitLocOpBuilder& builder, + const jeff::Function::Reader& function, uint16_t functionId, + DeserializationContext& ctx) { ctx.values.clear(); // Get function definition From d278969af94f26fdd36dcd7c1e629b86090fb94a Mon Sep 17 00:00:00 2001 From: burgholzer Date: Tue, 5 May 2026 00:08:53 +0200 Subject: [PATCH 14/21] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20Simplify=20capnproto?= =?UTF-8?q?=20dependency=20management?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CMakeLists.txt | 5 ++++ cmake/CTestCustom.cmake.in | 3 +++ cmake/ExternalDependencies.cmake | 40 +++----------------------------- lib/Translation/CMakeLists.txt | 7 ++---- 4 files changed, 13 insertions(+), 42 deletions(-) create mode 100644 cmake/CTestCustom.cmake.in diff --git a/CMakeLists.txt b/CMakeLists.txt index 977e695..9cbfe21 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -24,6 +24,11 @@ set(CMAKE_EXPORT_COMPILE_COMMANDS CACHE BOOL "Export compile commands" FORCE ) +configure_file( + ${CMAKE_CURRENT_SOURCE_DIR}/cmake/CTestCustom.cmake.in + ${CMAKE_CURRENT_BINARY_DIR}/CTestCustom.cmake COPYONLY +) + include(cmake/SetupMLIR.cmake) include(cmake/ExternalDependencies.cmake) diff --git a/cmake/CTestCustom.cmake.in b/cmake/CTestCustom.cmake.in new file mode 100644 index 0000000..bd3be73 --- /dev/null +++ b/cmake/CTestCustom.cmake.in @@ -0,0 +1,3 @@ +set(CTEST_CUSTOM_TESTS_IGNORE kj-tests-run kj-heavy-tests-run capnp-tests-run capnp-heavy-tests-run + capnp-evolution-tests-run +) diff --git a/cmake/ExternalDependencies.cmake b/cmake/ExternalDependencies.cmake index 8480639..9f67c4f 100644 --- a/cmake/ExternalDependencies.cmake +++ b/cmake/ExternalDependencies.cmake @@ -1,5 +1,4 @@ include(FetchContent) -include(ExternalProject) set(FETCH_PACKAGES "") @@ -11,45 +10,12 @@ if(BUILD_JEFF_MLIR_TRANSLATION) ) list(APPEND FETCH_PACKAGES jeff) - set(CAPNPROTO_PREFIX ${CMAKE_BINARY_DIR}/_deps/capnproto-install) - file(MAKE_DIRECTORY ${CAPNPROTO_PREFIX}/include) - file(MAKE_DIRECTORY ${CAPNPROTO_PREFIX}/lib) - - if(WIN32) - set(CAPNP_IMPORTED_LIB ${CAPNPROTO_PREFIX}/lib/capnp.lib) - set(KJ_IMPORTED_LIB ${CAPNPROTO_PREFIX}/lib/kj.lib) - else() - set(CAPNP_IMPORTED_LIB - ${CAPNPROTO_PREFIX}/lib/${CMAKE_STATIC_LIBRARY_PREFIX}capnp${CMAKE_STATIC_LIBRARY_SUFFIX} - ) - set(KJ_IMPORTED_LIB - ${CAPNPROTO_PREFIX}/lib/${CMAKE_STATIC_LIBRARY_PREFIX}kj${CMAKE_STATIC_LIBRARY_SUFFIX} - ) - endif() - - ExternalProject_Add( - capnproto_external + FetchContent_Declare( + capnproto GIT_REPOSITORY https://github.com/capnproto/capnproto.git GIT_TAG v1.3.0 - SOURCE_SUBDIR c++ - CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${CAPNPROTO_PREFIX} -DBUILD_TESTING=OFF - -DBUILD_SHARED_LIBS=OFF - STEP_TARGETS install - UPDATE_DISCONNECTED ON - BUILD_BYPRODUCTS ${CAPNP_IMPORTED_LIB} ${KJ_IMPORTED_LIB} ) - - add_library(capnp_external_lib UNKNOWN IMPORTED) - set_target_properties(capnp_external_lib PROPERTIES IMPORTED_LOCATION "${CAPNP_IMPORTED_LIB}") - add_dependencies(capnp_external_lib capnproto_external) - - add_library(kj_external_lib UNKNOWN IMPORTED) - set_target_properties(kj_external_lib PROPERTIES IMPORTED_LOCATION "${KJ_IMPORTED_LIB}") - add_dependencies(kj_external_lib capnproto_external) - - add_library(CapnProto::capnp INTERFACE IMPORTED) - target_include_directories(CapnProto::capnp INTERFACE ${CAPNPROTO_PREFIX}/include) - target_link_libraries(CapnProto::capnp INTERFACE capnp_external_lib kj_external_lib) + list(APPEND FETCH_PACKAGES capnproto) endif() if(BUILD_JEFF_MLIR_TESTS) diff --git a/lib/Translation/CMakeLists.txt b/lib/Translation/CMakeLists.txt index a377bc9..6609d84 100644 --- a/lib/Translation/CMakeLists.txt +++ b/lib/Translation/CMakeLists.txt @@ -3,17 +3,14 @@ add_mlir_library( Deserialize.cpp Serialize.cpp LINK_LIBS + PRIVATE MLIRJeff MLIRFuncDialect + PUBLIC CapnProto::capnp DISABLE_INSTALL ) -add_dependencies(MLIRJeffTranslation capnproto_external-install) -if(TARGET obj.MLIRJeffTranslation) - add_dependencies(obj.MLIRJeffTranslation capnproto_external-install) -endif() - target_include_directories( MLIRJeffTranslation PUBLIC ${jeff_SOURCE_DIR}/impl/cpp/src/capnp ${jeff_BINARY_DIR}/impl/cpp/src/capnp From 5164e51a54035b7870b488c95d555bac6a19ed7a Mon Sep 17 00:00:00 2001 From: burgholzer Date: Tue, 5 May 2026 01:31:57 +0200 Subject: [PATCH 15/21] =?UTF-8?q?=F0=9F=A9=B9=20Patch=20capnproto=20direct?= =?UTF-8?q?ly=20to=20disable=20tests?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CMakeLists.txt | 5 ----- cmake/CTestCustom.cmake.in | 3 --- cmake/ExternalDependencies.cmake | 2 ++ cmake/patches/capnproto-disable-tests.patch | 11 +++++++++++ 4 files changed, 13 insertions(+), 8 deletions(-) delete mode 100644 cmake/CTestCustom.cmake.in create mode 100644 cmake/patches/capnproto-disable-tests.patch diff --git a/CMakeLists.txt b/CMakeLists.txt index 9cbfe21..977e695 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -24,11 +24,6 @@ set(CMAKE_EXPORT_COMPILE_COMMANDS CACHE BOOL "Export compile commands" FORCE ) -configure_file( - ${CMAKE_CURRENT_SOURCE_DIR}/cmake/CTestCustom.cmake.in - ${CMAKE_CURRENT_BINARY_DIR}/CTestCustom.cmake COPYONLY -) - include(cmake/SetupMLIR.cmake) include(cmake/ExternalDependencies.cmake) diff --git a/cmake/CTestCustom.cmake.in b/cmake/CTestCustom.cmake.in deleted file mode 100644 index bd3be73..0000000 --- a/cmake/CTestCustom.cmake.in +++ /dev/null @@ -1,3 +0,0 @@ -set(CTEST_CUSTOM_TESTS_IGNORE kj-tests-run kj-heavy-tests-run capnp-tests-run capnp-heavy-tests-run - capnp-evolution-tests-run -) diff --git a/cmake/ExternalDependencies.cmake b/cmake/ExternalDependencies.cmake index 9f67c4f..6eb07f2 100644 --- a/cmake/ExternalDependencies.cmake +++ b/cmake/ExternalDependencies.cmake @@ -14,6 +14,8 @@ if(BUILD_JEFF_MLIR_TRANSLATION) capnproto GIT_REPOSITORY https://github.com/capnproto/capnproto.git GIT_TAG v1.3.0 + PATCH_COMMAND ${CMAKE_COMMAND} -E chdir patch --forward -p1 -i + ${CMAKE_CURRENT_SOURCE_DIR}/cmake/patches/capnproto-disable-tests.patch ) list(APPEND FETCH_PACKAGES capnproto) endif() diff --git a/cmake/patches/capnproto-disable-tests.patch b/cmake/patches/capnproto-disable-tests.patch new file mode 100644 index 0000000..5cea8cb --- /dev/null +++ b/cmake/patches/capnproto-disable-tests.patch @@ -0,0 +1,11 @@ +diff --git a/c++/src/CMakeLists.txt b/c++/src/CMakeLists.txt +--- a/c++/src/CMakeLists.txt ++++ b/c++/src/CMakeLists.txt +@@ -1,5 +1,8 @@ + ++# Disable vendored Cap'n Proto tests when consumed through FetchContent. ++set(BUILD_TESTING OFF) ++ + # Tests ======================================================================== + + if(BUILD_TESTING) From b3b67c284553c3463a20f044328d9ebe624d506b Mon Sep 17 00:00:00 2001 From: burgholzer Date: Tue, 5 May 2026 01:38:32 +0200 Subject: [PATCH 16/21] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20Iterate=20on=20seria?= =?UTF-8?q?lization=20and=20deserialization?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- include/jeff/Translation/Deserialize.hpp | 4 +- include/jeff/Translation/Serialize.hpp | 7 ++- lib/Translation/Deserialize.cpp | 39 +++++++++------- lib/Translation/Serialize.cpp | 44 +++++++------------ .../Conversion/test_native_round_trip.cpp | 38 ++++++++-------- unittests/Translation/test_round_trip.cpp | 39 ++++++++-------- 6 files changed, 83 insertions(+), 88 deletions(-) diff --git a/include/jeff/Translation/Deserialize.hpp b/include/jeff/Translation/Deserialize.hpp index e7a6d86..aa9b4fa 100644 --- a/include/jeff/Translation/Deserialize.hpp +++ b/include/jeff/Translation/Deserialize.hpp @@ -1,6 +1,6 @@ #pragma once -#include +#include #include #include #include @@ -12,7 +12,7 @@ * @return An owning reference to the deserialized MLIR module. */ mlir::OwningOpRef deserialize(mlir::MLIRContext* context, - llvm::MemoryBufferRef buffer); + kj::ArrayPtr buffer); /** * @brief Deserialize a .jeff file into an MLIR module. diff --git a/include/jeff/Translation/Serialize.hpp b/include/jeff/Translation/Serialize.hpp index 980ab14..c9fd014 100644 --- a/include/jeff/Translation/Serialize.hpp +++ b/include/jeff/Translation/Serialize.hpp @@ -1,10 +1,9 @@ #pragma once -#include +#include +#include #include -#include - /** * @brief Serialize an MLIR module containing a jeff program into a memory buffer. * @param module The MLIR module to serialize. @@ -15,7 +14,7 @@ * * - Only one-dimensional tensors with dynamic size are supported. */ -std::unique_ptr serialize(mlir::ModuleOp module); +kj::Array serialize(mlir::ModuleOp module); /** * @brief Serialize an MLIR module containing a jeff program into a .jeff file. diff --git a/lib/Translation/Deserialize.cpp b/lib/Translation/Deserialize.cpp index fcd9e57..3bae037 100644 --- a/lib/Translation/Deserialize.cpp +++ b/lib/Translation/Deserialize.cpp @@ -1568,24 +1568,10 @@ void deserializeFunction(mlir::ImplicitLocOpBuilder& builder, mlir::func::ReturnOp::create(builder, results); } -} // namespace - mlir::OwningOpRef deserialize(mlir::MLIRContext* context, - llvm::MemoryBufferRef buffer) { + const jeff::Module::Reader& jeffModule) { DeserializationContext ctx; - // Get jeff module from buffer - const auto bytes = buffer.getBuffer(); - assert(bytes.size() % sizeof(capnp::word) == 0 && - "Serialized module size must be a multiple of capnp::word size"); - assert(reinterpret_cast(bytes.data()) % alignof(capnp::word) == 0 && - "Serialized module buffer must be aligned to capnp::word alignment"); - auto words = kj::ArrayPtr(reinterpret_cast(bytes.data()), - bytes.size() / sizeof(capnp::word)); - - capnp::FlatArrayMessageReader message(words); - jeff::Module::Reader jeffModule = message.getRoot(); - // Create MLIR builder mlir::ImplicitLocOpBuilder builder(mlir::UnknownLoc::get(context), context); @@ -1649,6 +1635,15 @@ mlir::OwningOpRef deserialize(mlir::MLIRContext* context, return mlirModule; } +} // namespace + +mlir::OwningOpRef deserialize(mlir::MLIRContext* context, + kj::ArrayPtr buffer) { + DeserializationContext ctx; + + capnp::FlatArrayMessageReader message(buffer); + return deserialize(context, message.getRoot()); +} mlir::OwningOpRef deserializeFromFile(mlir::MLIRContext* context, llvm::StringRef path) { @@ -1658,6 +1653,16 @@ mlir::OwningOpRef deserializeFromFile(mlir::MLIRContext* context llvm::report_fatal_error("Could not open file"); } - const auto ownedBuffer = std::move(*file); - return deserialize(context, *ownedBuffer); + // Get jeff module from buffer + const auto bytes = (*file)->getBuffer(); + assert(bytes.size() % sizeof(capnp::word) == 0 && + "Serialized module size must be a multiple of capnp::word size"); + assert(reinterpret_cast(bytes.data()) % alignof(capnp::word) == 0 && + "Serialized module buffer must be aligned to capnp::word alignment"); + const auto words = kj::ArrayPtr(reinterpret_cast(bytes.data()), + bytes.size() / sizeof(capnp::word)); + + capnp::FlatArrayMessageReader message(words); + const jeff::Module::Reader jeffModule = message.getRoot(); + return deserialize(context, jeffModule); } diff --git a/lib/Translation/Serialize.cpp b/lib/Translation/Serialize.cpp index f0fbbfb..25ee747 100644 --- a/lib/Translation/Serialize.cpp +++ b/lib/Translation/Serialize.cpp @@ -4,11 +4,13 @@ #include "jeff/IR/JeffInterfaces.h" #include "jeff/IR/JeffOps.h" +#include #include #include #include #include #include +#include #include #include #include @@ -16,6 +18,7 @@ #include #include #include +#include #include #include #include @@ -1718,44 +1721,29 @@ void writeMessage(mlir::ModuleOp module, capnp::MallocMessageBuilder& message) { llvm::cast(module->getAttr("jeff.versionPatch")).getUInt()); } -class CapnpWordMemoryBuffer final : public llvm::MemoryBuffer { - public: - CapnpWordMemoryBuffer(kj::Array words, llvm::StringRef bufferIdentifier) - : words(std::move(words)), bufferIdentifier(bufferIdentifier.str()) { - auto bytes = this->words.asBytes(); - auto* start = reinterpret_cast(bytes.begin()); - init(start, start + bytes.size(), false); - } - - llvm::StringRef getBufferIdentifier() const override { return bufferIdentifier; } - - BufferKind getBufferKind() const override { return MemoryBuffer_Malloc; } - - private: - kj::Array words; - std::string bufferIdentifier; -}; - } // namespace -std::unique_ptr serialize(mlir::ModuleOp module) { +kj::Array serialize(mlir::ModuleOp module) { capnp::MallocMessageBuilder message; writeMessage(module, message); - return std::make_unique(capnp::messageToFlatArray(message), - ""); + return capnp::messageToFlatArray(message); } void serializeToFile(mlir::ModuleOp module, llvm::StringRef path) { - std::error_code ec; - llvm::raw_fd_ostream output(path, ec); - if (ec) { - llvm::errs() << "Failed to open file: " << path << '\n'; + llvm::sys::fs::file_t file = 0; + if (llvm::sys::fs::openFileForWrite(path, file)) { llvm::report_fatal_error("Could not open file"); } +#ifdef _WIN32 + kj::AutoCloseHandle autoCloseHandle(file); + kj::HandleOutputStream output(std::move(autoCloseHandle)); +#else + kj::AutoCloseFd autoCloseFd(file); + kj::FdOutputStream output(std::move(autoCloseFd)); +#endif + capnp::MallocMessageBuilder message; writeMessage(module, message); - auto words = capnp::messageToFlatArray(message); - auto bytes = words.asBytes(); - output.write(reinterpret_cast(bytes.begin()), bytes.size()); + capnp::writeMessage(output, message); } diff --git a/unittests/Conversion/test_native_round_trip.cpp b/unittests/Conversion/test_native_round_trip.cpp index fb7b676..4161666 100644 --- a/unittests/Conversion/test_native_round_trip.cpp +++ b/unittests/Conversion/test_native_round_trip.cpp @@ -11,9 +11,8 @@ #include #include #include -#include #include -#include +#include #include #include #include @@ -46,20 +45,20 @@ std::ostream& operator<<(std::ostream& os, const NativeRoundTripTestCase& testCa class NativeRoundTripTest : public ::testing::Test, public ::testing::WithParamInterface {}; -std::unique_ptr readJeffFile(llvm::StringRef path) { - auto file = llvm::MemoryBuffer::getFile(path); - if (!file) { +std::string readJeffFileToText(llvm::StringRef path) { + llvm::sys::fs::file_t file = 0; + if (llvm::sys::fs::openFileForRead(path, file)) { llvm::errs() << "Failed to open file: " << path << "\n"; llvm::report_fatal_error("Could not open file"); } - return std::move(*file); -} - -std::string moduleTextFromBuffer(const llvm::MemoryBufferRef& buffer) { - const auto bytes = buffer.getBuffer(); - const kj::ArrayPtr kjBytes(reinterpret_cast(bytes.data()), bytes.size()); - kj::ArrayInputStream input(kjBytes); +#ifdef _WIN32 + kj::AutoCloseHandle autoCloseHandle(file); + kj::HandleInputStream input(std::move(autoCloseHandle)); +#else + kj::AutoCloseFd autoCloseFd(file); + kj::FdInputStream input(std::move(autoCloseFd)); +#endif capnp::MallocMessageBuilder message; capnp::readMessageCopy(input, message); @@ -67,6 +66,12 @@ std::string moduleTextFromBuffer(const llvm::MemoryBufferRef& buffer) { return module.toString().flatten().cStr(); } +std::string moduleTextFromBuffer(const kj::ArrayPtr& buffer) { + capnp::FlatArrayMessageReader message(buffer); + const auto module = message.getRoot(); + return module.toString().flatten().cStr(); +} + mlir::LogicalResult convertJeffToNative(mlir::ModuleOp module) { mlir::PassManager pm(module.getContext()); pm.addPass(mlir::createJeffToNative()); @@ -136,9 +141,6 @@ TEST_P(NativeRoundTripTest, RoundTrip) { const fs::path inputsDir = TEST_INPUTS_DIR; const auto& path = inputsDir / testCase.filename; - // Load original jeff module - const auto original = readJeffFile(path.string()); - // Deserialize jeff module auto mlirModule = deserializeFromFile(&context, path.string()); @@ -164,11 +166,11 @@ TEST_P(NativeRoundTripTest, RoundTrip) { llvm::errs() << "\n\n"; // Serialize MLIR module - const auto serialized = serialize(*mlirModule); + auto serialized = serialize(*mlirModule); // Compare textual representations - const auto originalText = moduleTextFromBuffer(*original); - const auto serializedText = moduleTextFromBuffer(*serialized); + const auto originalText = readJeffFileToText(path.string()); + const auto serializedText = moduleTextFromBuffer(serialized); llvm::errs() << "Original module:\n" << originalText << "\n\n"; llvm::errs() << "Serialized module:\n" << serializedText << "\n\n"; diff --git a/unittests/Translation/test_round_trip.cpp b/unittests/Translation/test_round_trip.cpp index e16a73b..1f92c7c 100644 --- a/unittests/Translation/test_round_trip.cpp +++ b/unittests/Translation/test_round_trip.cpp @@ -9,16 +9,14 @@ #include #include #include -#include #include -#include +#include #include #include #include #include #include -#include #include #include #include @@ -39,20 +37,20 @@ std::ostream& operator<<(std::ostream& os, const RoundTripTestCase& testCase) { class RoundTripTest : public ::testing::Test, public ::testing::WithParamInterface {}; -std::unique_ptr readJeffFile(llvm::StringRef path) { - auto file = llvm::MemoryBuffer::getFile(path); - if (!file) { +std::string readJeffFileToText(llvm::StringRef path) { + llvm::sys::fs::file_t file = 0; + if (llvm::sys::fs::openFileForRead(path, file)) { llvm::errs() << "Failed to open file: " << path << "\n"; llvm::report_fatal_error("Could not open file"); } - return std::move(*file); -} - -std::string moduleTextFromBuffer(const llvm::MemoryBufferRef& buffer) { - const auto bytes = buffer.getBuffer(); - const kj::ArrayPtr kjBytes(reinterpret_cast(bytes.data()), bytes.size()); - kj::ArrayInputStream input(kjBytes); +#ifdef _WIN32 + kj::AutoCloseHandle autoCloseHandle(file); + kj::HandleInputStream input(std::move(autoCloseHandle)); +#else + kj::AutoCloseFd autoCloseFd(file); + kj::FdInputStream input(std::move(autoCloseFd)); +#endif capnp::MallocMessageBuilder message; capnp::readMessageCopy(input, message); @@ -60,6 +58,12 @@ std::string moduleTextFromBuffer(const llvm::MemoryBufferRef& buffer) { return module.toString().flatten().cStr(); } +std::string moduleTextFromBuffer(const kj::ArrayPtr& buffer) { + capnp::FlatArrayMessageReader message(buffer); + const auto module = message.getRoot(); + return module.toString().flatten().cStr(); +} + std::vector getTestCases() { std::vector cases; for (const auto& entry : fs::directory_iterator(TEST_INPUTS_DIR)) { @@ -94,9 +98,6 @@ TEST_P(RoundTripTest, RoundTrip) { const fs::path inputsDir = TEST_INPUTS_DIR; const auto& path = inputsDir / testCase.filename; - // Load original jeff module - const auto original = readJeffFile(path.string()); - // Deserialize jeff module auto mlirModule = deserializeFromFile(&context, path.string()); @@ -105,11 +106,11 @@ TEST_P(RoundTripTest, RoundTrip) { llvm::errs() << "\n\n"; // Serialize MLIR module - const auto serialized = serialize(*mlirModule); + auto serialized = serialize(*mlirModule); // Compare textual representations - const auto originalText = moduleTextFromBuffer(*original); - const auto serializedText = moduleTextFromBuffer(*serialized); + const auto originalText = readJeffFileToText(path.string()); + const auto serializedText = moduleTextFromBuffer(serialized); llvm::errs() << "Original module:\n" << originalText << "\n\n"; llvm::errs() << "Serialized module:\n" << serializedText << "\n\n"; From f1fc8b993202066d34d82dccf1baa7eabe400e3f Mon Sep 17 00:00:00 2001 From: burgholzer Date: Tue, 5 May 2026 01:51:54 +0200 Subject: [PATCH 17/21] =?UTF-8?q?=F0=9F=9A=A8=20Address=20clang-tidy=20war?= =?UTF-8?q?nings?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/Translation/Deserialize.cpp | 3 ++- lib/Translation/Serialize.cpp | 2 -- unittests/Conversion/test_native_round_trip.cpp | 2 +- unittests/Translation/test_round_trip.cpp | 1 + 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/Translation/Deserialize.cpp b/lib/Translation/Deserialize.cpp index 3bae037..9effe70 100644 --- a/lib/Translation/Deserialize.cpp +++ b/lib/Translation/Deserialize.cpp @@ -7,6 +7,7 @@ #include #include #include +#include #include #include #include @@ -26,11 +27,11 @@ #include #include +#include #include #include #include #include -#include namespace { diff --git a/lib/Translation/Serialize.cpp b/lib/Translation/Serialize.cpp index 25ee747..8a73d6d 100644 --- a/lib/Translation/Serialize.cpp +++ b/lib/Translation/Serialize.cpp @@ -30,8 +30,6 @@ #include #include -#include -#include #include static void checkRank(mlir::RankedTensorType tensorType) { diff --git a/unittests/Conversion/test_native_round_trip.cpp b/unittests/Conversion/test_native_round_trip.cpp index 4161666..8c8410f 100644 --- a/unittests/Conversion/test_native_round_trip.cpp +++ b/unittests/Conversion/test_native_round_trip.cpp @@ -4,6 +4,7 @@ #include "jeff/Translation/Deserialize.hpp" #include "jeff/Translation/Serialize.hpp" +#include #include #include #include @@ -24,7 +25,6 @@ #include #include -#include #include #include #include diff --git a/unittests/Translation/test_round_trip.cpp b/unittests/Translation/test_round_trip.cpp index 1f92c7c..1706897 100644 --- a/unittests/Translation/test_round_trip.cpp +++ b/unittests/Translation/test_round_trip.cpp @@ -2,6 +2,7 @@ #include "jeff/Translation/Deserialize.hpp" #include "jeff/Translation/Serialize.hpp" +#include #include #include #include From dcc5fd714fd05780e13bc8d6c0931e7a33d2ae9e Mon Sep 17 00:00:00 2001 From: burgholzer Date: Tue, 5 May 2026 02:21:59 +0200 Subject: [PATCH 18/21] =?UTF-8?q?=F0=9F=8F=81=20Try=20to=20fix=20downstrea?= =?UTF-8?q?m=20Windows=20issues?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/Translation/Serialize.cpp | 7 ++++++- unittests/Conversion/test_native_round_trip.cpp | 2 +- unittests/Translation/test_round_trip.cpp | 2 +- 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/lib/Translation/Serialize.cpp b/lib/Translation/Serialize.cpp index 8a73d6d..e10245a 100644 --- a/lib/Translation/Serialize.cpp +++ b/lib/Translation/Serialize.cpp @@ -28,6 +28,11 @@ #include #include +#ifdef _WIN32 +#include +#include +#endif + #include #include #include @@ -1728,7 +1733,7 @@ kj::Array serialize(mlir::ModuleOp module) { } void serializeToFile(mlir::ModuleOp module, llvm::StringRef path) { - llvm::sys::fs::file_t file = 0; + int file = 0; if (llvm::sys::fs::openFileForWrite(path, file)) { llvm::report_fatal_error("Could not open file"); } diff --git a/unittests/Conversion/test_native_round_trip.cpp b/unittests/Conversion/test_native_round_trip.cpp index 8c8410f..bb75543 100644 --- a/unittests/Conversion/test_native_round_trip.cpp +++ b/unittests/Conversion/test_native_round_trip.cpp @@ -46,7 +46,7 @@ class NativeRoundTripTest : public ::testing::Test, public ::testing::WithParamInterface {}; std::string readJeffFileToText(llvm::StringRef path) { - llvm::sys::fs::file_t file = 0; + int file = 0; if (llvm::sys::fs::openFileForRead(path, file)) { llvm::errs() << "Failed to open file: " << path << "\n"; llvm::report_fatal_error("Could not open file"); diff --git a/unittests/Translation/test_round_trip.cpp b/unittests/Translation/test_round_trip.cpp index 1706897..0b2caa9 100644 --- a/unittests/Translation/test_round_trip.cpp +++ b/unittests/Translation/test_round_trip.cpp @@ -39,7 +39,7 @@ class RoundTripTest : public ::testing::Test, public ::testing::WithParamInterface {}; std::string readJeffFileToText(llvm::StringRef path) { - llvm::sys::fs::file_t file = 0; + int file = 0; if (llvm::sys::fs::openFileForRead(path, file)) { llvm::errs() << "Failed to open file: " << path << "\n"; llvm::report_fatal_error("Could not open file"); From 4c3bd9cd927dd4c3698664451d8a7ccf4241bbd7 Mon Sep 17 00:00:00 2001 From: Lukas Burgholzer Date: Tue, 5 May 2026 08:38:30 +0200 Subject: [PATCH 19/21] =?UTF-8?q?=F0=9F=8F=81=20Further=20tweaks=20for=20W?= =?UTF-8?q?indows=20support?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Lukas Burgholzer --- lib/Translation/Serialize.cpp | 52 ++++++++----------- .../Conversion/test_native_round_trip.cpp | 15 +++--- unittests/Translation/test_round_trip.cpp | 15 +++--- 3 files changed, 37 insertions(+), 45 deletions(-) diff --git a/lib/Translation/Serialize.cpp b/lib/Translation/Serialize.cpp index e10245a..a8a6194 100644 --- a/lib/Translation/Serialize.cpp +++ b/lib/Translation/Serialize.cpp @@ -28,14 +28,8 @@ #include #include -#ifdef _WIN32 -#include -#include -#endif - #include #include -#include static void checkRank(mlir::RankedTensorType tensorType) { if (tensorType.getRank() != 1) { @@ -1261,8 +1255,8 @@ void serializeSwitch(jeff::Op::Builder builder, mlir::jeff::SwitchOp op, auto yieldOp = llvm::cast(block.back()); const auto numTargets = yieldOp.getNumOperands(); auto targets = branchBuilder.initTargets(numTargets); - for (size_t j = 0; j < numTargets; ++j) { - targets.set(j, ctx.getValueId(yieldOp.getOperand(j))); + for (size_t t = 0; t < numTargets; ++t) { + targets.set(t, ctx.getValueId(yieldOp.getOperand(t))); } } @@ -1290,8 +1284,8 @@ void serializeSwitch(jeff::Op::Builder builder, mlir::jeff::SwitchOp op, auto yieldOp = llvm::cast(block.back()); const auto numTargets = yieldOp.getNumOperands(); auto targets = defaultBuilder.initTargets(numTargets); - for (size_t i = 0; i < numTargets; ++i) { - targets.set(i, ctx.getValueId(yieldOp.getOperand(i))); + for (size_t t = 0; t < numTargets; ++t) { + targets.set(t, ctx.getValueId(yieldOp.getOperand(t))); } } } @@ -1333,8 +1327,8 @@ void serializeFor(jeff::Op::Builder builder, mlir::jeff::ForOp op, Serialization auto yieldOp = llvm::cast(block.back()); const auto numTargets = yieldOp.getNumOperands(); auto targets = forBuilder.initTargets(numTargets); - for (size_t i = 0; i < numTargets; ++i) { - targets.set(i, ctx.getValueId(yieldOp.getOperand(i))); + for (size_t t = 0; t < numTargets; ++t) { + targets.set(t, ctx.getValueId(yieldOp.getOperand(t))); } } @@ -1403,8 +1397,8 @@ void serializeWhile(jeff::Op::Builder builder, mlir::jeff::WhileOp op, Serializa auto yieldOp = llvm::cast(body.front().back()); const auto numTargets = yieldOp.getNumOperands(); auto targets = bodyBuilder.initTargets(numTargets); - for (size_t i = 0; i < numTargets; ++i) { - targets.set(i, ctx.getValueId(yieldOp.getOperand(i))); + for (size_t t = 0; t < numTargets; ++t) { + targets.set(t, ctx.getValueId(yieldOp.getOperand(t))); } } } @@ -1475,8 +1469,8 @@ void serializeDoWhile(jeff::Op::Builder builder, mlir::jeff::DoWhileOp op, auto yieldOp = llvm::cast(body.front().back()); const auto numTargets = yieldOp.getNumOperands(); auto targets = bodyBuilder.initTargets(numTargets); - for (size_t i = 0; i < numTargets; ++i) { - targets.set(i, ctx.getValueId(yieldOp.getOperand(i))); + for (size_t t = 0; t < numTargets; ++t) { + targets.set(t, ctx.getValueId(yieldOp.getOperand(t))); } } } @@ -1653,8 +1647,8 @@ void serializeFunction(jeff::Function::Builder functionBuilder, mlir::func::Func auto returnOp = llvm::cast(entryBlock.back()); const auto numTargets = returnOp.getNumOperands(); auto targetsBuilder = bodyBuilder.initTargets(numTargets); - for (unsigned i = 0; i < numTargets; ++i) { - targetsBuilder.set(i, ctx.getValueId(returnOp.getOperand(i))); + for (unsigned t = 0; t < numTargets; ++t) { + targetsBuilder.set(t, ctx.getValueId(returnOp.getOperand(t))); } // Build values @@ -1664,10 +1658,10 @@ void serializeFunction(jeff::Function::Builder functionBuilder, mlir::func::Func for (auto& pair : ctx.values) { values[pair.second] = pair.first; } - for (size_t i = 0, j = 0; i < numValues; ++i) { - auto valueBuilder = valuesBuilder[i]; + for (size_t v = 0; v < numValues; ++v) { + auto valueBuilder = valuesBuilder[v]; auto typeBuilder = valueBuilder.initType(); - serializeType(typeBuilder, values[i].getType()); + serializeType(typeBuilder, values[v].getType()); } } @@ -1737,16 +1731,16 @@ void serializeToFile(mlir::ModuleOp module, llvm::StringRef path) { if (llvm::sys::fs::openFileForWrite(path, file)) { llvm::report_fatal_error("Could not open file"); } + auto fd = llvm::sys::fs::convertFDToNativeFile(file); + capnp::MallocMessageBuilder message; + writeMessage(module, message); #ifdef _WIN32 - kj::AutoCloseHandle autoCloseHandle(file); - kj::HandleOutputStream output(std::move(autoCloseHandle)); + kj::AutoCloseHandle handle(fd); + kj::HandleOutputStream output(kj::mv(handle)); + capnp::writeMessage(output, message); #else - kj::AutoCloseFd autoCloseFd(file); - kj::FdOutputStream output(std::move(autoCloseFd)); + const kj::AutoCloseFd autoCloseFd(fd); + capnp::writeMessageToFd(autoCloseFd, message); #endif - - capnp::MallocMessageBuilder message; - writeMessage(module, message); - capnp::writeMessage(output, message); } diff --git a/unittests/Conversion/test_native_round_trip.cpp b/unittests/Conversion/test_native_round_trip.cpp index bb75543..ac57cfe 100644 --- a/unittests/Conversion/test_native_round_trip.cpp +++ b/unittests/Conversion/test_native_round_trip.cpp @@ -25,7 +25,6 @@ #include #include -#include #include #include #include @@ -46,22 +45,22 @@ class NativeRoundTripTest : public ::testing::Test, public ::testing::WithParamInterface {}; std::string readJeffFileToText(llvm::StringRef path) { - int file = 0; - if (llvm::sys::fs::openFileForRead(path, file)) { + auto file = llvm::sys::fs::openNativeFileForRead(path); + if (!file) { llvm::errs() << "Failed to open file: " << path << "\n"; llvm::report_fatal_error("Could not open file"); } + capnp::MallocMessageBuilder message; #ifdef _WIN32 - kj::AutoCloseHandle autoCloseHandle(file); + kj::AutoCloseHandle autoCloseHandle(*file); kj::HandleInputStream input(std::move(autoCloseHandle)); + capnp::readMessageCopy(input, message); #else - kj::AutoCloseFd autoCloseFd(file); - kj::FdInputStream input(std::move(autoCloseFd)); + const kj::AutoCloseFd autoCloseFd(*file); + capnp::readMessageCopyFromFd(autoCloseFd, message); #endif - capnp::MallocMessageBuilder message; - capnp::readMessageCopy(input, message); const auto module = message.getRoot(); return module.toString().flatten().cStr(); } diff --git a/unittests/Translation/test_round_trip.cpp b/unittests/Translation/test_round_trip.cpp index 0b2caa9..868eea6 100644 --- a/unittests/Translation/test_round_trip.cpp +++ b/unittests/Translation/test_round_trip.cpp @@ -18,7 +18,6 @@ #include #include -#include #include #include #include @@ -39,22 +38,22 @@ class RoundTripTest : public ::testing::Test, public ::testing::WithParamInterface {}; std::string readJeffFileToText(llvm::StringRef path) { - int file = 0; - if (llvm::sys::fs::openFileForRead(path, file)) { + auto file = llvm::sys::fs::openNativeFileForRead(path); + if (!file) { llvm::errs() << "Failed to open file: " << path << "\n"; llvm::report_fatal_error("Could not open file"); } + capnp::MallocMessageBuilder message; #ifdef _WIN32 - kj::AutoCloseHandle autoCloseHandle(file); + kj::AutoCloseHandle autoCloseHandle(*file); kj::HandleInputStream input(std::move(autoCloseHandle)); + capnp::readMessageCopy(input, message); #else - kj::AutoCloseFd autoCloseFd(file); - kj::FdInputStream input(std::move(autoCloseFd)); + const kj::AutoCloseFd autoCloseFd(*file); + capnp::readMessageCopyFromFd(autoCloseFd, message); #endif - capnp::MallocMessageBuilder message; - capnp::readMessageCopy(input, message); const auto module = message.getRoot(); return module.toString().flatten().cStr(); } From 78eb342e7d8e124c9deee956680adc69e9950411 Mon Sep 17 00:00:00 2001 From: Lukas Burgholzer Date: Tue, 5 May 2026 09:12:21 +0200 Subject: [PATCH 20/21] =?UTF-8?q?=F0=9F=8F=81=20Further=20tweaks=20for=20W?= =?UTF-8?q?indows=20support?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Lukas Burgholzer --- cmake/ExternalDependencies.cmake | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/cmake/ExternalDependencies.cmake b/cmake/ExternalDependencies.cmake index 6eb07f2..ba00ade 100644 --- a/cmake/ExternalDependencies.cmake +++ b/cmake/ExternalDependencies.cmake @@ -10,6 +10,15 @@ if(BUILD_JEFF_MLIR_TRANSLATION) ) list(APPEND FETCH_PACKAGES jeff) + if(WIN32) + set(WITH_FIBERS + OFF + CACHE + BOOL + "Disable fiber support on Windows to avoid a build error due to disabled exceptions" + FORCE + ) + endif() FetchContent_Declare( capnproto GIT_REPOSITORY https://github.com/capnproto/capnproto.git From 40f8692d2053b3319ee729d25627faff43b37889 Mon Sep 17 00:00:00 2001 From: Lukas Burgholzer Date: Tue, 5 May 2026 09:15:09 +0200 Subject: [PATCH 21/21] =?UTF-8?q?=F0=9F=9A=A8=20Fix=20linter=20warnings?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Lukas Burgholzer --- unittests/Conversion/test_native_round_trip.cpp | 2 +- unittests/Translation/test_round_trip.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/unittests/Conversion/test_native_round_trip.cpp b/unittests/Conversion/test_native_round_trip.cpp index ac57cfe..23ab59a 100644 --- a/unittests/Conversion/test_native_round_trip.cpp +++ b/unittests/Conversion/test_native_round_trip.cpp @@ -25,8 +25,8 @@ #include #include +#include #include -#include #include namespace fs = std::filesystem; diff --git a/unittests/Translation/test_round_trip.cpp b/unittests/Translation/test_round_trip.cpp index 868eea6..5920b49 100644 --- a/unittests/Translation/test_round_trip.cpp +++ b/unittests/Translation/test_round_trip.cpp @@ -18,8 +18,8 @@ #include #include +#include #include -#include #include namespace fs = std::filesystem;