Aoik

LLVM - Compile LLVM

Compile on CentOS 7

Install GCC

Run:

yum install -y centos-release-scl

scl enable devtoolset-7 bash

Install CMake

Run:

mkdir -pv /opt/cmake/3.16.1

cd /opt/cmake/3.16.1

wget https://github.com/Kitware/CMake/releases/download/v3.16.1/cmake-3.16.1-Linux-x86_64.tar.gz

tar xvf cmake-3.16.1-Linux-x86_64.tar.gz

mv cmake-3.16.1-Linux-x86_64 dst

ln -sf /opt/cmake/3.16.1/dst/bin/cmake /usr/local/bin/cmake

Download LLVM source code

Run:

mkdir -pv /opt/llvm/9.0.1rc3

cd /opt/llvm/9.0.1rc3

wget https://github.com/llvm/llvm-project/releases/download/llvmorg-9.0.1-rc3/llvm-9.0.1rc3.src.tar.xz

tar xvf llvm-9.0.1rc3.src.tar.xz

mv llvm-9.0.1rc3.src src

Compile LLVM source code

Run:

mkdir -pv /opt/llvm/9.0.1rc3/dst

cd /opt/llvm/9.0.1rc3/dst

cmake ../src

make -j8

make install

-j8 uses 8 threads to compile. It may overload the OS and cause ld to be killed by the OS during linking, in which case we can rerun with make only.

Compile LLVM example code

Use clang++ to compile the example:

yum install llvm-toolset-7.0

scl enable llvm-toolset-7.0 bash

cd /opt/llvm/9.0.1rc3/src/examples/Kaleidoscope/Chapter2

clang++ -c $(llvm-config --cxxflags) toy.cpp -o toy.o

clang++ toy.o $(llvm-config --ldflags --libs) -ldl -lncurses -lpthread -lz -o toy

Somehow using g++ to compile the example failed with undefined reference error:

cd /opt/llvm/9.0.1rc3/src/examples/Kaleidoscope/Chapter2

g++ -c $(llvm-config --cxxflags) toy.cpp -o toy.o

g++ toy.o $(llvm-config --ldflags --libs) -ldl -lncurses -lpthread -lz -o toy

Compile on Windows

Install Visual Studio

We use Visual Studio 2017 to build LLVM.

Install CMake

Download CMake from here.

Decompress to D:\cmake\3.16.1\dst

Add directory path D:\cmake\3.16.1\dst\bin to environment variable PATH.

Compile zlib

Download zlib source code from here.

Decompress to D:\zlib\1.2.11\src.

Compile zlib:

mkdir D:\zlib\1.2.11\dst

cd D:\zlib\1.2.11\dst

cmake -G "Visual Studio 15 2017" -T host=x64 -A x64 ..\src

cmake --build . --config Release

The result file is D:\zlib\1.2.11\dst\Release\zlibstatic.lib.

Download LLVM source code

Download LLVM source code from here.

Decompress to D:\llvm\9.0.1rc3\src.

Rename D:\llvm\9.0.1rc3\src\bindings\_LLVMBuild.txt to D:\llvm\9.0.1rc3\src\bindings\LLVMBuild.txt.

Prepare build script

We use a modified version of the build script from the LLVM-Build-Windows project. The modification is needed to pass the correct architecture, build type and build directory to CMake.

Create build script build-llvm.bat:

@echo off
setlocal

REM
REM Convert backslashes to forward slashes for peace of mind.
REM
set CWD=%~dp0
set "CWD=%CWD:\=/%"

REM
REM Check what architecture we are running on
REM
if "%PROCESSOR_ARCHITECTURE%"=="AMD64" (
    echo Detected 64 bit system...
    set SYSARCH=64
) else if "%PROCESSOR_ARCHITECTURE%"=="x86" (
    if "%PROCESSOR_ARCHITEW6432%"=="AMD64" (
        echo Detected 64 bit system running 32 bit shell...
        set SYSARCH=64
    ) else (
        echo Detected 32 bit system...
        set SYSARCH=32
    )
) else (
    echo Error: Could not detect current platform architecture!"
    exit /b 5
)

