aboutsummaryrefslogtreecommitdiff
path: root/CMakeLists.txt
diff options
context:
space:
mode:
Diffstat (limited to 'CMakeLists.txt')
-rw-r--r--CMakeLists.txt179
1 files changed, 179 insertions, 0 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
new file mode 100644
index 0000000..5b9c405
--- /dev/null
+++ b/CMakeLists.txt
@@ -0,0 +1,179 @@
+# Source code for RCC-Legacy.
+# Copyright (C) 2026 Richard Qin
+#
+# This file is part of RCC.
+#
+# RCC 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; either version 3, or (at your option) any later
+# version.
+#
+# RCC 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 RCC; see the file LICENSE. If not see
+# <http://www.gnu.org/licenses/>.
+
+cmake_minimum_required(VERSION 3.20)
+project(rcc
+ VERSION 0.1.0
+ LANGUAGES C CXX
+)
+
+set(CMAKE_CXX_STANDARD 17)
+set(CMAKE_CXX_STANDARD_REQUIRED ON)
+set(CMAKE_CXX_EXTENSIONS OFF)
+
+set(CMAKE_C_STANDARD 11)
+set(CMAKE_C_STANDARD_REQUIRED ON)
+
+# Export compile_commands.json for clangd / IDE support
+set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
+
+# Compiler Warnings
+set(RCC_WARNING_FLAGS
+ -Wall -Wextra -Wpedantic
+ -Wshadow -Wnon-virtual-dtor
+ -Wold-style-cast -Wcast-align -Wunused
+ -Woverloaded-virtual -Wconversion -Wsign-conversion
+ -Wnull-dereference -Wdouble-promotion
+ -Wformat=2 -Wimplicit-fallthrough
+)
+
+# Sanitizers (Debug builds)
+option(RCC_ENABLE_SANITIZERS "Enable ASan + UBSan in Debug builds" ON)
+if(RCC_ENABLE_SANITIZERS AND CMAKE_BUILD_TYPE STREQUAL "Debug")
+ add_compile_options(-fsanitize=address,undefined -fno-omit-frame-pointer)
+ add_link_options(-fsanitize=address,undefined)
+endif()
+
+# # Find Flex & Bison
+find_package(FLEX REQUIRED)
+find_package(BISON REQUIRED)
+
+# Generate lexer and parser
+BISON_TARGET(SysYParser
+ ${CMAKE_SOURCE_DIR}/src/frontend/parser.y
+ ${CMAKE_CURRENT_BINARY_DIR}/parser.tab.cc
+ DEFINES_FILE ${CMAKE_CURRENT_BINARY_DIR}/parser.tab.h
+ COMPILE_FLAGS "--warnings=none"
+)
+
+FLEX_TARGET(SysYLexer
+ ${CMAKE_SOURCE_DIR}/src/frontend/lexer.l
+ ${CMAKE_CURRENT_BINARY_DIR}/lexer.yy.cc
+)
+
+ADD_FLEX_BISON_DEPENDENCY(SysYLexer SysYParser)
+
+# Source Files
+set(RCC_SOURCES
+ # Frontend
+ src/frontend/ast.cc
+ # src/frontend/lexer.yy.cc
+ # src/frontend/parser.tab.cc
+
+ # IR
+ src/util.cc
+ # src/ir/ir.cc
+ src/ir/irgen.cc
+ src/ir/irgen_expr.cc
+ src/ir/irgen_util.cc
+ src/ir/print.cc
+
+ # Mid-end
+ src/mid/loopinfo.cc
+ src/mid/cfg.cc
+ src/mid/live.cc
+ src/mid/ssa.cc
+ src/mid/load.cc
+ src/mid/alias.cc
+ src/mid/mem.cc
+ src/mid/fold.cc
+ src/mid/copy.cc
+ src/mid/gvn.cc
+ src/mid/gcm.cc
+ src/mid/ifopt.cc
+ src/mid/divopt.cc
+ src/mid/mulopt.cc
+ src/mid/storemrg.cc
+ src/mid/licm.cc
+ src/mid/scalar_repl.cc
+ src/mid/unroll.cc
+ src/mid/tre.cc
+ src/mid/lsr.cc
+ src/mid/loop_idiom.cc
+ src/mid/reduction_unroll.cc
+ src/mid/loopswap.cc
+ src/mid/unswitch.cc
+ src/mid/sccp.cc
+ src/mid/reassoc.cc
+ src/mid/dce.cc
+ src/mid/dead_loop.cc
+ src/mid/inline.cc
+ src/mid/abi.cc
+
+ src/backend/simpl.cc
+ src/backend/spill.cc
+ src/backend/rega.cc
+ src/backend/peephole.cc
+ src/backend/emit.cc
+ src/backend/rv64/targ.cc
+ src/backend/rv64/abi.cc
+ src/backend/rv64/isel.cc
+ src/backend/rv64/emit.cc
+
+)
+
+# Core Library
+add_library(rcc_core STATIC
+ ${RCC_SOURCES}
+ ${BISON_SysYParser_OUTPUTS}
+ ${FLEX_SysYLexer_OUTPUTS}
+)
+
+target_include_directories(rcc_core PUBLIC
+ ${PROJECT_SOURCE_DIR}/include
+ ${CMAKE_CURRENT_BINARY_DIR} # For generated parser.tab.h
+ # ${PROJECT_SOURCE_DIR}/src/frontend # For pre-generated parser.tab.h
+)
+
+# Suppress warnings on generated code
+set_source_files_properties(
+ ${BISON_SysYParser_OUTPUTS}
+ ${FLEX_SysYLexer_OUTPUTS}
+ src/frontend/lexer.yy.cc
+ src/frontend/parser.tab.cc
+ PROPERTIES COMPILE_FLAGS "-w"
+)
+
+target_compile_options(rcc_core PRIVATE ${RCC_WARNING_FLAGS})
+
+# Main Executable
+add_executable(rcc src/main.cc)
+target_link_libraries(rcc PRIVATE rcc_core)
+target_compile_options(rcc PRIVATE ${RCC_WARNING_FLAGS})
+
+# clang-format
+find_program(CLANG_FORMAT_EXE NAMES clang-format)
+if(CLANG_FORMAT_EXE)
+ file(GLOB_RECURSE ALL_CXX_SOURCES
+ ${PROJECT_SOURCE_DIR}/src/*.cc
+ ${PROJECT_SOURCE_DIR}/include/*.h
+ )
+ add_custom_target(format
+ COMMAND ${CLANG_FORMAT_EXE} -i ${ALL_CXX_SOURCES}
+ COMMENT "Running clang-format on all source files"
+ VERBATIM
+ )
+endif()
+
+# Tests
+option(RCC_BUILD_TESTS "Build tests" ON)
+if(RCC_BUILD_TESTS)
+ enable_testing()
+ # add_subdirectory(tests) # TODO: uncomment when tests are ready
+endif()