diff --git a/CMakeLists.txt b/CMakeLists.txt index a69b8ca775..44b001e11e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -73,6 +73,10 @@ set(WITH_LFORTRAN_ASSERT ${WITH_LFORTRAN_ASSERT_DEFAULT} # LFORTRAN_STATIC_BIN set(LFORTRAN_STATIC_BIN no CACHE BOOL "Build LFortran as a static binary") +# WITH_LFORTRAN_BINARY_MODFILES +set(WITH_LFORTRAN_BINARY_MODFILES YES + CACHE BOOL "Use binary modfiles") + #ZLIB find_package(ZLIB REQUIRED) @@ -225,6 +229,7 @@ message("WITH_LLVM: ${WITH_LLVM}") message("WITH_XEUS: ${WITH_XEUS}") message("WITH_JSON: ${WITH_JSON}") message("WITH_FMT: ${WITH_FMT}") +message("WITH_LFORTRAN_BINARY_MODFILES: ${WITH_LFORTRAN_BINARY_MODFILES}") add_subdirectory(src) diff --git a/src/lfortran/config.h.in b/src/lfortran/config.h.in index 86134f75be..0de5d0a161 100644 --- a/src/lfortran/config.h.in +++ b/src/lfortran/config.h.in @@ -24,4 +24,7 @@ /* Define if XEUS is enabled */ #cmakedefine HAVE_LFORTRAN_XEUS +/* Define if we should use binary modfiles */ +#cmakedefine WITH_LFORTRAN_BINARY_MODFILES + #endif // LFORTRAN_CONFIG_H diff --git a/src/lfortran/modfile.cpp b/src/lfortran/modfile.cpp index d3ffb91888..14c5ed0ccd 100644 --- a/src/lfortran/modfile.cpp +++ b/src/lfortran/modfile.cpp @@ -1,5 +1,6 @@ #include +#include #include #include #include @@ -29,7 +30,11 @@ std::string save_modfile(const ASR::TranslationUnit_t &m) { LFORTRAN_ASSERT(ASR::is_a(*a.second)); if ((bool&)a) { } // Suppress unused warning in Release mode } +#ifdef WITH_LFORTRAN_BINARY_MODFILES BinaryWriter b; +#else + TextWriter b; +#endif // Header b.write_string(lfortran_modfile_type_string); b.write_string(LFORTRAN_VERSION); @@ -54,7 +59,11 @@ std::string save_modfile(const ASR::TranslationUnit_t &m) { ASR::TranslationUnit_t* load_modfile(Allocator &al, const std::string &s, bool load_symtab_id, SymbolTable &symtab) { +#ifdef WITH_LFORTRAN_BINARY_MODFILES BinaryReader b(s); +#else + TextReader b(s); +#endif std::string file_type = b.read_string(); if (file_type != lfortran_modfile_type_string) { throw LFortranException("LFortran Modfile format not recognized"); diff --git a/src/lfortran/serialization.cpp b/src/lfortran/serialization.cpp index 055fdf8a46..87aa326228 100644 --- a/src/lfortran/serialization.cpp +++ b/src/lfortran/serialization.cpp @@ -1,5 +1,6 @@ #include +#include #include #include #include @@ -7,15 +8,11 @@ #include #include -// Comment this out to enable human readable text Writer/Reader -// Useful for debugging. -#define SER_BINARY namespace LFortran { - class ASTSerializationVisitor : -#ifdef SER_BINARY +#ifdef WITH_LFORTRAN_BINARY_MODFILES public BinaryWriter, #else public TextWriter, @@ -44,7 +41,7 @@ std::string serialize(const AST::TranslationUnit_t &unit) { } class ASTDeserializationVisitor : -#ifdef SER_BINARY +#ifdef WITH_LFORTRAN_BINARY_MODFILES public BinaryReader, #else public TextReader, @@ -53,7 +50,7 @@ class ASTDeserializationVisitor : { public: ASTDeserializationVisitor(Allocator &al, const std::string &s) : -#ifdef SER_BINARY +#ifdef WITH_LFORTRAN_BINARY_MODFILES BinaryReader(s), #else TextReader(s), @@ -82,7 +79,7 @@ AST::ast_t* deserialize_ast(Allocator &al, const std::string &s) { // ---------------------------------------------------------------- class ASRSerializationVisitor : -#ifdef SER_BINARY +#ifdef WITH_LFORTRAN_BINARY_MODFILES public BinaryWriter, #else public TextWriter, @@ -117,17 +114,17 @@ std::string serialize(const ASR::TranslationUnit_t &unit) { } class ASRDeserializationVisitor : -#ifdef SER_BINARY - public BinaryReader, +#ifdef WITH_LFORTRAN_BINARY_MODFILES + public BinaryReader, #else - public TextReader, + public TextReader, #endif public ASR::DeserializationBaseVisitor { public: ASRDeserializationVisitor(Allocator &al, const std::string &s, bool load_symtab_id) : -#ifdef SER_BINARY +#ifdef WITH_LFORTRAN_BINARY_MODFILES BinaryReader(s), #else TextReader(s),