REM
REM Iterate command line parameters
REM
:checkparams
REM Help option
if "x%~1" == "x-help" (
  call :printhelp "%~nx0"
  exit /b %ERRORLEVEL%
)
if "x%~1" == "x--help" (
  call :printhelp "%~nx0"
  exit /b %ERRORLEVEL%
)
if "x%~1" == "x-?" (
  call :printhelp "%~nx0"
  exit /b %ERRORLEVEL%
)
if "x%~1" == "x/?" (
  call :printhelp "%~nx0"
  exit /b %ERRORLEVEL%
)
if "x%~1" == "x-here" shift& set CHERE_INVOKING=enabled_from_arguments& goto :checkparams
if "x%~1" == "x-target" (
    if "x%~2" == "x" (
        echo Architecture was not defined for -target parameter. 1>&2
        exit /b 2
    )
    set TARGET_ARCH=%~2
)& shift& shift& goto :checkparams
if "x%~1" == "x-directory" (
    if "x%~2" == "x" (
        echo Build directory is not specified for -builddir parameter. 1>&2
        exit /b 2
    )
    if defined BUILD_DIR (
        echo Build directory cannot be defined more than once. 1>&2
        exit /b 3
    )
    if exist %~2 goto skip1
    echo Making new build directory "%~2"
    mkdir %~2
    :skip1
    cd /d "%~2" || (
        echo Cannot set specified build directory "%~2". 1>&2
        exit /b 2
    )
    set BUILD_DIR=%CWD%/%~2
)& shift& shift& goto :checkparams
if "x%~1" == "x-configure" shift& set CONFIGURE=yes& goto :checkparams
if "x%~1" == "x-build" shift& set BUILD=yes& goto :checkparams
if "x%~1" == "x-static" shift& set STATIC=yes& goto :checkparams
if "x%~1" == "x-debug" shift& set DEBUG=yes& goto :checkparams

if not defined DEBUG (set BUILD_TYPE=Release) else (set BUILD_TYPE=Debug)

:next
if not defined CONFIGURE (
    echo CONFIGURE=no
    goto nextparam1
) else (
    echo CONFIGURE=%CONFIGURE%
    goto nextparam1
)
:nextparam1
if not defined BUILD (
    echo BUILD=no
    goto nextparam2
) else (
    echo BUILD=%BUILD%
    goto nextparam2
)
:nextparam2
if not defined STATIC (
    echo STATIC=no
    goto nextparam3
) else (
    echo STATIC=%STATIC%
    goto nextparam3
)
:nextparam3
if not defined DEBUG (
    echo DEBUG=no
    goto nextparam4
) else (
    echo DEBUG=%DEBUG%
    goto nextparam4
)
:nextparam4
if not defined TARGET_ARCH (
    set TARGET_ARCH=amd64
    echo Defaulted TARGET_ARCH to amd64
    goto nextparam5
) else (
    echo TARGET_ARCH=%TARGET_ARCH%
    goto nextparam5
)
:nextparam5
echo BUILD_DIR=%BUILD_DIR%

