diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index a0dda21..608fd69 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -31,7 +31,7 @@ repos: hooks: - id: clang-format - id: cppcheck - args: ['--project=compile_commands.json', '-j 4'] + args: ['--project=compile_commands.json'] - id: include-what-you-use - repo: https://github.com/detailyang/pre-commit-shell rev: 1.0.5 diff --git a/CMakeLists.txt b/CMakeLists.txt index 11b3c13..faebaed 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -241,16 +241,15 @@ if(CMAKE_PROJECT_NAME STREQUAL PROJECT_NAME) # Create the tools we use to compile Serene add_subdirectory(serene-tblgen) + # Binary tools of the compiler + # add_subdirectory(serenec) + # add_subdirectory(serene-repl) + # The compiled library code is here + add_subdirectory(libserene) # The static library containing builtin special forms and functions add_subdirectory(core) - # Binary tools of the compiler - add_subdirectory(serenec) - add_subdirectory(serene-repl) - # The compiled library code is here - add_subdirectory(libserene) - - add_subdirectory(devtools) + # add_subdirectory(devtools) if (SERENE_ENABLE_DOCS) diff --git a/libserene.v0/CMakeLists.txt b/libserene.v0/CMakeLists.txt new file mode 100644 index 0000000..620e0a4 --- /dev/null +++ b/libserene.v0/CMakeLists.txt @@ -0,0 +1,81 @@ +# Serene Programming Language +# +# Copyright (c) 2019-2022 Sameer Rahmani +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, version 2. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +include_directories(${INCLUDE_DIR}) + +add_subdirectory(include) +add_subdirectory(lib) + +# Install rules for libserene target +install(TARGETS serene + EXPORT SereneExports + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} + ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}) + + +# Install rules for the public header files. +install(DIRECTORY ${INCLUDE_DIR}/serene + DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} + FILES_MATCHING + PATTERN *.h + PATTERN *.td + PATTERN "CMake*" EXCLUDE) + +# Install rule for the public generated header files +install(DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/include/ + DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} + FILES_MATCHING + PATTERN *.h + PATTERN *.td + PATTERN *.h.inc + PATTERN "CMake*" EXCLUDE) + +include(CMakePackageConfigHelpers) + +# Package config file let us use find_package with serene +configure_package_config_file( + "${CMAKE_CURRENT_SOURCE_DIR}/cmake/${PROJECT_NAME}Config.cmake.in" + "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.cmake" + + INSTALL_DESTINATION + ${CMAKE_INSTALL_LIBDIR}/cmake/serene-${PROJECT_VERSION} + ) + +write_basic_package_version_file( + "${PROJECT_NAME}ConfigVersion.cmake" + VERSION ${PROJECT_VERSION} + COMPATIBILITY SameMajorVersion + ) + +install(FILES + "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.cmake" + "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake" + DESTINATION + ${CMAKE_INSTALL_LIBDIR}/cmake/serene-${PROJECT_VERSION} + ) + +# Install the package exports +install(EXPORT SereneExports + DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/serene-${PROJECT_VERSION} + NAMESPACE serene::) + +# Testing only available if this is the main app +# Emergency override SERENE_CMAKE_BUILD_TESTING provided as well +if(SERENE_BUILD_TESTING) + message("Build the test binary") + add_subdirectory(tests) +endif() diff --git a/libserene.v0/cmake/SereneConfig.cmake.in b/libserene.v0/cmake/SereneConfig.cmake.in new file mode 100644 index 0000000..d07eecf --- /dev/null +++ b/libserene.v0/cmake/SereneConfig.cmake.in @@ -0,0 +1,21 @@ + # Serene Programming Language +# +# Copyright (c) 2019-2022 Sameer Rahmani +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, version 2. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +@PACKAGE_INIT@ + +include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Exports.cmake") + +check_required_components("@PROJECT_NAME@") diff --git a/libserene/include/CMakeLists.txt b/libserene.v0/include/CMakeLists.txt similarity index 100% rename from libserene/include/CMakeLists.txt rename to libserene.v0/include/CMakeLists.txt diff --git a/libserene.v0/include/serene/config.h.in b/libserene.v0/include/serene/config.h.in new file mode 100644 index 0000000..bc74d63 --- /dev/null +++ b/libserene.v0/include/serene/config.h.in @@ -0,0 +1,16 @@ +#ifndef CONFIG_H +#define CONFIG_H + +// the configured options and settings + +#define SERENE_VERSION "@PROJECT_VERSION@" + +// Why so obvious? to make the linter shutup :)) +#define I8_SIZE 8 +#define I32_SIZE 32 +#define I64_SIZE 64 + +// Should we build the support for MLIR CL OPTIONS? +#cmakedefine SERENE_WITH_MLIR_CL_OPTION + +#endif diff --git a/libserene/include/serene/context.h b/libserene.v0/include/serene/context.h similarity index 100% rename from libserene/include/serene/context.h rename to libserene.v0/include/serene/context.h diff --git a/libserene/include/serene/conventions.h b/libserene.v0/include/serene/conventions.h similarity index 100% rename from libserene/include/serene/conventions.h rename to libserene.v0/include/serene/conventions.h diff --git a/libserene/include/serene/diagnostics.h b/libserene.v0/include/serene/diagnostics.h similarity index 100% rename from libserene/include/serene/diagnostics.h rename to libserene.v0/include/serene/diagnostics.h diff --git a/libserene/include/serene/environment.h b/libserene.v0/include/serene/environment.h similarity index 100% rename from libserene/include/serene/environment.h rename to libserene.v0/include/serene/environment.h diff --git a/libserene/include/serene/errors.h b/libserene.v0/include/serene/errors.h similarity index 100% rename from libserene/include/serene/errors.h rename to libserene.v0/include/serene/errors.h diff --git a/libserene/include/serene/errors/CMakeLists.txt b/libserene.v0/include/serene/errors/CMakeLists.txt similarity index 100% rename from libserene/include/serene/errors/CMakeLists.txt rename to libserene.v0/include/serene/errors/CMakeLists.txt diff --git a/libserene/include/serene/errors/base.h b/libserene.v0/include/serene/errors/base.h similarity index 100% rename from libserene/include/serene/errors/base.h rename to libserene.v0/include/serene/errors/base.h diff --git a/libserene/include/serene/errors/errors.td b/libserene.v0/include/serene/errors/errors.td similarity index 100% rename from libserene/include/serene/errors/errors.td rename to libserene.v0/include/serene/errors/errors.td diff --git a/libserene/include/serene/errors/variant.h b/libserene.v0/include/serene/errors/variant.h similarity index 100% rename from libserene/include/serene/errors/variant.h rename to libserene.v0/include/serene/errors/variant.h diff --git a/libserene/include/serene/exprs/call.h b/libserene.v0/include/serene/exprs/call.h similarity index 100% rename from libserene/include/serene/exprs/call.h rename to libserene.v0/include/serene/exprs/call.h diff --git a/libserene/include/serene/exprs/def.h b/libserene.v0/include/serene/exprs/def.h similarity index 100% rename from libserene/include/serene/exprs/def.h rename to libserene.v0/include/serene/exprs/def.h diff --git a/libserene/include/serene/exprs/expression.h b/libserene.v0/include/serene/exprs/expression.h similarity index 100% rename from libserene/include/serene/exprs/expression.h rename to libserene.v0/include/serene/exprs/expression.h diff --git a/libserene/include/serene/exprs/fn.h b/libserene.v0/include/serene/exprs/fn.h similarity index 100% rename from libserene/include/serene/exprs/fn.h rename to libserene.v0/include/serene/exprs/fn.h diff --git a/libserene/include/serene/exprs/list.h b/libserene.v0/include/serene/exprs/list.h similarity index 100% rename from libserene/include/serene/exprs/list.h rename to libserene.v0/include/serene/exprs/list.h diff --git a/libserene/include/serene/exprs/number.h b/libserene.v0/include/serene/exprs/number.h similarity index 100% rename from libserene/include/serene/exprs/number.h rename to libserene.v0/include/serene/exprs/number.h diff --git a/libserene/include/serene/exprs/symbol.h b/libserene.v0/include/serene/exprs/symbol.h similarity index 100% rename from libserene/include/serene/exprs/symbol.h rename to libserene.v0/include/serene/exprs/symbol.h diff --git a/libserene/include/serene/exprs/traits.h b/libserene.v0/include/serene/exprs/traits.h similarity index 100% rename from libserene/include/serene/exprs/traits.h rename to libserene.v0/include/serene/exprs/traits.h diff --git a/libserene/include/serene/jit/README.org b/libserene.v0/include/serene/jit/README.org similarity index 100% rename from libserene/include/serene/jit/README.org rename to libserene.v0/include/serene/jit/README.org diff --git a/libserene/include/serene/jit/engine.h b/libserene.v0/include/serene/jit/engine.h similarity index 100% rename from libserene/include/serene/jit/engine.h rename to libserene.v0/include/serene/jit/engine.h diff --git a/libserene/include/serene/jit/halley.h b/libserene.v0/include/serene/jit/halley.h similarity index 100% rename from libserene/include/serene/jit/halley.h rename to libserene.v0/include/serene/jit/halley.h diff --git a/libserene/include/serene/jit/layers.h b/libserene.v0/include/serene/jit/layers.h similarity index 100% rename from libserene/include/serene/jit/layers.h rename to libserene.v0/include/serene/jit/layers.h diff --git a/libserene/include/serene/llvm/IR/Value.h b/libserene.v0/include/serene/llvm/IR/Value.h similarity index 100% rename from libserene/include/serene/llvm/IR/Value.h rename to libserene.v0/include/serene/llvm/IR/Value.h diff --git a/libserene/include/serene/llvm/patches.h b/libserene.v0/include/serene/llvm/patches.h similarity index 100% rename from libserene/include/serene/llvm/patches.h rename to libserene.v0/include/serene/llvm/patches.h diff --git a/libserene/include/serene/namespace.h b/libserene.v0/include/serene/namespace.h similarity index 100% rename from libserene/include/serene/namespace.h rename to libserene.v0/include/serene/namespace.h diff --git a/libserene/include/serene/passes.h b/libserene.v0/include/serene/passes.h similarity index 100% rename from libserene/include/serene/passes.h rename to libserene.v0/include/serene/passes.h diff --git a/libserene/include/serene/passes/CMakeLists.txt b/libserene.v0/include/serene/passes/CMakeLists.txt similarity index 100% rename from libserene/include/serene/passes/CMakeLists.txt rename to libserene.v0/include/serene/passes/CMakeLists.txt diff --git a/libserene/include/serene/passes/passes.td b/libserene.v0/include/serene/passes/passes.td similarity index 100% rename from libserene/include/serene/passes/passes.td rename to libserene.v0/include/serene/passes/passes.td diff --git a/libserene/include/serene/reader/location.h b/libserene.v0/include/serene/reader/location.h similarity index 100% rename from libserene/include/serene/reader/location.h rename to libserene.v0/include/serene/reader/location.h diff --git a/libserene/include/serene/reader/reader.h b/libserene.v0/include/serene/reader/reader.h similarity index 100% rename from libserene/include/serene/reader/reader.h rename to libserene.v0/include/serene/reader/reader.h diff --git a/libserene/include/serene/reader/traits.h b/libserene.v0/include/serene/reader/traits.h similarity index 100% rename from libserene/include/serene/reader/traits.h rename to libserene.v0/include/serene/reader/traits.h diff --git a/libserene/include/serene/semantics.h b/libserene.v0/include/serene/semantics.h similarity index 100% rename from libserene/include/serene/semantics.h rename to libserene.v0/include/serene/semantics.h diff --git a/libserene.v0/include/serene/serene.h b/libserene.v0/include/serene/serene.h new file mode 100644 index 0000000..c52806f --- /dev/null +++ b/libserene.v0/include/serene/serene.h @@ -0,0 +1,79 @@ +/* -*- C++ -*- + * Serene Programming Language + * + * Copyright (c) 2019-2022 Sameer Rahmani + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 2. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#ifndef SERENE_SERENE_H +#define SERENE_SERENE_H + +#include "serene/config.h" +#include "serene/context.h" +#include "serene/export.h" +#include "serene/exprs/expression.h" +#include "serene/source_mgr.h" + +namespace serene { + +/// Clinet applications have to call this function before any interaction with +/// the Serene's compiler API. +SERENE_EXPORT void initCompiler(); + +/// Register the global CLI options of the serene compiler. If the client +/// application needs to setup the compilers options automatically use this +/// function in conjunction with `applySereneCLOptions`. +SERENE_EXPORT void registerSereneCLOptions(); + +/// Applies the global compiler options on the give \p SereneContext. This +/// function has to be called after `llvm::cl::ParseCommandLineOptions`. +SERENE_EXPORT void applySereneCLOptions(SereneContext &ctx); + +/// \brief Reads the the given \p input as Serene source code in the given +/// \c SereneContext \p ctx and returns the possible AST tree of the input or an +/// error otherwise. +/// +/// If any thing goes wrong it will return an \return \c llvm::Error describing +/// the issue. +/// +/// Be aware than this function reads the input in the context of the current +/// namespace. So for example if the input is somthing like: +/// +/// (ns example.code) .... +/// +/// and the current ns is `user` then if there is a syntax error in the input +/// the error will be reported under the `user` ns. This is logical because +/// this function reads the code and not evaluate it. the `ns` form has to be +/// evaluated in order to change the ns. +SERENE_EXPORT exprs::MaybeAst read(SereneContext &ctx, std::string &input); + +/// Evaluates the given AST form \p input in the given \c SereneContext \p ctx +/// and retuns a new expression as the result or a possible error. +/// +/// In case of an error Serene will throw the error messages vis the diagnostic +/// engine as well and the error that this function returns will be the +/// generic error message. +SERENE_EXPORT exprs::MaybeNode eval(SereneContext &ctx, exprs::Ast &input); + +// TODO: Return a Serene String type instead of the std::string +// TODO: Create an overload to get a stream instead of the result string +/// Prints the given AST form \p input in the given \c SereneContext \p ctx +/// into the given \p result. +/// Note: print is a lisp action. Don't confuse it with a print function such +/// as `println`. +SERENE_EXPORT void print(SereneContext &ctx, const exprs::Ast &input, + std::string &result); + +} // namespace serene +#endif diff --git a/libserene/include/serene/slir/CMakeLists.txt b/libserene.v0/include/serene/slir/CMakeLists.txt similarity index 100% rename from libserene/include/serene/slir/CMakeLists.txt rename to libserene.v0/include/serene/slir/CMakeLists.txt diff --git a/libserene/include/serene/slir/dialect.h b/libserene.v0/include/serene/slir/dialect.h similarity index 100% rename from libserene/include/serene/slir/dialect.h rename to libserene.v0/include/serene/slir/dialect.h diff --git a/libserene/include/serene/slir/dialect.td b/libserene.v0/include/serene/slir/dialect.td similarity index 100% rename from libserene/include/serene/slir/dialect.td rename to libserene.v0/include/serene/slir/dialect.td diff --git a/libserene/include/serene/slir/generatable.h b/libserene.v0/include/serene/slir/generatable.h similarity index 100% rename from libserene/include/serene/slir/generatable.h rename to libserene.v0/include/serene/slir/generatable.h diff --git a/libserene/include/serene/slir/ops.h b/libserene.v0/include/serene/slir/ops.h similarity index 100% rename from libserene/include/serene/slir/ops.h rename to libserene.v0/include/serene/slir/ops.h diff --git a/libserene/include/serene/slir/ops.td b/libserene.v0/include/serene/slir/ops.td similarity index 100% rename from libserene/include/serene/slir/ops.td rename to libserene.v0/include/serene/slir/ops.td diff --git a/libserene/include/serene/slir/slir.h b/libserene.v0/include/serene/slir/slir.h similarity index 100% rename from libserene/include/serene/slir/slir.h rename to libserene.v0/include/serene/slir/slir.h diff --git a/libserene/include/serene/slir/symbol.h b/libserene.v0/include/serene/slir/symbol.h similarity index 100% rename from libserene/include/serene/slir/symbol.h rename to libserene.v0/include/serene/slir/symbol.h diff --git a/libserene/include/serene/slir/traits.h b/libserene.v0/include/serene/slir/traits.h similarity index 100% rename from libserene/include/serene/slir/traits.h rename to libserene.v0/include/serene/slir/traits.h diff --git a/libserene/include/serene/slir/type_converter.h b/libserene.v0/include/serene/slir/type_converter.h similarity index 100% rename from libserene/include/serene/slir/type_converter.h rename to libserene.v0/include/serene/slir/type_converter.h diff --git a/libserene/include/serene/slir/types.h b/libserene.v0/include/serene/slir/types.h similarity index 100% rename from libserene/include/serene/slir/types.h rename to libserene.v0/include/serene/slir/types.h diff --git a/libserene/include/serene/slir/types.td b/libserene.v0/include/serene/slir/types.td similarity index 100% rename from libserene/include/serene/slir/types.td rename to libserene.v0/include/serene/slir/types.td diff --git a/libserene/include/serene/slir/utils.h b/libserene.v0/include/serene/slir/utils.h similarity index 100% rename from libserene/include/serene/slir/utils.h rename to libserene.v0/include/serene/slir/utils.h diff --git a/libserene/include/serene/source_mgr.h b/libserene.v0/include/serene/source_mgr.h similarity index 100% rename from libserene/include/serene/source_mgr.h rename to libserene.v0/include/serene/source_mgr.h diff --git a/libserene/include/serene/traits.h b/libserene.v0/include/serene/traits.h similarity index 100% rename from libserene/include/serene/traits.h rename to libserene.v0/include/serene/traits.h diff --git a/libserene/include/serene/traits/locatable.h b/libserene.v0/include/serene/traits/locatable.h similarity index 100% rename from libserene/include/serene/traits/locatable.h rename to libserene.v0/include/serene/traits/locatable.h diff --git a/libserene/include/serene/types/type.h b/libserene.v0/include/serene/types/type.h similarity index 100% rename from libserene/include/serene/types/type.h rename to libserene.v0/include/serene/types/type.h diff --git a/libserene/include/serene/utils.h b/libserene.v0/include/serene/utils.h similarity index 100% rename from libserene/include/serene/utils.h rename to libserene.v0/include/serene/utils.h diff --git a/libserene.v0/lib/CMakeLists.txt b/libserene.v0/lib/CMakeLists.txt new file mode 100644 index 0000000..69938b3 --- /dev/null +++ b/libserene.v0/lib/CMakeLists.txt @@ -0,0 +1,169 @@ +# Serene Programming Language +# +# Copyright (c) 2019-2022 Sameer Rahmani +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, version 2. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +#TODO: To support MacOS look into cmake's public headers +# https://cmake.org/cmake/help/latest/prop_tgt/PUBLIC_HEADER.html + +# Prevent any future RPATH issue on Posix +if(NOT APPLE) + set(CMAKE_INSTALL_RPATH $ORIGIN) +endif() + +add_library(serene + exprs/symbol.cpp + exprs/list.cpp + exprs/number.cpp + exprs/expression.cpp + exprs/def.cpp + exprs/fn.cpp + exprs/call.cpp + + serene.cpp + context.cpp + namespace.cpp + source_mgr.cpp + diagnostics.cpp + semantics.cpp + + # jit.cpp + # jit/engine.cpp + # jit/layers.cpp + jit/halley.cpp + + errors.cpp + + # Reader + reader/reader.cpp + + # IR + slir/types.cpp + slir/slir.cpp + slir/value_op.cpp + slir/generatable.cpp + slir/utils.cpp + slir/ops.cpp + slir/type_converter.cpp + slir/dialect.cpp + passes/slir_lowering.cpp + passes/to_llvm_dialect.cpp + ) + +# Create an ALIAS target. This way if we mess up the name +# there will be an cmake error inseat of a linker error which is harder +# to understand. So any binary that wants to use serene has to +# use `Serene::lib` alias instead +add_library(Serene::lib ALIAS serene) + +set_target_properties(serene PROPERTIES + VERSION ${PROJECT_VERSION} + SOVERSION ${PROJECT_VERSION_MAJOR} + # Warn on unused libs + LINK_WHAT_YOU_USE TRUE + # LTO support + INTERPROCEDURAL_OPTIMIZATION TRUE) + +if(SERENE_ENABLE_TIDY) + set_target_properties(serene PROPERTIES CXX_CLANG_TIDY ${CLANG_TIDY_PATH}) +endif() + +# Do we need to build serene as a shared lib? default is "yes" +if(SERENE_SHARED_LIB) + + # We need to use libsan as a shared lib on debug mode. The + # target executable has to be built with `-fsanitize=address` + # as well and it has to run with: + # LD_PRELOAD=$(clang -print-file-name=libclang_rt.asan-x86_64.so) + target_compile_options(serene PRIVATE + $<$:-shared-libsan> + ) + target_link_options( + serene PRIVATE + $<$:-shared-libsan> + ) +endif() + + +if (CPP_20_SUPPORT) + target_compile_features(serene PUBLIC cxx_std_20) +else() + target_compile_features(serene PUBLIC cxx_std_17) +endif() + +# Generate the tablegen ODS files before this target +add_dependencies(serene SereneTablegen SereneDialectGen SerenePassGen SereneErrorGen) + +# We need this directory, and users of our library will need it too +target_include_directories(serene PUBLIC "$") +target_include_directories(serene PUBLIC "$") + +# Generate the export.h +include(GenerateExportHeader) +generate_export_header(serene EXPORT_FILE_NAME ${PROJECT_BINARY_DIR}/include/serene/export.h) +target_compile_definitions( + serene PUBLIC "$<$>:SERENE_STATIC_DEFINE>") + +get_property(dialect_libs GLOBAL PROPERTY MLIR_DIALECT_LIBS) +get_property(conversion_libs GLOBAL PROPERTY MLIR_CONVERSION_LIBS) + + +if(SERENE_SHOW_MLIR_DIALECTS) + message(STATUS "MLIR Dialects to choose from:") + foreach(lib ${dialect_libs}) + message(STATUS "\t${lib}") + endforeach() +endif() + + +if(SERENE_SHOW_MLIR_TRANSFORMERS) + message(STATUS "MLIR Dialects transformers to choose from:") + foreach(lib ${conversion_libs}) + message(STATUS "\t${lib}") + endforeach() +endif() + +if(SERENE_SHOW_LLVM_LIBS) + execute_process(COMMAND llvm-config --libs all + OUTPUT_VARIABLE SERENE_LLVM_LIBS) + message(STATUS "LLVM libs available:\n ${SERENE_LLVM_LIBS}") +endif() + + +set(serene_lib_dialects_in_use + MLIRFunc) + +set(serene_lib_transformers_in_use + MLIRFuncToLLVM) + +target_link_libraries(serene PRIVATE + MLIRIR + MLIRPass + MLIRTransforms + + ${serene_lib_dialects_in_use} + ${serene_lib_transformers_in_use} + + #TODO: Remove this lib, we're just using one func + MLIRExecutionEngine + + # LLVM's JIT lib + LLVMExecutionEngine + LLVMOrcJIT + MLIRLLVMToLLVMIRTranslation + + LLVMTarget + LLVMX86AsmParser + + ${llvm_libs}) diff --git a/libserene/lib/context.cpp b/libserene.v0/lib/context.cpp similarity index 100% rename from libserene/lib/context.cpp rename to libserene.v0/lib/context.cpp diff --git a/libserene/lib/diagnostics.cpp b/libserene.v0/lib/diagnostics.cpp similarity index 100% rename from libserene/lib/diagnostics.cpp rename to libserene.v0/lib/diagnostics.cpp diff --git a/libserene/lib/errors.cpp b/libserene.v0/lib/errors.cpp similarity index 100% rename from libserene/lib/errors.cpp rename to libserene.v0/lib/errors.cpp diff --git a/libserene/lib/exprs/call.cpp b/libserene.v0/lib/exprs/call.cpp similarity index 100% rename from libserene/lib/exprs/call.cpp rename to libserene.v0/lib/exprs/call.cpp diff --git a/libserene/lib/exprs/def.cpp b/libserene.v0/lib/exprs/def.cpp similarity index 100% rename from libserene/lib/exprs/def.cpp rename to libserene.v0/lib/exprs/def.cpp diff --git a/libserene/lib/exprs/expression.cpp b/libserene.v0/lib/exprs/expression.cpp similarity index 100% rename from libserene/lib/exprs/expression.cpp rename to libserene.v0/lib/exprs/expression.cpp diff --git a/libserene/lib/exprs/fn.cpp b/libserene.v0/lib/exprs/fn.cpp similarity index 100% rename from libserene/lib/exprs/fn.cpp rename to libserene.v0/lib/exprs/fn.cpp diff --git a/libserene/lib/exprs/list.cpp b/libserene.v0/lib/exprs/list.cpp similarity index 100% rename from libserene/lib/exprs/list.cpp rename to libserene.v0/lib/exprs/list.cpp diff --git a/libserene/lib/exprs/number.cpp b/libserene.v0/lib/exprs/number.cpp similarity index 100% rename from libserene/lib/exprs/number.cpp rename to libserene.v0/lib/exprs/number.cpp diff --git a/libserene/lib/exprs/symbol.cpp b/libserene.v0/lib/exprs/symbol.cpp similarity index 100% rename from libserene/lib/exprs/symbol.cpp rename to libserene.v0/lib/exprs/symbol.cpp diff --git a/libserene/lib/jit/engine.cpp b/libserene.v0/lib/jit/engine.cpp similarity index 100% rename from libserene/lib/jit/engine.cpp rename to libserene.v0/lib/jit/engine.cpp diff --git a/libserene/lib/jit/halley.cpp b/libserene.v0/lib/jit/halley.cpp similarity index 100% rename from libserene/lib/jit/halley.cpp rename to libserene.v0/lib/jit/halley.cpp diff --git a/libserene/lib/jit/layers.cpp b/libserene.v0/lib/jit/layers.cpp similarity index 100% rename from libserene/lib/jit/layers.cpp rename to libserene.v0/lib/jit/layers.cpp diff --git a/libserene/lib/namespace.cpp b/libserene.v0/lib/namespace.cpp similarity index 100% rename from libserene/lib/namespace.cpp rename to libserene.v0/lib/namespace.cpp diff --git a/libserene/lib/passes/slir_lowering.cpp b/libserene.v0/lib/passes/slir_lowering.cpp similarity index 100% rename from libserene/lib/passes/slir_lowering.cpp rename to libserene.v0/lib/passes/slir_lowering.cpp diff --git a/libserene/lib/passes/to_llvm_dialect.cpp b/libserene.v0/lib/passes/to_llvm_dialect.cpp similarity index 100% rename from libserene/lib/passes/to_llvm_dialect.cpp rename to libserene.v0/lib/passes/to_llvm_dialect.cpp diff --git a/libserene/lib/reader/reader.cpp b/libserene.v0/lib/reader/reader.cpp similarity index 100% rename from libserene/lib/reader/reader.cpp rename to libserene.v0/lib/reader/reader.cpp diff --git a/libserene/lib/semantics.cpp b/libserene.v0/lib/semantics.cpp similarity index 100% rename from libserene/lib/semantics.cpp rename to libserene.v0/lib/semantics.cpp diff --git a/libserene.v0/lib/serene.cpp b/libserene.v0/lib/serene.cpp new file mode 100644 index 0000000..53cd91f --- /dev/null +++ b/libserene.v0/lib/serene.cpp @@ -0,0 +1,157 @@ +/* -*- C++ -*- + * Serene Programming Language + * + * Copyright (c) 2019-2022 Sameer Rahmani + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 2. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include "serene/serene.h" + +#include "serene/diagnostics.h" +#include "serene/exprs/expression.h" + +// TODO: Remove it +#include "serene/exprs/number.h" +#include "serene/jit/halley.h" +#include "serene/reader/reader.h" +#include "serene/utils.h" + +#include +#include +#include +#include +#include +#include + +namespace serene { +using exprs::Number; + +void initCompiler() { + llvm::InitializeAllTargetInfos(); + llvm::InitializeAllTargets(); + llvm::InitializeAllTargetMCs(); + llvm::InitializeAllAsmParsers(); + llvm::InitializeAllAsmPrinters(); +}; + +// CLI Option ---------------- + +/// All the global CLI option ar defined here. If you need to add a new global +/// option +/// make sure that you are handling it in `applySereneCLOptions` too. +struct SereneOptions { + + llvm::cl::OptionCategory clOptionsCategory{"Discovery options"}; + + llvm::cl::list loadPaths{ + "l", llvm::cl::desc("The load path to use for compilation."), + llvm::cl::ZeroOrMore, llvm::cl::MiscFlags::PositionalEatsArgs, + llvm::cl::cat(clOptionsCategory)}; + + llvm::cl::list sharedLibraryPaths{ + "sl", llvm::cl::desc("Where to find shared libraries"), + llvm::cl::ZeroOrMore, llvm::cl::MiscFlags::PositionalEatsArgs, + llvm::cl::cat(clOptionsCategory)}; +}; + +static llvm::ManagedStatic options; + +void registerSereneCLOptions() { + // Make sure that the options struct has been constructed. + *options; + +#ifdef SERENE_WITH_MLIR_CL_OPTION + // mlir::registerAsmPrinterCLOptions(); + mlir::registerMLIRContextCLOptions(); + mlir::registerPassManagerCLOptions(); +#endif +} + +void applySereneCLOptions(SereneContext &ctx) { + if (!options.isConstructed()) { + return; + } + + ctx.sourceManager.setLoadPaths(options->loadPaths); + +#ifdef SERENE_WITH_MLIR_CL_OPTION + mlir::applyPassManagerCLOptions(ctx.pm); +#endif +} + +SERENE_EXPORT exprs::MaybeAst read(SereneContext &ctx, std::string &input) { + auto ¤tNS = ctx.getCurrentNS(); + auto filename = + !currentNS.filename.hasValue() + ? llvm::None + : llvm::Optional(currentNS.filename.getValue()); + + return reader::read(ctx, input, currentNS.name, filename); +}; + +SERENE_EXPORT exprs::MaybeNode eval(SereneContext &ctx, exprs::Ast &input) { + + auto loc = reader::LocationRange::UnknownLocation("nsname"); + + // auto ns = ctx.importNamespace("docs.examples.hello_world", loc); + + // if (!ns) { + // auto es = ns.getError(); + // auto nsloadErr = errors::makeError(loc, errors::NSLoadError); + // es.push_back(nsloadErr); + // return exprs::MaybeNode::error(es); + // } + + auto errs = ctx.jit->addAST(input); + if (errs) { + return errs; + } + + // auto e = input[0]; + // auto *sym = llvm::dyn_cast(e.get()); + + // if (sym == nullptr) { + // return exprs::makeErrorNode(e->location, errors::UnknownError, "only + // sym"); + // } + + // llvm::outs() << "Read: " << sym->toString() << "\n"; + + // // Get the anonymous expression's JITSymbol. + // auto symptr = ctx.jit->lookup(*sym); + // if (!symptr) { + // return exprs::MaybeNode::error(symptr.getError()); + // } + + llvm::outs() << "eval here\n"; + + // sym((void **)3); + + // err = ctx.jit->addAst(input); + // if (err) { + // llvm::errs() << err; + // auto e = errors::makeErrorTree(loc, errors::NSLoadError); + + // return exprs::makeErrorNode(loc, errors::NSLoadError); + // } + return exprs::make(loc, "4", false, false); +}; + +SERENE_EXPORT void print(SereneContext &ctx, const exprs::Ast &input, + std::string &result) { + UNUSED(ctx); + result = exprs::astToString(&input); +}; + +} // namespace serene diff --git a/libserene/lib/slir/dialect.cpp b/libserene.v0/lib/slir/dialect.cpp similarity index 100% rename from libserene/lib/slir/dialect.cpp rename to libserene.v0/lib/slir/dialect.cpp diff --git a/libserene/lib/slir/generatable.cpp b/libserene.v0/lib/slir/generatable.cpp similarity index 100% rename from libserene/lib/slir/generatable.cpp rename to libserene.v0/lib/slir/generatable.cpp diff --git a/libserene/lib/slir/ops.cpp b/libserene.v0/lib/slir/ops.cpp similarity index 100% rename from libserene/lib/slir/ops.cpp rename to libserene.v0/lib/slir/ops.cpp diff --git a/libserene/lib/slir/slir.cpp b/libserene.v0/lib/slir/slir.cpp similarity index 100% rename from libserene/lib/slir/slir.cpp rename to libserene.v0/lib/slir/slir.cpp diff --git a/libserene/lib/slir/type_converter.cpp b/libserene.v0/lib/slir/type_converter.cpp similarity index 100% rename from libserene/lib/slir/type_converter.cpp rename to libserene.v0/lib/slir/type_converter.cpp diff --git a/libserene/lib/slir/types.cpp b/libserene.v0/lib/slir/types.cpp similarity index 100% rename from libserene/lib/slir/types.cpp rename to libserene.v0/lib/slir/types.cpp diff --git a/libserene/lib/slir/utils.cpp b/libserene.v0/lib/slir/utils.cpp similarity index 100% rename from libserene/lib/slir/utils.cpp rename to libserene.v0/lib/slir/utils.cpp diff --git a/libserene/lib/slir/value_op.cpp b/libserene.v0/lib/slir/value_op.cpp similarity index 100% rename from libserene/lib/slir/value_op.cpp rename to libserene.v0/lib/slir/value_op.cpp diff --git a/libserene/lib/source_mgr.cpp b/libserene.v0/lib/source_mgr.cpp similarity index 100% rename from libserene/lib/source_mgr.cpp rename to libserene.v0/lib/source_mgr.cpp diff --git a/libserene/tests/CMakeLists.txt b/libserene.v0/tests/CMakeLists.txt similarity index 100% rename from libserene/tests/CMakeLists.txt rename to libserene.v0/tests/CMakeLists.txt diff --git a/libserene/tests/context_tests.cpp.inc b/libserene.v0/tests/context_tests.cpp.inc similarity index 100% rename from libserene/tests/context_tests.cpp.inc rename to libserene.v0/tests/context_tests.cpp.inc diff --git a/libserene/tests/environment_tests.cpp.inc b/libserene.v0/tests/environment_tests.cpp.inc similarity index 100% rename from libserene/tests/environment_tests.cpp.inc rename to libserene.v0/tests/environment_tests.cpp.inc diff --git a/libserene/tests/errors/error_tests.cpp.inc b/libserene.v0/tests/errors/error_tests.cpp.inc similarity index 100% rename from libserene/tests/errors/error_tests.cpp.inc rename to libserene.v0/tests/errors/error_tests.cpp.inc diff --git a/libserene/tests/exprs/expression_tests.cpp.inc b/libserene.v0/tests/exprs/expression_tests.cpp.inc similarity index 100% rename from libserene/tests/exprs/expression_tests.cpp.inc rename to libserene.v0/tests/exprs/expression_tests.cpp.inc diff --git a/libserene/tests/exprs/list_tests.cpp.inc b/libserene.v0/tests/exprs/list_tests.cpp.inc similarity index 100% rename from libserene/tests/exprs/list_tests.cpp.inc rename to libserene.v0/tests/exprs/list_tests.cpp.inc diff --git a/libserene/tests/exprs/number_tests.cpp.inc b/libserene.v0/tests/exprs/number_tests.cpp.inc similarity index 100% rename from libserene/tests/exprs/number_tests.cpp.inc rename to libserene.v0/tests/exprs/number_tests.cpp.inc diff --git a/libserene/tests/exprs/symbol_tests.cpp.inc b/libserene.v0/tests/exprs/symbol_tests.cpp.inc similarity index 100% rename from libserene/tests/exprs/symbol_tests.cpp.inc rename to libserene.v0/tests/exprs/symbol_tests.cpp.inc diff --git a/libserene/tests/namespace_tests.cpp.inc b/libserene.v0/tests/namespace_tests.cpp.inc similarity index 100% rename from libserene/tests/namespace_tests.cpp.inc rename to libserene.v0/tests/namespace_tests.cpp.inc diff --git a/libserene/tests/reader/reader_tests.cpp.inc b/libserene.v0/tests/reader/reader_tests.cpp.inc similarity index 100% rename from libserene/tests/reader/reader_tests.cpp.inc rename to libserene.v0/tests/reader/reader_tests.cpp.inc diff --git a/libserene/tests/serenetests.cpp b/libserene.v0/tests/serenetests.cpp similarity index 100% rename from libserene/tests/serenetests.cpp rename to libserene.v0/tests/serenetests.cpp diff --git a/libserene/tests/setup.cpp.inc b/libserene.v0/tests/setup.cpp.inc similarity index 100% rename from libserene/tests/setup.cpp.inc rename to libserene.v0/tests/setup.cpp.inc diff --git a/libserene/tests/test_helpers.cpp.inc b/libserene.v0/tests/test_helpers.cpp.inc similarity index 100% rename from libserene/tests/test_helpers.cpp.inc rename to libserene.v0/tests/test_helpers.cpp.inc diff --git a/libserene/tests/traits_tests.cpp.inc b/libserene.v0/tests/traits_tests.cpp.inc similarity index 100% rename from libserene/tests/traits_tests.cpp.inc rename to libserene.v0/tests/traits_tests.cpp.inc diff --git a/libserene/tests/utils_tests.cpp.inc b/libserene.v0/tests/utils_tests.cpp.inc similarity index 100% rename from libserene/tests/utils_tests.cpp.inc rename to libserene.v0/tests/utils_tests.cpp.inc diff --git a/libserene/CMakeLists.txt b/libserene/CMakeLists.txt index 620e0a4..489ae06 100644 --- a/libserene/CMakeLists.txt +++ b/libserene/CMakeLists.txt @@ -14,9 +14,9 @@ # You should have received a copy of the GNU General Public License # along with this program. If not, see . -include_directories(${INCLUDE_DIR}) +set(LIB_SERENE_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/include) +include_directories(${LIB_SERENE_INCLUDE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/lib) -add_subdirectory(include) add_subdirectory(lib) # Install rules for libserene target diff --git a/libserene/include/serene/serene.h b/libserene/include/serene/serene.h index c52806f..6bb0ede 100644 --- a/libserene/include/serene/serene.h +++ b/libserene/include/serene/serene.h @@ -19,61 +19,10 @@ #ifndef SERENE_SERENE_H #define SERENE_SERENE_H -#include "serene/config.h" -#include "serene/context.h" #include "serene/export.h" -#include "serene/exprs/expression.h" -#include "serene/source_mgr.h" namespace serene { - -/// Clinet applications have to call this function before any interaction with -/// the Serene's compiler API. -SERENE_EXPORT void initCompiler(); - -/// Register the global CLI options of the serene compiler. If the client -/// application needs to setup the compilers options automatically use this -/// function in conjunction with `applySereneCLOptions`. -SERENE_EXPORT void registerSereneCLOptions(); - -/// Applies the global compiler options on the give \p SereneContext. This -/// function has to be called after `llvm::cl::ParseCommandLineOptions`. -SERENE_EXPORT void applySereneCLOptions(SereneContext &ctx); - -/// \brief Reads the the given \p input as Serene source code in the given -/// \c SereneContext \p ctx and returns the possible AST tree of the input or an -/// error otherwise. -/// -/// If any thing goes wrong it will return an \return \c llvm::Error describing -/// the issue. -/// -/// Be aware than this function reads the input in the context of the current -/// namespace. So for example if the input is somthing like: -/// -/// (ns example.code) .... -/// -/// and the current ns is `user` then if there is a syntax error in the input -/// the error will be reported under the `user` ns. This is logical because -/// this function reads the code and not evaluate it. the `ns` form has to be -/// evaluated in order to change the ns. -SERENE_EXPORT exprs::MaybeAst read(SereneContext &ctx, std::string &input); - -/// Evaluates the given AST form \p input in the given \c SereneContext \p ctx -/// and retuns a new expression as the result or a possible error. -/// -/// In case of an error Serene will throw the error messages vis the diagnostic -/// engine as well and the error that this function returns will be the -/// generic error message. -SERENE_EXPORT exprs::MaybeNode eval(SereneContext &ctx, exprs::Ast &input); - -// TODO: Return a Serene String type instead of the std::string -// TODO: Create an overload to get a stream instead of the result string -/// Prints the given AST form \p input in the given \c SereneContext \p ctx -/// into the given \p result. -/// Note: print is a lisp action. Don't confuse it with a print function such -/// as `println`. -SERENE_EXPORT void print(SereneContext &ctx, const exprs::Ast &input, - std::string &result); +int SERENE_EXPORT makeEngine(); } // namespace serene #endif diff --git a/libserene/lib/CMakeLists.txt b/libserene/lib/CMakeLists.txt index 69938b3..7a77f12 100644 --- a/libserene/lib/CMakeLists.txt +++ b/libserene/lib/CMakeLists.txt @@ -23,43 +23,7 @@ if(NOT APPLE) endif() add_library(serene - exprs/symbol.cpp - exprs/list.cpp - exprs/number.cpp - exprs/expression.cpp - exprs/def.cpp - exprs/fn.cpp - exprs/call.cpp - - serene.cpp - context.cpp - namespace.cpp - source_mgr.cpp - diagnostics.cpp - semantics.cpp - - # jit.cpp - # jit/engine.cpp - # jit/layers.cpp - jit/halley.cpp - - errors.cpp - - # Reader - reader/reader.cpp - - # IR - slir/types.cpp - slir/slir.cpp - slir/value_op.cpp - slir/generatable.cpp - slir/utils.cpp - slir/ops.cpp - slir/type_converter.cpp - slir/dialect.cpp - passes/slir_lowering.cpp - passes/to_llvm_dialect.cpp - ) + serene.cpp) # Create an ALIAS target. This way if we mess up the name # there will be an cmake error inseat of a linker error which is harder @@ -72,6 +36,9 @@ set_target_properties(serene PROPERTIES SOVERSION ${PROJECT_VERSION_MAJOR} # Warn on unused libs LINK_WHAT_YOU_USE TRUE + CXX_INCLUDE_WHAT_YOU_USE "include-what-you-use" + C_INCLUDE_WHAT_YOU_USE "include-what-you-use" + # LTO support INTERPROCEDURAL_OPTIMIZATION TRUE) @@ -103,67 +70,19 @@ else() endif() # Generate the tablegen ODS files before this target -add_dependencies(serene SereneTablegen SereneDialectGen SerenePassGen SereneErrorGen) +#add_dependencies(serene) # We need this directory, and users of our library will need it too -target_include_directories(serene PUBLIC "$") +target_include_directories(serene PUBLIC "$") target_include_directories(serene PUBLIC "$") # Generate the export.h include(GenerateExportHeader) + generate_export_header(serene EXPORT_FILE_NAME ${PROJECT_BINARY_DIR}/include/serene/export.h) target_compile_definitions( serene PUBLIC "$<$>:SERENE_STATIC_DEFINE>") -get_property(dialect_libs GLOBAL PROPERTY MLIR_DIALECT_LIBS) -get_property(conversion_libs GLOBAL PROPERTY MLIR_CONVERSION_LIBS) - -if(SERENE_SHOW_MLIR_DIALECTS) - message(STATUS "MLIR Dialects to choose from:") - foreach(lib ${dialect_libs}) - message(STATUS "\t${lib}") - endforeach() -endif() - - -if(SERENE_SHOW_MLIR_TRANSFORMERS) - message(STATUS "MLIR Dialects transformers to choose from:") - foreach(lib ${conversion_libs}) - message(STATUS "\t${lib}") - endforeach() -endif() - -if(SERENE_SHOW_LLVM_LIBS) - execute_process(COMMAND llvm-config --libs all - OUTPUT_VARIABLE SERENE_LLVM_LIBS) - message(STATUS "LLVM libs available:\n ${SERENE_LLVM_LIBS}") -endif() - - -set(serene_lib_dialects_in_use - MLIRFunc) - -set(serene_lib_transformers_in_use - MLIRFuncToLLVM) - -target_link_libraries(serene PRIVATE - MLIRIR - MLIRPass - MLIRTransforms - - ${serene_lib_dialects_in_use} - ${serene_lib_transformers_in_use} - - #TODO: Remove this lib, we're just using one func - MLIRExecutionEngine - - # LLVM's JIT lib - LLVMExecutionEngine - LLVMOrcJIT - MLIRLLVMToLLVMIRTranslation - - LLVMTarget - LLVMX86AsmParser - - ${llvm_libs}) +# target_link_libraries(serene PRIVATE +# ${llvm_libs}) diff --git a/libserene/lib/serene.cpp b/libserene/lib/serene.cpp index 53cd91f..6494e12 100644 --- a/libserene/lib/serene.cpp +++ b/libserene/lib/serene.cpp @@ -18,140 +18,8 @@ #include "serene/serene.h" -#include "serene/diagnostics.h" -#include "serene/exprs/expression.h" - -// TODO: Remove it -#include "serene/exprs/number.h" -#include "serene/jit/halley.h" -#include "serene/reader/reader.h" -#include "serene/utils.h" - -#include -#include -#include -#include -#include -#include - namespace serene { -using exprs::Number; -void initCompiler() { - llvm::InitializeAllTargetInfos(); - llvm::InitializeAllTargets(); - llvm::InitializeAllTargetMCs(); - llvm::InitializeAllAsmParsers(); - llvm::InitializeAllAsmPrinters(); -}; - -// CLI Option ---------------- - -/// All the global CLI option ar defined here. If you need to add a new global -/// option -/// make sure that you are handling it in `applySereneCLOptions` too. -struct SereneOptions { - - llvm::cl::OptionCategory clOptionsCategory{"Discovery options"}; - - llvm::cl::list loadPaths{ - "l", llvm::cl::desc("The load path to use for compilation."), - llvm::cl::ZeroOrMore, llvm::cl::MiscFlags::PositionalEatsArgs, - llvm::cl::cat(clOptionsCategory)}; - - llvm::cl::list sharedLibraryPaths{ - "sl", llvm::cl::desc("Where to find shared libraries"), - llvm::cl::ZeroOrMore, llvm::cl::MiscFlags::PositionalEatsArgs, - llvm::cl::cat(clOptionsCategory)}; -}; - -static llvm::ManagedStatic options; - -void registerSereneCLOptions() { - // Make sure that the options struct has been constructed. - *options; - -#ifdef SERENE_WITH_MLIR_CL_OPTION - // mlir::registerAsmPrinterCLOptions(); - mlir::registerMLIRContextCLOptions(); - mlir::registerPassManagerCLOptions(); -#endif -} - -void applySereneCLOptions(SereneContext &ctx) { - if (!options.isConstructed()) { - return; - } - - ctx.sourceManager.setLoadPaths(options->loadPaths); - -#ifdef SERENE_WITH_MLIR_CL_OPTION - mlir::applyPassManagerCLOptions(ctx.pm); -#endif -} - -SERENE_EXPORT exprs::MaybeAst read(SereneContext &ctx, std::string &input) { - auto ¤tNS = ctx.getCurrentNS(); - auto filename = - !currentNS.filename.hasValue() - ? llvm::None - : llvm::Optional(currentNS.filename.getValue()); - - return reader::read(ctx, input, currentNS.name, filename); -}; - -SERENE_EXPORT exprs::MaybeNode eval(SereneContext &ctx, exprs::Ast &input) { - - auto loc = reader::LocationRange::UnknownLocation("nsname"); - - // auto ns = ctx.importNamespace("docs.examples.hello_world", loc); - - // if (!ns) { - // auto es = ns.getError(); - // auto nsloadErr = errors::makeError(loc, errors::NSLoadError); - // es.push_back(nsloadErr); - // return exprs::MaybeNode::error(es); - // } - - auto errs = ctx.jit->addAST(input); - if (errs) { - return errs; - } - - // auto e = input[0]; - // auto *sym = llvm::dyn_cast(e.get()); - - // if (sym == nullptr) { - // return exprs::makeErrorNode(e->location, errors::UnknownError, "only - // sym"); - // } - - // llvm::outs() << "Read: " << sym->toString() << "\n"; - - // // Get the anonymous expression's JITSymbol. - // auto symptr = ctx.jit->lookup(*sym); - // if (!symptr) { - // return exprs::MaybeNode::error(symptr.getError()); - // } - - llvm::outs() << "eval here\n"; - - // sym((void **)3); - - // err = ctx.jit->addAst(input); - // if (err) { - // llvm::errs() << err; - // auto e = errors::makeErrorTree(loc, errors::NSLoadError); - - // return exprs::makeErrorNode(loc, errors::NSLoadError); - // } - return exprs::make(loc, "4", false, false); -}; - -SERENE_EXPORT void print(SereneContext &ctx, const exprs::Ast &input, - std::string &result) { - UNUSED(ctx); - result = exprs::astToString(&input); -}; +int makeEngine() { return 0; }; } // namespace serene diff --git a/serene-tblgen/serene/errors-backend.cpp b/serene-tblgen/serene/errors-backend.cpp index ba7bc3b..3df92ca 100644 --- a/serene-tblgen/serene/errors-backend.cpp +++ b/serene-tblgen/serene/errors-backend.cpp @@ -47,7 +47,7 @@ private: llvm::RecordKeeper &records; public: - ErrorsBackend(llvm::RecordKeeper &rk) : records(rk) {} + explicit ErrorsBackend(llvm::RecordKeeper &rk) : records(rk) {} void createNSBody(llvm::raw_ostream &os); void createErrorClass(int id, llvm::Record &defRec, llvm::raw_ostream &os);