.. _module-pw_toolchain:

================
LLVM compiler-rt
================
The ``$dir_pw_third_party/llvm_builtins/`` directory provides the GN integration
necessary to link against LLVM compiler-rt project. The intention here is to use
the builtins provided by the LLVM compiler-rt project.

-------------------------------
Using upstream LLVM compiler-rt
-------------------------------
If you want to use LLVM compiler-rt, you must do the following:

Submodule
=========
Add LLVM compiler-rt to your workspace with the following command.

.. code-block:: sh

   git submodule add git submodule add \
     https://llvm.googlesource.com/llvm-project/compiler-rt \
     third_party/llvm_builtins

.. admonition:: Note

   This git repository is maintained by Google and is a slice of upstream
   LLVM including only the compiler-rt subdirectory.

GN
==
* Set the GN var ``dir_pw_third_party_llvm_builtins`` to the location of the
  LLVM compiler-rt source. If you used the command above, this will be
  ``//third_party/llvm_builtins``

  This can be set in your args.gn or .gn file like:
  ``dir_pw_third_party_llvm_builtins = "//third_party/llvm_builtins"``

* Set the ``pw_third_party_llvm_builtins_TARGET_BUILTINS`` to the pw_source_set
  that selectively adds the files required for the given architecture from the
  LLVM compiler-rt checkout directory.

  For example, you can add the following in your args.gn or .gn file to use the
  builtins for ARMv7-M targets.

  .. code-block::

     pw_third_party_llvm_builtins_TARGET_BUILTINS = "$dir_pw_third_party/llvm_builtins:arm_builtins_armv7m"

* Set the optional ``pw_third_party_llvm_builtins_ignore_list`` to the list of
  files included in pw_source_sets in ``$dir_pw_third_party/llvm_builtins/BUILD.gn`` file.