REM
REM Check if already running in an environment with VS setup
REM
if defined VCINSTALLDIR (
    if defined VisualStudioVersion (
        echo Existing Visual Studio environment version %VisualStudioVersion% detected...
        if "%VisualStudioVersion%"=="15.0" (
            set MSVC_VER=15
            goto msvcdone
        ) else if "%VisualStudioVersion%"=="14.0" (
            set MSVC_VER=14
            goto msvcdone
        ) else if "%VisualStudioVersion%"=="12.0" (
            set MSVC_VER=12
            goto msvcdone
        ) else (
            echo Unknown Visual Studio environment detected '%VisualStudioVersion%', Creating a new one...
        )
    )
)
REM
REM Check for default install locations based on current system architecture
REM
if "%SYSARCH%"=="32" (
    set MSVCVARSDIR=
    set WOWNODE=
) else if "%SYSARCH%"=="64" (
    set MSVCVARSDIR=\amd64
    set WOWNODE=\WOW6432Node
) else (
    echo Error: Running on invalid architecture!
    exit /b 5
)
echo TARGET_ARCH=%TARGET_ARCH%
if "%TARGET_ARCH%" == "64" (
    set TARGET_ARCH_BITS=64
) else if "%TARGET_ARCH%" == "amd64" (
    set TARGET_ARCH_BITS=64
) else if "%TARGET_ARCH%" == "x64" (
    set TARGET_ARCH_BITS=64
) else if "%TARGET_ARCH%" == "32" (
    set TARGET_ARCH_BITS=32
) else if "%TARGET_ARCH%" == "Win32" (
    set TARGET_ARCH_BITS=32
) else if "%TARGET_ARCH%" == "x86" (
    set TARGET_ARCH_BITS=32
) else (
    echo Error: Invalid target architecture specified!
    exit /b 5
)
reg.exe query "HKLM\SOFTWARE%WOWNODE%\Microsoft\VisualStudio\SxS\VS7" /v "15.0" >nul 2>&1
if not ERRORLEVEL 1 (
    echo Visual Studio 2017 installation detected...
    for /f "skip=2 tokens=2,*" %%a in ('reg.exe query "HKLM\SOFTWARE%WOWNODE%\Microsoft\VisualStudio\SxS\VS7" /v "15.0"') do (
        if exist "%%bVC\Auxiliary\Build\vcvars%TARGET_ARCH_BITS%.bat" (
            set VSINSTALLDIR=%%b
            echo Found vcvars file at "%%bVC\Auxiliary\Build\vcvars%TARGET_ARCH_BITS%.bat"
            call "%%bVC\Auxiliary\Build\vcvars%TARGET_ARCH_BITS%.bat" >nul 2>&1
            goto breakoutmsvc15
        ) else (
            echo Error: vcvars "%%bVC\Auxiliary\Build\vcvars%TARGET_ARCH_BITS%.bat" not found!
        )
    )
    exit /b 5
    :breakoutmsvc15
    set MSVC_VER=15
    goto msvcdone
)
reg.exe query "HKLM\Software%WOWNODE%\Microsoft\VisualStudio\14.0" /v "InstallDir" >nul 2>&1
if not ERRORLEVEL 1 (
    echo Visual Studio 2015 installation detected...
    for /f "skip=2 tokens=2,*" %%a in ('reg.exe query "HKLM\Software%WOWNODE%\Microsoft\VisualStudio\14.0" /v "InstallDir"') do (
        if exist "%%b..\..\VC\bin%MSVCVARSDIR%\vcvars%TARGET_ARCH_BITS%.bat" (
            set VSINSTALLDIR=%%b..\..\
            echo Found vcvars file at "%%b..\..\VC\bin%MSVCVARSDIR%\vcvars%TARGET_ARCH_BITS%.bat"
            call "%%b..\..\VC\bin%MSVCVARSDIR%\vcvars%TARGET_ARCH_BITS%.bat" >nul 2>&1
            goto breakoutmsvc14
        ) else (
            echo Error: vcvars "%%b..\..\VC\bin%MSVCVARSDIR%\vcvars%TARGET_ARCH_BITS%.bat" not found!
        )
    )
    exit /b 5
    :breakoutmsvc14
    set MSVC_VER=14
    goto msvcdone
)
reg.exe query "HKLM\Software%WOWNODE%\Microsoft\VisualStudio\12.0" /v "InstallDir" >nul 2>&1
if not ERRORLEVEL 1 (
    echo Visual Studio 2013 installation detected...
    for /f "skip=2 tokens=2,*" %%a in ('reg.exe query "HKLM\Software%WOWNODE%\Microsoft\VisualStudio\12.0" /v "InstallDir"') do (
        if exist "%%b..\..\VC\bin%MSVCVARSDIR%\vcvars%TARGET_ARCH_BITS%.bat" (
            set VSINSTALLDIR=%%b..\..\
            echo Found vcvars file at "%%b..\..\VC\bin%MSVCVARSDIR%\vcvars%TARGET_ARCH_BITS%.bat"
            call "%%b..\..\VC\bin%MSVCVARSDIR%\vcvars%TARGET_ARCH_BITS%.bat" >nul 2>&1
            goto breakoutmsvc12
        ) else (
            echo Error: vcvars "%%b..\..\VC\bin%MSVCVARSDIR%\vcvars%TARGET_ARCH_BITS%.bat" not found!
        )
    )
     exit /b 5
    :breakoutmsvc12
    set MSVC_VER=12
    goto msvcdone
)
reg.exe query "HKLM\Software%WOWNODE%\Microsoft\VisualStudio\9.0" /v "InstallDir" >nul 2>&1
if not ERRORLEVEL 1 (
    echo Visual Studio 2008 installation detected...
    for /f "skip=2 tokens=2,*" %%a in ('reg.exe query "HKLM\Software%WOWNODE%\Microsoft\VisualStudio\12.0" /v "InstallDir"') do (
        if exist "%%b..\..\VC\bin%MSVCVARSDIR%\vcvars%TARGET_ARCH_BITS%.bat" (
            set VSINSTALLDIR=%%b..\..\
            echo Found vcvars file at "%%b..\..\VC\bin%MSVCVARSDIR%\vcvars%TARGET_ARCH_BITS%.bat"
            call "%%b..\..\VC\bin%MSVCVARSDIR%\vcvars%TARGET_ARCH_BITS%.bat" >nul 2>&1
            goto breakoutmsvc9
        ) else (
            echo Error: vcvars "%%b..\..\VC\bin%MSVCVARSDIR%\vcvars%TARGET_ARCH_BITS%.bat" not found!
        )
    )
     exit /b 5
    :breakoutmsvc9
    set MSVC_VER=9
    goto msvcdone
)
REM
REM If none were found check for an environment variable to help locate the VS installation
REM
if defined VS140COMNTOOLS (
    if exist "%VS140COMNTOOLS%\..\..\VC\vcvars%TARGET_ARCH_BITS%.bat" (
        set VSINSTALLDIR=%VS140COMNTOOLS%\..\..\
        echo Visual Studio 2015 environment detected through environment variable...
        call "%VS140COMNTOOLS%\..\..\VC\vcvars%TARGET_ARCH_BITS%.bat" >nul 2>&1
        set MSVC_VER=14
        goto msvcdone
    )
)
if defined VS120COMNTOOLS (
    if exist "%VS120COMNTOOLS%\..\..\VC\vcvars%TARGET_ARCH_BITS%.bat" (
        set VSINSTALLDIR=%VS120COMNTOOLS%\..\..\
        echo Visual Studio 2013 environment detected through environment variable...
        call "%VS120COMNTOOLS%\..\..\VC\vcvars%TARGET_ARCH_BITS%.bat" >nul 2>&1
        set MSVC_VER=12
        goto msvcdone
    )
)
echo Error: Could not find valid Visual Studio installation!
exit /b 6

