Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 19 additions & 3 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,10 @@ list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake/modules")
set(GOLLVM_USE_SPLIT_STACK ON CACHE BOOL "use split stack by default")
set(GOLLVM_DEFAULT_LINKER gold CACHE STRING "default linker for Go links")

string(REGEX REPLACE "-" " " lht_components ${LLVM_DEFAULT_TARGET_TRIPLE})
separate_arguments(lht_components)
list(GET lht_components 0 llarch)

include(CmakeUtils)
include(AddGollvm)

Expand All @@ -39,13 +43,25 @@ set(EXTCC "CC=${CMAKE_C_COMPILER}" "CXX=${CMAKE_CXX_COMPILER}")

set(gollvm_binroot "${CMAKE_CURRENT_BINARY_DIR}")

# Set MPN path according to the target processor

if( ${llarch} STREQUAL "x86_64" )
set(MPN_PATH "x86_64 generic")
elseif( ${llarch} STREQUAL "aarch64" )
set(MPN_PATH "arm64 generic")
elseif( ${llarch} STREQUAL "riscv64" )
set(MPN_PATH "riscv generic")
else()
message(SEND_ERROR "Arch ${llarch} not yet supported")
endif()

externalproject_add(libgmp
URL https://gmplib.org/download/gmp/gmp-6.2.0.tar.bz2 https://mirrors.kernel.org/gnu/gmp/gmp-6.2.0.tar.bz2
URL_MD5 c24161e0dd44cae78cd5f67193492a21
DOWNLOAD_DIR ${CMAKE_CURRENT_BINARY_DIR}/external-downloads
BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}/external/gmp-build
SOURCE_DIR ${CMAKE_CURRENT_BINARY_DIR}/external/gmp
CONFIGURE_COMMAND <SOURCE_DIR>/configure --prefix=${EXTINSTALLDIR} ${EXTCPPFLAGS} ${EXTLDFLAGS} ${EXTCC}
CONFIGURE_COMMAND <SOURCE_DIR>/configure --prefix=${EXTINSTALLDIR} ${EXTCPPFLAGS} ${EXTLDFLAGS} ${EXTCC} --build=${LLVM_HOST_TRIPLE} --host=${LLVM_DEFAULT_TARGET_TRIPLE} MPN_PATH=${MPN_PATH}
BUILD_COMMAND make -j${PROCESSOR_COUNT} install
LOG_CONFIGURE 1
LOG_BUILD 1
Expand All @@ -59,7 +75,7 @@ externalproject_add(libmpfr
DOWNLOAD_DIR ${CMAKE_CURRENT_BINARY_DIR}/external-downloads
BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}/external/mpfr
SOURCE_DIR ${CMAKE_CURRENT_BINARY_DIR}/external/mpfr
CONFIGURE_COMMAND <SOURCE_DIR>/configure --with-gmp=${CMAKE_CURRENT_BINARY_DIR}/external/gmp --prefix=${EXTINSTALLDIR} ${EXTCPPFLAGS} ${EXTLDFLAGS} ${EXTCC}
CONFIGURE_COMMAND <SOURCE_DIR>/configure --with-gmp=${CMAKE_CURRENT_BINARY_DIR}/external/gmp --prefix=${EXTINSTALLDIR} ${EXTCPPFLAGS} ${EXTLDFLAGS} ${EXTCC} -build=${LLVM_HOST_TRIPLE} --host=${LLVM_DEFAULT_TARGET_TRIPLE}
BUILD_COMMAND make -j${PROCESSOR_COUNT} install
LOG_CONFIGURE 1
LOG_BUILD 1
Expand All @@ -74,7 +90,7 @@ externalproject_add(libmpc
BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}/external/mpc
SOURCE_DIR ${CMAKE_CURRENT_BINARY_DIR}/external/mpc
PREFIX ${EXTINSTALLDIR}
CONFIGURE_COMMAND <SOURCE_DIR>/configure --with-gmp=${CMAKE_CURRENT_BINARY_DIR}/external/gmp --with-mpfr=${CMAKE_CURRENT_BINARY_DIR}/external/mpfr --prefix=${EXTINSTALLDIR} ${EXTCPPFLAGS} ${EXTLDFLAGS} ${EXTCC}
CONFIGURE_COMMAND <SOURCE_DIR>/configure --with-gmp=${CMAKE_CURRENT_BINARY_DIR}/external/gmp --with-mpfr=${CMAKE_CURRENT_BINARY_DIR}/external/mpfr --prefix=${EXTINSTALLDIR} ${EXTCPPFLAGS} ${EXTLDFLAGS} ${EXTCC} -build=${LLVM_HOST_TRIPLE} --host=${LLVM_DEFAULT_TARGET_TRIPLE}
BUILD_COMMAND make -j${PROCESSOR_COUNT} install
LOG_CONFIGURE 1
LOG_BUILD 1
Expand Down
55 changes: 54 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ source tree, then within the LLVM tree you check out additional git repos.
* [Invoking cmake and ninja](#cmakeninja)
* [Installing gollvm](#installing)
* [Using an installed copy of gollvm](#using)
* [Crosscompiling gollvm](#crosscompiling)
* [Information for gollvm developers](#developers)

[FAQ](#FAQ)
Expand Down Expand Up @@ -120,6 +121,58 @@ hi mom!
%
```

## Crosscompiling gollvm <a name="crosscompiling"></a>
You need a working version of gollvm on host system to cross compile. The following script will build and install gollvm on a cross compile system.

```
#!/bin/bash
set -e
mkdir -p build
cd build

RISCV=$HOME/toolchain
SOURCE=$HOME/llvm-project/llvm
TRIPLE=riscv64-unknown-linux-gnu
INSTALL=/tmp/gollvm-install

# host
cmake -G Ninja -S $SOURCE -B build-x86 \
-DCMAKE_INSTALL_PREFIX=install-x86 \
-DCMAKE_BUILD_TYPE=Debug \
-DLLVM_USE_LINKER=bfd \
-DGOLLVM_DEFAULT_LINKER=bfd \
-DLLVM_TARGET_ARCH="X86-64,RISCV64" \
-DLLVM_TARGETS_TO_BUILD="X86;RISCV"

# crosscompile
cmake -G Ninja -S $SOURCE -B build-riscv \
-DCMAKE_INSTALL_PREFIX=$INSTALL \
-DCMAKE_BUILD_TYPE=Debug \
-DLLVM_USE_LINKER=bfd \
-DGOLLVM_DEFAULT_LINKER=bfd \
-DCMAKE_CROSSCOMPILING=True \
-DLLVM_TARGET_ARCH=RISCV64 \
-DLLVM_DEFAULT_TARGET_TRIPLE=$TRIPLE \
-DLLVM_TARGETS_TO_BUILD=RISCV \
-DCMAKE_C_COMPILER=$RISCV/bin/$TRIPLE-gcc \
-DCMAKE_CXX_COMPILER=$RISCV/bin/$TRIPLE-g++ \
-DLLVM_TABLEGEN=$PWD/build-x86/bin/llvm-tblgen \
-DGOLLVM_DRIVER_DIR=$PWD/build-x86/bin \
-DGOLLVM_EXTRA_GOCFLAGS="--target=$TRIPLE \
--gcc-toolchain=$RISCV/ \
--sysroot=$RISCV/sysroot" \
-DGOLLVM_USE_SPLIT_STACK=OFF \
-DCMAKE_C_FLAGS=-latomic \
-DCMAKE_CXX_FLAGS=-latomic


# build gollvm crosscompiler
ninja -C build-x86 llvm-goc llvm-goc-token llvm-godumpspec

# cross compile gollvm, go tools and install
ninja -C build-riscv install-gollvm
```

# Information for gollvm developers <a name="developers"></a>

## Source code structure
Expand Down Expand Up @@ -269,7 +322,7 @@ inlining, vectorization, register allocation, etc.

## Which architectures and operating systems are supported for gollvm? <a name="supported"></a>

Gollvm is currently supported only for x86_64 and aarch64 Linux.
Gollvm is currently supported only for x86_64, aarch64 and riscv64 Linux.

## How does the gollvm runtime differ from the main Go runtime? <a name="runtimediffs"></a>

Expand Down
Loading