Skip to content

Commit a5045f7

Browse files
committed
[js] start js bindings
1 parent a2f27dc commit a5045f7

File tree

6 files changed

+108
-3
lines changed

6 files changed

+108
-3
lines changed

.github/workflows/build_llvm.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ on:
1919
- ".github/workflows/build_llvm.yml"
2020
- "build_tools/cmake/llvm_cache.cmake"
2121
- "build_tools/cmake/llvm_wasm_cache.cmake"
22+
- "build_tools/cmake/llvm_wasm_project_include.cmake"
2223
- "build_tools/build_llvm.sh"
2324
- "build_tools/build_llvm_wasi.sh"
2425
- "third_party/llvm-project"
@@ -28,6 +29,7 @@ on:
2829
paths:
2930
- "build_tools/cmake/llvm_cache.cmake"
3031
- "build_tools/cmake/llvm_wasm_cache.cmake"
32+
- "build_tools/cmake/llvm_wasm_project_include.cmake"
3133
- "build_tools/build_llvm.sh"
3234
- "build_tools/build_llvm_wasi.sh"
3335
- "third_party/llvm-project"

build_tools/build_llvm_wasi.sh

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,21 +31,22 @@ echo "*********************** BUILDING LLVM *********************************"
3131
# hack to emit html wrappers
3232
# https://stackoverflow.com/a/75596433/9045206
3333
sed -i.bak 's/CMAKE_EXECUTABLE_SUFFIX ".js"/CMAKE_EXECUTABLE_SUFFIX ".html"/g' "$EMSDK/upstream/emscripten/cmake/Modules/Platform/Emscripten.cmake"
34+
sed -i.bak 's/if(LLVM_ENABLE_PIC)/if(LLVM_ENABLE_PIC)\nreturn()\nendif()\nif(LLVM_ENABLE_PIC)/g' "${LLVM_SOURCE_DIR}/mlir/lib/ExecutionEngine/CMakeLists.txt"
3435

3536
cmake_options=(
3637
-GNinja
3738
-S "${LLVM_SOURCE_DIR}/llvm"
3839
-B "${LLVM_BUILD_DIR}"
39-
# optimize for size
4040
-DCMAKE_C_FLAGS="-Os"
4141
-DCMAKE_CXX_FLAGS="-Os"
4242
-DCMAKE_BUILD_TYPE=Release
43-
-DCMAKE_EXE_LINKER_FLAGS="--emit-symbol-map -sSTANDALONE_WASM=1 -sWASM=1 -sWASM_BIGINT=1 -sEXPORT_ALL=0 -sEXPORTED_RUNTIME_METHODS=cwrap,ccall,getValue,setValue,writeAsciiToMemory,wasmTable -lembind"
43+
-DCMAKE_EXE_LINKER_FLAGS="--emit-symbol-map -sSTANDALONE_WASM=1 -sWASM=1 -sWASM_BIGINT=1 -sEXPORT_ALL=1 -sEXPORTED_RUNTIME_METHODS=cwrap,ccall,getValue,setValue,writeAsciiToMemory,wasmTable --minify 0 -lembind"
4444
-DCMAKE_INSTALL_PREFIX="${LLVM_INSTALL_DIR}"
4545
-DCMAKE_SYSTEM_NAME=Emscripten
4646
-DCMAKE_TOOLCHAIN_FILE="$EMSDK/upstream/emscripten/cmake/Modules/Platform/Emscripten.cmake"
4747
-DCROSS_TOOLCHAIN_FLAGS_NATIVE="-DCMAKE_C_COMPILER=$CC;-DCMAKE_CXX_COMPILER=$CXX"
4848
-C "$TD/cmake/llvm_wasm_cache.cmake"
49+
-DCMAKE_PROJECT_INCLUDE="$TD/cmake/llvm_wasm_project_include.cmake"
4950
)
5051

5152
echo "Source Directory: ${LLVM_SOURCE_DIR}"
@@ -57,6 +58,10 @@ cmake --build "${LLVM_BUILD_DIR}" \
5758
--target install-mlirdevelopment-distribution
5859