:msvcdone

echo VSINSTALLDIR=%VSINSTALLDIR%

:checkconfigure
if defined CONFIGURE (
    echo Configuring...
    goto doconfigure
)
:checkbuild
if defined BUILD (
    echo Building...
    goto dobuild
)

:doconfigure
if not defined STATIC (set CRT_TYPE_RELEASE=MD& set CRT_TYPE_DEBUG=MDd) else (set CRT_TYPE_RELEASE=MT& set CRT_TYPE_DEBUG=MTd)
if "x%TARGET_ARCH_BITS%" == "x64" (set ARCH=x64) else (set ARCH=x86)
if "x%ARCH%" == "xx64" (set LLVM_BIN_PATH=C:/PROGRA~1/LLVM/bin) else (set LLVM_BIN_PATH=C:/PROGRA~2/LLVM/bin)
if "x%ARCH%" == "xx64" (set GENERATOR_PLATFORM=x64) else (set GENERATOR_PLATFORM=)

set ZLIB_PATH=%CWD%third-party/zlib
set ZLIB_LIBRARY_PATH=%ZLIB_PATH%/%ARCH%
set ZLIB_INCLUDE_PATH=%ZLIB_PATH%
echo ZLIB_PATH is %ZLIB_PATH%

cmake -T host=%ARCH% -A %ARCH% -H. -G"Visual Studio 15 2017" -B "%BUILD_DIR%"^
        -DBUILD_SHARED_LIBS=Off^
        -DLLVM_INCLUDE_TESTS=Off^
        -DLLVM_ENABLE_RTTI=0^
        -DLLVM_ENABLE_DIA_SDK=1^
        -DLLVM_USE_CRT_RELEASE=%CRT_TYPE_RELEASE%^
        -DLLVM_USE_CRT_DEBUG=%CRT_TYPE_DEBUG%^
        -DLLVM_TARGETS_TO_BUILD="X86"^
        -DHAVE_LIBZ=1^
        -DCMAKE_C_FLAGS="/I%ZLIB_INCLUDE_PATH% /DLLVM_ENABLE_DIA_SDK"^
        -DCMAKE_CXX_FLAGS="/I%ZLIB_INCLUDE_PATH% /DLLVM_ENABLE_DIA_SDK"^
        -DCMAKE_EXE_LINKER_FLAGS="%ZLIB_LIBRARY_PATH%/zlibstatic.lib"^
        -DCMAKE_STATIC_LINKER_FLAGS="%ZLIB_LIBRARY_PATH%/zlibstatic.lib"^
        -DCMAKE_SHARED_LINKER_FLAGS="%ZLIB_LIBRARY_PATH%/zlibstatic.lib"^
        -DCMAKE_GENERATOR_PLATFORM=%GENERATOR_PLATFORM%^
        -DCMAKE_BUILD_TYPE=%BUILD_TYPE%^
        %CWD%

if defined BUILD goto checkbuild
exit /b 0

:dobuild
echo %BUILD_TYPE%
cmake --build "%BUILD_DIR%" --config %BUILD_TYPE%
exit /b 0

