mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2024-11-23 13:50:11 +00:00
9e3d59e4c2
This patch fixes the flang detection in the openmp fortran offloading test. Reviewed By: jsjodin Differential Revision: https://reviews.llvm.org/D158546
396 lines
15 KiB
ReStructuredText
396 lines
15 KiB
ReStructuredText
========================================
|
|
How to Build the LLVM* OpenMP* Libraries
|
|
========================================
|
|
This repository requires `CMake <http://www.cmake.org/>`_ v2.8.0 or later. LLVM
|
|
and Clang need a more recent version which also applies for in-tree builds. For
|
|
more information than available in this document please see
|
|
`LLVM's CMake documentation <https://llvm.org/docs/CMake.html>`_ and the
|
|
`official documentation <https://cmake.org/cmake/help/v2.8.0/cmake.html>`_.
|
|
|
|
.. contents::
|
|
:local:
|
|
|
|
How to Call CMake Initially, then Repeatedly
|
|
============================================
|
|
- When calling CMake for the first time, all needed compiler options must be
|
|
specified on the command line. After this initial call to CMake, the compiler
|
|
definitions must not be included for further calls to CMake. Other options
|
|
can be specified on the command line multiple times including all definitions
|
|
in the build options section below.
|
|
- Example of configuring, building, reconfiguring, rebuilding:
|
|
|
|
.. code-block:: console
|
|
|
|
$ mkdir build
|
|
$ cd build
|
|
$ cmake -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ .. # Initial configuration
|
|
$ make
|
|
...
|
|
$ make clean
|
|
$ cmake -DCMAKE_BUILD_TYPE=Debug .. # Second configuration
|
|
$ make
|
|
...
|
|
$ rm -rf *
|
|
$ cmake -DCMAKE_C_COMPILER=gcc -DCMAKE_CXX_COMPILER=g++ .. # Third configuration
|
|
$ make
|
|
|
|
- Notice in the example how the compiler definitions are only specified for an
|
|
empty build directory, but other build options are used at any time.
|
|
- The file ``CMakeCache.txt`` which is created after the first call to CMake is
|
|
a configuration file which holds all values for the build options. These
|
|
values can be changed using a text editor to modify ``CMakeCache.txt`` as
|
|
opposed to using definitions on the command line.
|
|
- To have CMake create a particular type of build generator file simply include
|
|
the ``-G <Generator name>`` option:
|
|
|
|
.. code-block:: console
|
|
|
|
$ cmake -G "Unix Makefiles" ...
|
|
|
|
You can see a list of generators CMake supports by executing the cmake command
|
|
with no arguments.
|
|
|
|
Instructions to Build
|
|
=====================
|
|
.. code-block:: console
|
|
|
|
$ cd openmp_top_level/ [ this directory with libomptarget/, runtime/, etc. ]
|
|
$ mkdir build
|
|
$ cd build
|
|
|
|
[ Unix* Libraries ]
|
|
$ cmake -DCMAKE_C_COMPILER=<C Compiler> -DCMAKE_CXX_COMPILER=<C++ Compiler> ..
|
|
|
|
[ Windows* Libraries ]
|
|
$ cmake -G <Generator Type> -DCMAKE_C_COMPILER=<C Compiler> -DCMAKE_CXX_COMPILER=<C++ Compiler> -DCMAKE_ASM_MASM_COMPILER=[ml | ml64] -DCMAKE_BUILD_TYPE=Release ..
|
|
|
|
$ make
|
|
$ make install
|
|
|
|
CMake Options
|
|
=============
|
|
Builds with CMake can be customized by means of options as already seen above.
|
|
One possibility is to pass them via the command line:
|
|
|
|
.. code-block:: console
|
|
|
|
$ cmake -DOPTION=<value> path/to/source
|
|
|
|
.. note:: The first value listed is the respective default for that option.
|
|
|
|
Generic Options
|
|
---------------
|
|
For full documentation consult the CMake manual or execute
|
|
``cmake --help-variable VARIABLE_NAME`` to get information about a specific
|
|
variable.
|
|
|
|
**CMAKE_BUILD_TYPE** = ``Release|Debug|RelWithDebInfo``
|
|
Build type can be ``Release``, ``Debug``, or ``RelWithDebInfo`` which chooses
|
|
the optimization level and presence of debugging symbols.
|
|
|
|
**CMAKE_C_COMPILER** = <C compiler name>
|
|
Specify the C compiler.
|
|
|
|
**CMAKE_CXX_COMPILER** = <C++ compiler name>
|
|
Specify the C++ compiler.
|
|
|
|
**CMAKE_Fortran_COMPILER** = <Fortran compiler name>
|
|
Specify the Fortran compiler. This option is only needed when
|
|
**LIBOMP_FORTRAN_MODULES** is ``ON`` (see below). So typically, a Fortran
|
|
compiler is not needed during the build.
|
|
|
|
**CMAKE_ASM_MASM_COMPILER** = ``ml|ml64``
|
|
This option is only relevant for Windows*.
|
|
|
|
Options for all Libraries
|
|
-------------------------
|
|
|
|
**OPENMP_ENABLE_WERROR** = ``OFF|ON``
|
|
Treat warnings as errors and fail, if a compiler warning is triggered.
|
|
|
|
**OPENMP_LIBDIR_SUFFIX** = ``""``
|
|
Extra suffix to append to the directory where libraries are to be installed.
|
|
|
|
**OPENMP_TEST_C_COMPILER** = ``${CMAKE_C_COMPILER}``
|
|
Compiler to use for testing. Defaults to the compiler that was also used for
|
|
building.
|
|
|
|
**OPENMP_TEST_CXX_COMPILER** = ``${CMAKE_CXX_COMPILER}``
|
|
Compiler to use for testing. Defaults to the compiler that was also used for
|
|
building.
|
|
|
|
**OPENMP_TEST_Fortran_COMPILER** = ``${CMAKE_Fortran_COMPILER}``
|
|
Compiler to use for testing. Defaults to the compiler that was also used for
|
|
building. Will default to flang if build is in-tree.
|
|
|
|
**OPENMP_LLVM_TOOLS_DIR** = ``/path/to/built/llvm/tools``
|
|
Additional path to search for LLVM tools needed by tests.
|
|
|
|
**OPENMP_LLVM_LIT_EXECUTABLE** = ``/path/to/llvm-lit``
|
|
Specify full path to ``llvm-lit`` executable for running tests. The default
|
|
is to search the ``PATH`` and the directory in **OPENMP_LLVM_TOOLS_DIR**.
|
|
|
|
**OPENMP_FILECHECK_EXECUTABLE** = ``/path/to/FileCheck``
|
|
Specify full path to ``FileCheck`` executable for running tests. The default
|
|
is to search the ``PATH`` and the directory in **OPENMP_LLVM_TOOLS_DIR**.
|
|
|
|
**OPENMP_NOT_EXECUTABLE** = ``/path/to/not``
|
|
Specify full path to ``not`` executable for running tests. The default
|
|
is to search the ``PATH`` and the directory in **OPENMP_LLVM_TOOLS_DIR**.
|
|
|
|
Options for ``libomp``
|
|
----------------------
|
|
|
|
**LIBOMP_ARCH** = ``aarch64|arm|i386|loongarch64|mic|mips|mips64|ppc64|ppc64le|x86_64|riscv64``
|
|
The default value for this option is chosen based on probing the compiler for
|
|
architecture macros (e.g., is ``__x86_64__`` predefined by compiler?).
|
|
|
|
**LIBOMP_MIC_ARCH** = ``knc|knf``
|
|
Intel(R) Many Integrated Core Architecture (Intel(R) MIC Architecture) to
|
|
build for. This value is ignored if **LIBOMP_ARCH** does not equal ``mic``.
|
|
|
|
**LIBOMP_LIB_TYPE** = ``normal|profile|stubs``
|
|
Library type can be ``normal``, ``profile``, or ``stubs``.
|
|
|
|
**LIBOMP_USE_VERSION_SYMBOLS** = ``ON|OFF``
|
|
Use versioned symbols for building the library. This option only makes sense
|
|
for ELF based libraries where version symbols are supported (Linux*, some BSD*
|
|
variants). It is ``OFF`` by default for Windows* and macOS*, but ``ON`` for
|
|
other Unix based operating systems.
|
|
|
|
**LIBOMP_ENABLE_SHARED** = ``ON|OFF``
|
|
Build a shared library. If this option is ``OFF``, static OpenMP libraries
|
|
will be built instead of dynamic ones.
|
|
|
|
.. note::
|
|
|
|
Static libraries are not supported on Windows*.
|
|
|
|
**LIBOMP_FORTRAN_MODULES** = ``OFF|ON``
|
|
Create the Fortran modules (requires Fortran compiler).
|
|
|
|
macOS* Fat Libraries
|
|
""""""""""""""""""""
|
|
On macOS* machines, it is possible to build universal (or fat) libraries which
|
|
include both i386 and x86_64 architecture objects in a single archive.
|
|
|
|
.. code-block:: console
|
|
|
|
$ cmake -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ -DCMAKE_OSX_ARCHITECTURES='i386;x86_64' ..
|
|
$ make
|
|
|
|
There is also an option **LIBOMP_OSX_ARCHITECTURES** which can be set in case
|
|
this is an LLVM source tree build. It will only apply for the ``libomp`` library
|
|
avoids having the entire LLVM/Clang build produce universal binaries.
|
|
|
|
Optional Features
|
|
"""""""""""""""""
|
|
|
|
**LIBOMP_USE_ADAPTIVE_LOCKS** = ``ON|OFF``
|
|
Include adaptive locks, based on Intel(R) Transactional Synchronization
|
|
Extensions (Intel(R) TSX). This feature is x86 specific and turned ``ON``
|
|
by default for IA-32 architecture and Intel(R) 64 architecture.
|
|
|
|
**LIBOMP_USE_INTERNODE_ALIGNMENT** = ``OFF|ON``
|
|
Align certain data structures on 4096-byte. This option is useful on
|
|
multi-node systems where a small ``CACHE_LINE`` setting leads to false sharing.
|
|
|
|
**LIBOMP_OMPT_SUPPORT** = ``ON|OFF``
|
|
Include support for the OpenMP Tools Interface (OMPT).
|
|
This option is supported and ``ON`` by default for x86, x86_64, AArch64,
|
|
PPC64, RISCV64 and LoongArch64 on Linux* and macOS*.
|
|
This option is ``OFF`` if this feature is not supported for the platform.
|
|
|
|
**LIBOMP_OMPT_OPTIONAL** = ``ON|OFF``
|
|
Include support for optional OMPT functionality. This option is ignored if
|
|
**LIBOMP_OMPT_SUPPORT** is ``OFF``.
|
|
|
|
**LIBOMP_STATS** = ``OFF|ON``
|
|
Include stats-gathering code.
|
|
|
|
**LIBOMP_USE_DEBUGGER** = ``OFF|ON``
|
|
Include the friendly debugger interface.
|
|
|
|
**LIBOMP_USE_HWLOC** = ``OFF|ON``
|
|
Use `OpenMPI's hwloc library <https://www.open-mpi.org/projects/hwloc/>`_ for
|
|
topology detection and affinity.
|
|
|
|
**LIBOMP_HWLOC_INSTALL_DIR** = ``/path/to/hwloc/install/dir``
|
|
Specify install location of hwloc. The configuration system will look for
|
|
``hwloc.h`` in ``${LIBOMP_HWLOC_INSTALL_DIR}/include`` and the library in
|
|
``${LIBOMP_HWLOC_INSTALL_DIR}/lib``. The default is ``/usr/local``.
|
|
This option is only used if **LIBOMP_USE_HWLOC** is ``ON``.
|
|
|
|
Additional Compiler Flags
|
|
"""""""""""""""""""""""""
|
|
|
|
These flags are **appended**, they do not overwrite any of the preset flags.
|
|
|
|
**LIBOMP_CPPFLAGS** = <space-separated flags>
|
|
Additional C preprocessor flags.
|
|
|
|
**LIBOMP_CXXFLAGS** = <space-separated flags>
|
|
Additional C++ compiler flags.
|
|
|
|
**LIBOMP_ASMFLAGS** = <space-separated flags>
|
|
Additional assembler flags.
|
|
|
|
**LIBOMP_LDFLAGS** = <space-separated flags>
|
|
Additional linker flags.
|
|
|
|
**LIBOMP_LIBFLAGS** = <space-separated flags>
|
|
Additional libraries to link.
|
|
|
|
**LIBOMP_FFLAGS** = <space-separated flags>
|
|
Additional Fortran compiler flags.
|
|
|
|
Options for ``libomptarget``
|
|
----------------------------
|
|
|
|
An installed LLVM package is a prerequisite for building ``libomptarget``
|
|
library. So ``libomptarget`` may only be built in two cases:
|
|
|
|
- As a project of a regular LLVM build via **LLVM_ENABLE_PROJECTS**,
|
|
**LLVM_EXTERNAL_PROJECTS**, or **LLVM_ENABLE_RUNTIMES** or
|
|
- as a standalone project build that uses a pre-installed LLVM package.
|
|
In this mode one has to make sure that the default CMake
|
|
``find_package(LLVM)`` call `succeeds <https://cmake.org/cmake/help/latest/command/find_package.html#search-procedure>`_.
|
|
|
|
**LIBOMPTARGET_OPENMP_HEADER_FOLDER** = ``""``
|
|
Path of the folder that contains ``omp.h``. This is required for testing
|
|
out-of-tree builds.
|
|
|
|
**LIBOMPTARGET_OPENMP_HOST_RTL_FOLDER** = ``""``
|
|
Path of the folder that contains ``libomp.so``, and ``libLLVMSupport.so``
|
|
when profiling is enabled. This is required for testing.
|
|
|
|
Options for ``NVPTX device RTL``
|
|
--------------------------------
|
|
|
|
**LIBOMPTARGET_NVPTX_ENABLE_BCLIB** = ``ON|OFF``
|
|
Enable CUDA LLVM bitcode offloading device RTL. This is used for link time
|
|
optimization of the OMP runtime and application code. This option is enabled
|
|
by default if the build system determines that `CMAKE_C_COMPILER` is able to
|
|
compile and link the library.
|
|
|
|
**LIBOMPTARGET_NVPTX_CUDA_COMPILER** = ``""``
|
|
Location of a CUDA compiler capable of emitting LLVM bitcode. Currently only
|
|
the Clang compiler is supported. This is only used when building the CUDA LLVM
|
|
bitcode offloading device RTL. If unspecified, either the Clang from the build
|
|
itself is used (i.e. an in-tree build with LLVM_ENABLE_PROJECTS including
|
|
clang), or the Clang compiler that the build uses as C compiler
|
|
(CMAKE_C_COMPILER; only if it is Clang). The latter is common for a
|
|
stage2-build or when using -DLLVM_ENABLE_RUNTIMES=openmp.
|
|
|
|
**LIBOMPTARGET_NVPTX_BC_LINKER** = ``""``
|
|
Location of a linker capable of linking LLVM bitcode objects. This is only
|
|
used when building the CUDA LLVM bitcode offloading device RTL. If
|
|
unspecified, either the llvm-link in that same directory as
|
|
LIBOMPTARGET_NVPTX_CUDA_COMPILER is used, or the llvm-link from the
|
|
same build (available in an in-tree build).
|
|
|
|
**LIBOMPTARGET_NVPTX_ALTERNATE_HOST_COMPILER** = ``""``
|
|
Host compiler to use with NVCC. This compiler is not going to be used to
|
|
produce any binary. Instead, this is used to overcome the input compiler
|
|
checks done by NVCC. E.g. if using a default host compiler that is not
|
|
compatible with NVCC, this option can be use to pass to NVCC a valid compiler
|
|
to avoid the error.
|
|
|
|
**LIBOMPTARGET_NVPTX_COMPUTE_CAPABILITIES** = ``35``
|
|
List of CUDA compute capabilities that should be supported by the NVPTX
|
|
device RTL. E.g. for compute capabilities 6.0 and 7.0, the option "60;70"
|
|
should be used. Compute capability 3.5 is the minimum required.
|
|
|
|
**LIBOMPTARGET_NVPTX_DEBUG** = ``OFF|ON``
|
|
Enable printing of debug messages from the NVPTX device RTL.
|
|
|
|
**LIBOMPTARGET_LIT_ARGS** = ``""``
|
|
Arguments given to lit. ``make check-libomptarget`` and
|
|
``make check-libomptarget-*`` are affected. For example, use
|
|
``LIBOMPTARGET_LIT_ARGS="-j4"`` to force ``lit`` to start only four parallel
|
|
jobs instead of by default the number of threads in the system.
|
|
|
|
Example Usages of CMake
|
|
=======================
|
|
|
|
Typical Invocations
|
|
-------------------
|
|
|
|
.. code-block:: console
|
|
|
|
$ cmake -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ ..
|
|
$ cmake -DCMAKE_C_COMPILER=gcc -DCMAKE_CXX_COMPILER=g++ ..
|
|
$ cmake -DCMAKE_C_COMPILER=icc -DCMAKE_CXX_COMPILER=icpc ..
|
|
|
|
Advanced Builds with Various Options
|
|
------------------------------------
|
|
|
|
- Build the i386 Linux* library using GCC*
|
|
|
|
.. code-block:: console
|
|
|
|
$ cmake -DCMAKE_C_COMPILER=gcc -DCMAKE_CXX_COMPILER=g++ -DLIBOMP_ARCH=i386 ..
|
|
|
|
- Build the x86_64 debug Mac library using Clang*
|
|
|
|
.. code-block:: console
|
|
|
|
$ cmake -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ -DLIBOMP_ARCH=x86_64 -DCMAKE_BUILD_TYPE=Debug ..
|
|
|
|
- Build the library (architecture determined by probing compiler) using the
|
|
Intel(R) C Compiler and the Intel(R) C++ Compiler. Also, create Fortran
|
|
modules with the Intel(R) Fortran Compiler.
|
|
|
|
.. code-block:: console
|
|
|
|
$ cmake -DCMAKE_C_COMPILER=icc -DCMAKE_CXX_COMPILER=icpc -DCMAKE_Fortran_COMPILER=ifort -DLIBOMP_FORTRAN_MODULES=on ..
|
|
|
|
- Have CMake find the C/C++ compiler and specify additional flags for the
|
|
preprocessor and C++ compiler.
|
|
|
|
.. code-blocks:: console
|
|
|
|
$ cmake -DLIBOMP_CPPFLAGS='-DNEW_FEATURE=1 -DOLD_FEATURE=0' -DLIBOMP_CXXFLAGS='--one-specific-flag --two-specific-flag' ..
|
|
|
|
- Build the stubs library
|
|
|
|
.. code-blocks:: console
|
|
|
|
$ cmake -DCMAKE_C_COMPILER=gcc -DCMAKE_CXX_COMPILER=g++ -DLIBOMP_LIB_TYPE=stubs ..
|
|
|
|
**Footnotes**
|
|
|
|
.. [*] Other names and brands may be claimed as the property of others.
|
|
|
|
How to Run Tests
|
|
================
|
|
|
|
There are following check-* make targets for tests.
|
|
|
|
- ``check-ompt`` (ompt tests under runtime/test/ompt)
|
|
- ``check-ompt-multiplex`` (ompt multiplex tests under tools/multiplex/tests)
|
|
- ``check-libarcher`` (libarcher tests under tools/archer/tests)
|
|
- ``check-libomp`` (libomp tests under runtime/test. This includes check-ompt tests too)
|
|
- ``check-libomptarget-*`` (libomptarget tests for specific target under libomptarget/test)
|
|
- ``check-libomptarget`` (all check-libomptarget-* tests)
|
|
- ``check-openmp`` (combination of all above tests excluding duplicates)
|
|
|
|
For example, to run all available tests, use ``make check-openmp``.
|
|
|
|
Options for Tests
|
|
------------------
|
|
Tests use lit framework.
|
|
See `lit documentation <https://llvm.org/docs/CommandGuide/lit.html>`_ for lit options.
|
|
|
|
**CHECK_OPENMP_ENV** = ``""``
|
|
Default environment variables which test process uses for ``check-openmp``
|
|
separated by space. This can be used for individual targets (``check-ompt``,
|
|
``check-ompt-multiplex``, ``check-libarcher``, ``check-libomp`` and
|
|
``check-libomptarget-*``) too. Note that each test still overrides
|
|
environment variables if needed. For example, to change barrier pattern to be
|
|
used from default hyper barrier to hierarchical barrier, run:
|
|
|
|
.. code-block:: console
|
|
|
|
$ CHECK_OPENMP_ENV="KMP_PLAIN_BARRIER_PATTERN=hier,hier KMP_FORKJOIN_BARRIER_PATTERN=hier,hier KMP_REDUCTION_BARRIER_PATTERN=hier,hier" make check-openmp
|