5960
sed -i.bak 's/CMAKE_EXECUTABLE_SUFFIX ".html"/CMAKE_EXECUTABLE_SUFFIX ".js"/g' "$EMSDK/upstream/emscripten/cmake/Modules/Platform/Emscripten.cmake"
61+
# https://stackoverflow.com/a/1252191/9045206
62+
sed -i.bak -e ':a' -e 'N' -e '$!ba' -e 's/if(LLVM_ENABLE_PIC)\nreturn()\nendif()\n//g' "${LLVM_SOURCE_DIR}/mlir/lib/ExecutionEngine/CMakeLists.txt"
63+
6064

6165
# wasi files aren't installed for some reason
6266
cp "${LLVM_BUILD_DIR}"/bin/* "${LLVM_INSTALL_DIR}/bin"
67+
cp "${LLVM_BUILD_DIR}"/lib/*.symbols "${LLVM_INSTALL_DIR}/lib"

build_tools/cmake/llvm_wasm_cache.cmake

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,15 @@ set(LLVM_ENABLE_LIBEDIT OFF CACHE BOOL "")
1313
set(LLVM_ENABLE_LIBPFM OFF CACHE BOOL "")
1414
set(LLVM_ENABLE_LIBXML2 OFF CACHE BOOL "")
1515
set(LLVM_ENABLE_OCAMLDOC OFF CACHE BOOL "")
16-
set(LLVM_ENABLE_PIC OFF CACHE BOOL "")
16+
17+
set(LLVM_BUILD_LLVM_DYLIB ON CACHE BOOL "")
18+
set(MLIR_BUILD_MLIR_C_DYLIB ON CACHE BOOL "")
19+
# when building libLLVM
20+
# relocation R_WASM_MEMORY_ADDR_SLEB cannot be used against symbol
21+
set(LLVM_ENABLE_PIC ON CACHE BOOL "")
22+
set(MLIR_ENABLE_SPIRV_CPU_RUNNER OFF)
23+
set(MLIR_ENABLE_EXECUTION_ENGINE OFF)
24+
1725
set(LLVM_ENABLE_THREADS OFF CACHE BOOL "")
1826
set(LLVM_ENABLE_UNWIND_TABLES OFF CACHE BOOL "")
1927
set(LLVM_ENABLE_ZLIB OFF CACHE BOOL "")
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
# everything in here gets run at the end of the project loading
2+
# https://github.com/emscripten-core/emscripten/issues/15276#issuecomment-1039349267
3+
set_property(GLOBAL PROPERTY TARGET_SUPPORTS_SHARED_LIBS TRUE)
4+
# so that the correct LLVM_ABI macros get set
5+
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D__ELF__")
6+
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -D__ELF__")
7+
set(CMAKE_SHARED_LIBRARY_CREATE_C_FLAGS "-sSIDE_MODULE=1 -sEXPORT_ALL=1 --emit-symbol-map")
8+
set(CMAKE_SHARED_LIBRARY_CREATE_CXX_FLAGS "-sSIDE_MODULE=1 -sEXPORT_ALL=1 --emit-symbol-map")
9+
# prevent duplicated libs from being linked
10+
# will need to be renamed to DEDUPLICATION when CMake version catches up
11+
# https://github.com/Kitware/CMake/commit/5617c34c3135f7ec203d5a48b803eb323f458bc3#diff-17fc647759070cdaddd99e9ad994c4478860d9c301ed9a9a9f061a8825c8b690L20
12+
set(CMAKE_C_LINK_LIBRARIES_PROCESSING ORDER=FORWARD UNICITY=ALL)
13+
set(CMAKE_CXX_LINK_LIBRARIES_PROCESSING ORDER=FORWARD UNICITY=ALL)
14+
# hack to prevent -Bsymbolic
15+
set(LLVM_LINKER_IS_SOLARISLD_ILLUMOS ON)
16+
set(CMAKE_SHARED_LIBRARY_SUFFIX ".wasm")
17+
set(CMAKE_STRIP FALSE)

projects/js/embindings/CMakeLists.txt

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
cmake_minimum_required(VERSION 3.29)
2+
project(eudsl-embindings LANGUAGES CXX C)
3+
set(CMAKE_C_STANDARD 11)
4+
set(CMAKE_CXX_STANDARD 17)
5+
6+
if(CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR OR EUDSL_OUT_OF_TREE_BUILD)
7+
find_package(MLIR REQUIRED CONFIG)
8+
find_package(LLVM REQUIRED CONFIG)
9+
message(STATUS "Using MLIRConfig.cmake in: ${MLIR_DIR}")
10+
message(STATUS "Using LLVMConfig.cmake in: ${LLVM_DIR}")
11+
set(LLVM_RUNTIME_OUTPUT_INTDIR ${CMAKE_BINARY_DIR}/bin)
12+
set(LLVM_LIBRARY_OUTPUT_INTDIR ${CMAKE_BINARY_DIR}/lib)
13+
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
14+
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
15+
list(APPEND CMAKE_MODULE_PATH "${MLIR_CMAKE_DIR}")
16+
list(APPEND CMAKE_MODULE_PATH "${LLVM_CMAKE_DIR}")
17+
include(TableGen)
18+
include(AddLLVM)
19+
include(AddMLIR)
20+
include(HandleLLVMOptions)
21+
else()
22+
set(MLIR_MAIN_SRC_DIR ${LLVM_MAIN_SRC_DIR}/../mlir)
23+
set(MLIR_INCLUDE_DIR ${LLVM_MAIN_SRC_DIR}/../mlir/include)
24+
set(MLIR_GENERATED_INCLUDE_DIR ${LLVM_BINARY_DIR}/tools/mlir/include)
25+
set(MLIR_INCLUDE_DIRS "${MLIR_INCLUDE_DIR};${MLIR_GENERATED_INCLUDE_DIR}")
26+
endif()
27+
include_directories(${LLVM_INCLUDE_DIRS})
28+
include_directories(${MLIR_INCLUDE_DIRS})
29+
30+
set_property(GLOBAL PROPERTY TARGET_SUPPORTS_SHARED_LIBS TRUE)
31+
set(CMAKE_SHARED_LIBRARY_CREATE_C_FLAGS "-s SIDE_MODULE=1")
32+
set(CMAKE_SHARED_LIBRARY_CREATE_CXX_FLAGS "-s SIDE_MODULE=1")
33+
set(CMAKE_STRIP FALSE) # used by default in pybind11 on .so modules
34+
35+
add_library(example SHARED example.cpp)
36+
target_link_libraries(example PUBLIC MLIRIR)

projects/js/embindings/example.cpp

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
//
2+
// Created by maksim on 11/14/24.
3+
//
4+
5+
#include <emscripten/bind.h>
6+
#include <string>
7+
#include <vector>
8+
#include <optional>
9+
10+
using namespace emscripten;
11+
12+
std::vector<int> returnVectorData () {
13+
std::vector<int> v(10, 1);
14+
return v;
15+
}
16+
17+
std::map<int, std::string> returnMapData () {
18+
std::map<int, std::string> m;
19+
m.insert(std::pair<int, std::string>(10, "This is a string."));
20+
return m;
21+
}
22+
23+
std::optional<std::string> returnOptionalData() {
24+
return "hello";
25+
}
26+
27+
EMSCRIPTEN_BINDINGS(module) {
28+
function("returnVectorData", &returnVectorData);
29+
function("returnMapData", &returnMapData);
30+
function("returnOptionalData", &returnOptionalData);
31+
32+
// register bindings for std::vector<int>, std::map<int, std::string>, and
33+
// std::optional<std::string>.
34+
register_vector<int>("vector<int>");
35+
register_map<int, std::string>("map<int, string>");
36+
register_optional<std::string>();
37+
}

0 commit comments

Comments
 (0)