:printhelp
echo Usage:
echo     %~1 [options]
echo.
echo Options:
echo     -configure                   Configure the project
echo     -build                       Build the project
echo     -static                      Configure and build the project statically
echo     -debug                       Build project with debug configuration
echo     -target ARCH                 Set the target architecture
echo     -directory DIRECTORY         Use specified DIRECTORY for build directory
echo     -help ^| --help ^| -? ^| /?     Display this help and exit
echo.
exit /b 0

pause>nul

Compile LLVM source code

Put D:\zlib\1.2.11\dst\Release\zlibstatic.lib to D:\llvm\9.0.1rc3\src\third-party\zlib\x64\zlibstatic.lib.

Put build script build-llvm.bat to D:\llvm\9.0.1rc3\src\build-llvm.bat.

Run:

cd D:\llvm\9.0.1rc3\src

build-llvm.bat -configure -static -target x64 -directory build_x64

build-llvm.bat -build -static -target x64 -directory build_x64

Compile LLVM example code

In Visual Studio 2017, create an Visual C++ - Empty Project.

In Solution Explorer, right click the project name, select Properties.

In Configuration Properties - C/C++ - General, set Additional Include Directories to be D:\llvm\9.0.1rc3\src\include;D:\llvm\9.0.1rc3\src\build_x64\include;.

In Configuration Properties - C/C++ - General, set SDL checks to be No (/sdl-).

In Configuration Properties - C/C++ - Code Generation, set Runtime Library to be Multi-threaded (/MT). This value should correspond to the build type:

  • Debug: Multi-threaded Debug (/MTd)
  • Release: Multi-threaded (/MT)
  • MinSizeRel: Multi-threaded DLL (/MD)
  • RelWithDebInfo: Multi-threaded DLL (/MD)

In Configuration Properties - Command Line, set Additional Options to be /wd4146 -D_CRT_SECURE_NO_WARNINGS -D_SCL_SECURE_NO_WARNINGS.

In Configuration Properties - Linker - General, set Additional Library Directories to be D:\llvm\9.0.1rc3\src\build_x64\Release\lib.

In Configuration Properties - Linker - Input, set Additional Dependencies to be LLVMDemangle.lib;LLVMSupport.lib;LLVMTableGen.lib;LLVMCore.lib;LLVMFuzzMutate.lib;LLVMIRReader.lib;LLVMCodeGen.lib;LLVMSelectionDAG.lib;LLVMAsmPrinter.lib;LLVMMIRParser.lib;LLVMGlobalISel.lib;LLVMBinaryFormat.lib;LLVMBitReader.lib;LLVMBitWriter.lib;LLVMBitstreamReader.lib;LLVMTransformUtils.lib;LLVMInstrumentation.lib;LLVMAggressiveInstCombine.lib;LLVMInstCombine.lib;LLVMScalarOpts.lib;LLVMipo.lib;LLVMVectorize.lib;LLVMObjCARCOpts.lib;LLVMCoroutines.lib;LLVMLinker.lib;LLVMAnalysis.lib;LLVMLTO.lib;LLVMMC.lib;LLVMMCParser.lib;LLVMMCDisassembler.lib;LLVMMCA.lib;LLVMObject.lib;LLVMObjectYAML.lib;LLVMOption.lib;LLVMRemarks.lib;LLVMDebugInfoDWARF.lib;LLVMDebugInfoGSYM.lib;LLVMDebugInfoMSF.lib;LLVMDebugInfoCodeView.lib;LLVMDebugInfoPDB.lib;LLVMSymbolize.lib;LLVMExecutionEngine.lib;LLVMInterpreter.lib;LLVMJITLink.lib;LLVMMCJIT.lib;LLVMOrcJIT.lib;LLVMRuntimeDyld.lib;LLVMTarget.lib;LLVMX86CodeGen.lib;LLVMX86AsmParser.lib;LLVMX86Disassembler.lib;LLVMX86Desc.lib;LLVMX86Info.lib;LLVMX86Utils.lib;LLVMAsmParser.lib;LLVMLineEditor.lib;LLVMProfileData.lib;LLVMCoverage.lib;LLVMPasses.lib;LLVMTextAPI.lib;LLVMDlltoolDriver.lib;LLVMLibDriver.lib;LLVMXRay.lib;LLVMWindowsManifest.lib;LLVM-C.lib;Remarks.lib;.

Create a main.cpp file.

Copy the content of D:\llvm\9.0.1rc3\src\examples\Kaleidoscope\Chapter2\toy.cpp to main.cpp.

Now the project can be built.

Previous Post:
Next Post:

Comments:

Reply to: