Skip to content
This repository was archived by the owner on Jan 8, 2023. It is now read-only.

Commit fa6bbc5

Browse files
author
ApsarasX
committed
feat: improve driver
1 parent dc5fbff commit fa6bbc5

File tree

8 files changed

+188
-110
lines changed

8 files changed

+188
-110
lines changed

.github/workflows/build.yml

Lines changed: 21 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@ jobs:
2424
compiler:
2525
- { cc: gcc, cxx: g++ }
2626
- { cc: clang, cxx: clang++ }
27-
fail-fast: false
2827
steps:
2928
- name: Fetch Codebase
3029
uses: actions/checkout@v2
@@ -35,13 +34,14 @@ jobs:
3534
path: ${{ github.workspace }}/thirdparty
3635
key: ${{ matrix.os }}-${{ matrix.compiler.cc }}-antlr
3736
- name: Install Prerequirements
38-
run: sudo apt-get install uuid-dev pkg-config doxygen graphviz
37+
run: sudo apt-get -y install uuid-dev pkg-config doxygen graphviz llvm-10
3938
- name: Install Antlr4 and Antlr4 Runtime
4039
if: steps.cache-antlr.outputs.cache-hit != 'true'
4140
env:
4241
CC: ${{ matrix.compiler.cc }}
4342
CXX: ${{ matrix.compiler.cxx }}
4443
run: |
44+
thread_count=`sudo cat /proc/cpuinfo| grep "processor"| wc -l`
4545
sudo mkdir -p thirdparty/antlr && cd thirdparty/antlr
4646
sudo wget https://www.antlr.org/download/antlr-4.8-complete.jar
4747
sudo wget -O ${{ runner.temp }}/antlr4-src.zip https://www.antlr.org/download/antlr4-cpp-runtime-4.8-source.zip
@@ -50,7 +50,7 @@ jobs:
5050
sudo mkdir build && cd build
5151
sudo mkdir -p ${{ github.workspace }}/thirdparty/antlr-runtime
5252
sudo cmake .. -DANTLR4_INSTALL=ON -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_FLAGS="-w" -DCMAKE_INSTALL_PREFIX=${{ github.workspace }}/thirdparty/antlr-runtime
53-
sudo cmake --build . --target install
53+
sudo cmake --build . --target install -- -j $thread_count
5454
- name: Move Antlr Runtime into /usr/local
5555
run: |
5656
cd ${{ github.workspace }}/thirdparty/antlr-runtime
@@ -61,20 +61,23 @@ jobs:
6161
CC: ${{ matrix.compiler.cc }}
6262
CXX: ${{ matrix.compiler.cxx }}
6363
run: |
64+
thread_count=`sudo cat /proc/cpuinfo| grep "processor"| wc -l`
6465
sudo mkdir cmake-build-debug cmake-build-release
6566
cd cmake-build-debug
66-
sudo cmake -DCMAKE_BUILD_TYPE=Debug -DCMAKE_CXX_FLAGS="-w" -G "CodeBlocks - Unix Makefiles" ..
67-
sudo cmake --build . --target staticscript document
67+
sudo cmake -DCMAKE_BUILD_TYPE=Debug -DCMAKE_CXX_FLAGS="-w" -DCMAKE_CXX_FLAGS_DEBUG="-g -ggdb" -G "Unix Makefiles" ..
68+
sudo cmake --build . --target staticscript document -- -j $thread_count
6869
for file in ../examples/*
6970
do
70-
sudo ./lib/staticscript $file
71+
sudo ./lib/staticscript $file --emit-llvm -o ss-ir.ll
72+
sudo ./lib/staticscript $file -o ss-obj.o
7173
done
7274
cd ../cmake-build-release
73-
sudo cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_FLAGS="-w" -G "CodeBlocks - Unix Makefiles" ..
74-
sudo cmake --build . --target staticscript document
75+
sudo cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_FLAGS="-w" -G "Unix Makefiles" ..
76+
sudo cmake --build . --target staticscript document -- -j $thread_count
7577
for file in ../examples/*
7678
do
77-
sudo ./lib/staticscript $file
79+
sudo ./lib/staticscript $file --emit-llvm -o ss-ir.ll
80+
sudo ./lib/staticscript $file -o ss-obj.o
7881
done
7982
8083
build_on_macos:
@@ -96,18 +99,21 @@ jobs:
9699
CC: ${{ matrix.compiler.cc }}
97100
CXX: ${{ matrix.compiler.cxx }}
98101
run: |
102+
thread_count=`sudo sysctl -n machdep.cpu.thread_count`
99103
sudo mkdir cmake-build-debug cmake-build-release
100104
cd cmake-build-debug
101-
sudo cmake -DCMAKE_BUILD_TYPE=Debug -DCMAKE_CXX_FLAGS="-w" -G "CodeBlocks - Unix Makefiles" ..
102-
sudo cmake --build . --target staticscript document
105+
sudo cmake -DCMAKE_BUILD_TYPE=Debug -DCMAKE_CXX_FLAGS="-w" -G "Unix Makefiles" ..
106+
sudo cmake --build . --target staticscript document -- -j $thread_count
103107
for file in ../examples/*
104108
do
105-
sudo ./lib/staticscript $file
109+
sudo ./lib/staticscript $file --emit-llvm -o ss-ir.ll
110+
sudo ./lib/staticscript $file -o ss-obj.o
106111
done
107112
cd ../cmake-build-release
108-
sudo cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_FLAGS="-w" -G "CodeBlocks - Unix Makefiles" ..
109-
sudo cmake --build . --target staticscript document
113+
sudo cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_FLAGS="-w" -G "Unix Makefiles" ..
114+
sudo cmake --build . --target staticscript document -- -j $thread_count
110115
for file in ../examples/*
111116
do
112-
sudo ./lib/staticscript $file
117+
sudo ./lib/staticscript $file --emit-llvm -o ss-ir.ll
118+
sudo ./lib/staticscript $file -o ss-obj.o
113119
done

CMakeLists.txt

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,28 @@
1-
cmake_minimum_required(VERSION 3.16)
1+
cmake_minimum_required(VERSION 3.17)
22

33
project(StaticScript CXX)
44

55
set(CMAKE_CXX_STANDARD 17)
66

7-
set(CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake)
7+
set(PROJECT_VERSION_MAJOR 0)
8+
set(PROJECT_VERSION_MINOR 0)
9+
set(PROJECT_VERSION_PATCH 1)
10+
set(PROJECT_VERSION ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH})
811

9-
configure_file(include/config.h.in ${PROJECT_BINARY_DIR}/include/config.h)
12+
set(CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake)
1013

1114
include(AddANTLR)
1215

1316
include(AddLLVM)
1417

1518
include(AddDoxygen)
1619

20+
configure_file(include/config.h.in ${PROJECT_BINARY_DIR}/include/config.h)
21+
1722
include_directories(${PROJECT_BINARY_DIR}/include)
1823

1924
include_directories(include)
2025

21-
add_subdirectory(lib)
26+
add_subdirectory(builtin)
2227

23-
add_subdirectory(builtin)
28+
add_subdirectory(lib)

cmake/AddLLVM.cmake

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,9 @@
1-
list(APPEND CMAKE_PREFIX_PATH /usr/local/opt/llvm/lib/cmake/llvm)
1+
if (CMAKE_HOST_SYSTEM_NAME STREQUAL Linux)
2+
find_package(LLVM 10 REQUIRED CONFIG)
3+
elseif (CMAKE_HOST_SYSTEM_NAME STREQUAL Darwin)
4+
list(APPEND CMAKE_PREFIX_PATH /usr/local/opt/llvm/lib/cmake/llvm)
5+
find_package(LLVM 11 REQUIRED CONFIG)
6+
endif ()
27

38
find_package(LLVM REQUIRED CONFIG)
49

@@ -8,4 +13,4 @@ include_directories(${LLVM_INCLUDE_DIRS})
813

914
add_definitions(${LLVM_DEFINITIONS})
1015

11-
llvm_map_components_to_libnames(llvm_libs support core irreader linker orcjit nativecodegen)
16+
llvm_map_components_to_libnames(llvm_libs support core irreader linker nativecodegen)

include/config.h.in

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,3 +6,8 @@
66
#if defined(CMAKE_HOST_UNIX) && !defined(CMAKE_HOST_APPLE)
77
#define CMAKE_HOST_LINUX 1
88
#endif
9+
10+
#cmakedefine PROJECT_VERSION_MAJOR @PROJECT_VERSION_MAJOR@
11+
#cmakedefine PROJECT_VERSION_MINOR @PROJECT_VERSION_MINOR@
12+
#cmakedefine PROJECT_VERSION_PATCH @PROJECT_VERSION_PATCH@
13+
#cmakedefine PROJECT_VERSION "@PROJECT_VERSION@"

lib/CodeGen/Builtin.cpp

Lines changed: 23 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,19 @@
11
#include "CodeGen/Builtin.h"
2-
#include <iostream>
2+
#include "Exception/CodeGenException.h"
33

44
void BuiltinString::initialize(LLVMModule &module, LLVMContext &context) {
55
llvm::SMDiagnostic error;
6-
std::unique_ptr<LLVMModule> stringModule = llvm::parseIRFile(PROJECT_BINARY_DIR"/builtin/ss_string.bc", error, context);
7-
llvm::Linker::linkModules(module, std::move(stringModule));
6+
String stringBitcodeFilename = PROJECT_BINARY_DIR"/builtin/ss_string.bc";
7+
if (!llvm::sys::fs::exists(stringBitcodeFilename)) {
8+
throw CodeGenException("Not found " + stringBitcodeFilename);
9+
}
10+
std::unique_ptr<LLVMModule> stringModule = llvm::parseIRFile(stringBitcodeFilename, error, context);
11+
if (!stringModule) {
12+
throw CodeGenException("Parse bitcode file of the string module failed");
13+
}
14+
if (llvm::Linker::linkModules(module, std::move(stringModule))) {
15+
throw CodeGenException("Link string module failed");
16+
}
817
llvm::StructType *strStructType = module.getTypeByName("struct.ss_string");
918
type = strStructType->getPointerTo();
1019
createFunc = module.getFunction("ss_string_create");
@@ -23,8 +32,17 @@ void BuiltinString::initialize(LLVMModule &module, LLVMContext &context) {
2332

2433
void BuiltinIO::initialize(LLVMModule &module, LLVMContext &context) {
2534
llvm::SMDiagnostic error;
26-
std::unique_ptr<LLVMModule> ioModule = llvm::parseIRFile(PROJECT_BINARY_DIR"/builtin/ss_io.bc", error, context);
27-
llvm::Linker::linkModules(module, std::move(ioModule));
35+
String ioBitcodeFilename = PROJECT_BINARY_DIR"/builtin/ss_io.bc";
36+
if (!llvm::sys::fs::exists(ioBitcodeFilename)) {
37+
throw CodeGenException("Not found " + ioBitcodeFilename);
38+
}
39+
std::unique_ptr<LLVMModule> ioModule = llvm::parseIRFile(ioBitcodeFilename, error, context);
40+
if (!ioModule) {
41+
throw CodeGenException("Parse bitcode file of the io module failed");
42+
}
43+
if (llvm::Linker::linkModules(module, std::move(ioModule))) {
44+
throw CodeGenException("Link io module failed");
45+
}
2846
integer2stringFunc = module.getFunction("ss_integer2string");
2947
string2integerFunc = module.getFunction("ss_string2integer");
3048
printIntegerFunc = module.getFunction("ss_print_integer");

lib/CodeGen/IRGenerator.cpp

Lines changed: 6 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -62,11 +62,7 @@ void IRGenerator::visit(const SharedPtr<VarDeclNode> &varDecl) {
6262
if (varDecl->type == BuiltinTypeNode::BOOLEAN_TYPE) {
6363
alignment = 1;
6464
}
65-
#if LLVM_VERSION_MAJOR < 10
66-
gVar->setAlignment(alignment);
67-
#else
6865
gVar->setAlignment(llvm::MaybeAlign(alignment));
69-
#endif
7066
// 如果为字符串或者有非字面量的初始值
7167
if (isStringVar || (hasInitVal && !isLiteralInit)) {
7268
llvmIRBuilder.CreateStore(varDecl->initVal->code, gVar);
@@ -99,15 +95,12 @@ void IRGenerator::visit(const SharedPtr<FunctionDeclNode> &funcDecl) {
9995
LLVMBasicBlock *entryBlock = createBasicBlock("entry", func);
10096
llvmIRBuilder.SetInsertPoint(entryBlock);
10197

102-
{
103-
size_t i = 0;
104-
for (llvm::Argument &arg : func->args()) {
105-
arg.setName(funcDecl->params[i]->name);
106-
LLVMValue *paramAlloca = llvmIRBuilder.CreateAlloca(getType(funcDecl->params[i]->type));
107-
llvmIRBuilder.CreateStore(&arg, paramAlloca);
108-
funcDecl->params[i]->code = paramAlloca;
109-
i += 1;
110-
}
98+
for (size_t i = 0; i < func->arg_size(); ++i) {
99+
auto arg = func->getArg(i);
100+
arg->setName(funcDecl->params[i]->name);
101+
LLVMValue *paramAlloca = llvmIRBuilder.CreateAlloca(getType(funcDecl->params[i]->type));
102+
llvmIRBuilder.CreateStore(arg, paramAlloca);
103+
funcDecl->params[i]->code = paramAlloca;
111104
}
112105

113106
funcDecl->body->accept(shared_from_this());

lib/Driver/CMakeLists.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
set(CMAKE_CXX_FLAGS "-fvisibility=default -fvisibility-inlines-hidden")
2+
13
set(SRC Driver.cpp)
24

35
add_library(driver OBJECT ${SRC})

0 commit comments

Comments
 (0)