[libc-commits] [libc] 9dd7388 - [libc] Add a porting guide to the docs.

Siva Chandra Reddy via libc-commits libc-commits at lists.llvm.org
Wed Nov 2 07:59:27 PDT 2022


Author: Siva Chandra Reddy
Date: 2022-11-02T07:59:07-07:00
New Revision: 9dd7388668721ff1e5781e027adb01a985af46a5

URL: https://github.com/llvm/llvm-project/commit/9dd7388668721ff1e5781e027adb01a985af46a5
DIFF: https://github.com/llvm/llvm-project/commit/9dd7388668721ff1e5781e027adb01a985af46a5.diff

LOG: [libc] Add a porting guide to the docs.

Reviewed By: jeffbailey

Differential Revision: https://reviews.llvm.org/D136960

Added: 
    libc/docs/porting.rst

Modified: 
    libc/docs/entrypoints.rst
    libc/docs/index.rst

Removed: 
    


################################################################################
diff  --git a/libc/docs/entrypoints.rst b/libc/docs/entrypoints.rst
index dfc0aeca6fea4..3c24a922a2947 100644
--- a/libc/docs/entrypoints.rst
+++ b/libc/docs/entrypoints.rst
@@ -1,3 +1,5 @@
+.. _entrypoints:
+
 Entrypoints in LLVM libc
 ------------------------
 

diff  --git a/libc/docs/index.rst b/libc/docs/index.rst
index 4a1825b5921c3..c5f39e89cb295 100644
--- a/libc/docs/index.rst
+++ b/libc/docs/index.rst
@@ -78,6 +78,7 @@ stages there is no ABI stability in any form.
    api_test
    mechanics_of_public_api
    source_layout
+   porting
 
 .. toctree::
    :hidden:

diff  --git a/libc/docs/porting.rst b/libc/docs/porting.rst
new file mode 100644
index 0000000000000..42f7fa33bc334
--- /dev/null
+++ b/libc/docs/porting.rst
@@ -0,0 +1,120 @@
+.. _porting:
+
+=======================================
+Bringup on a New OS or Architecture
+=======================================
+
+.. contents:: Table of Contents
+  :depth: 4
+  :local:
+
+CI builders
+===========
+
+If you are contributing a port for a operating system or architecture which
+is not covered by existing CI builders, you will also have to present a plan
+for testing and contribute a CI builder. See
+`this guide <https://llvm.org/docs/HowToAddABuilder.html>`_ for information
+on how to add new builders to the
+`LLVM buildbot <https://lab.llvm.org/buildbot>`_.
+You will either have to extend the existing
+`Linux script <https://github.com/llvm/llvm-zorg/blob/main/zorg/buildbot/builders/annotated/libc-linux.py>`_
+and/or
+`Windows script <https://github.com/llvm/llvm-zorg/blob/main/zorg/buildbot/builders/annotated/libc-windows.py>`_
+or add a new script for your operating system.
+
+An OS specific config directory
+===============================
+
+If you are starting to bring up LLVM's libc on a new operating system, the first
+step is to add a directory for that OS in the ``libc/config`` directory. Both
+`Linux <https://github.com/llvm/llvm-project/tree/main/libc/config/linux>`_ and
+`Windows <https://github.com/llvm/llvm-project/tree/main/libc/config/windows>`_,
+the two operating systems on which LLVM's libc is being actively developed, 
+have their own config directory.
+
+.. note:: Windows development is not as active as the development on Linux.
+   There is a
+   `Darwin <https://github.com/llvm/llvm-project/tree/main/libc/config/darwin>`_
+   config also which is in a similar state as Windows.
+
+.. note:: LLVM's libc is being brought up on the
+   `Fuchsia <https://fuchsia.dev/>`_ operating system also. However, there is no
+   config directory for Fuchsia as the bring up is being done in the Fuchsia
+   source tree.
+
+The api.td file
+---------------
+
+If the :ref:`fullbuild_mode` is to be supported on the new operating system,
+then a file named ``api.td`` should be added in its config directory. It is
+written in the
+`LLVM tablegen language <https://llvm.org/docs/TableGen/ProgRef.html>`_.
+It lists all the relevant macros and type definitions we want in the
+public libc header files. See the existing Linux
+`api.td <https://github.com/llvm/llvm-project/blob/main/libc/config/linux/api.td>`_
+file as an example to prepare the ``api.td`` file for the new operating system.
+
+.. note:: In future, LLVM tablegen will be replaced with a 
diff erent DSL to list
+   config information.
+
+Architecture Subdirectory
+=========================
+
+There are parts of the libc which are implemented 
diff erently for 
diff erent
+architectures. The simplest example of this is the ``syscall`` function and
+its internal implementation - its Linux implementation 
diff ers for 
diff erent
+architectures. Since a large part of the libc makes use of syscalls (or an
+equivalent on non-Linux like platforms), it might be simpler and convenient to
+bring up the libc for one architecture at a time. In such cases, wherein the
+support surface of LLVM's libc 
diff ers for each target architecture, one will
+have to add a subdirectory (within the config directory os the operating
+system) for each target architecture, and list the relevant config information
+separately in those subdirectories. For example, for Linux, the x86_64 and
+aarch64 configs are in separate directories, named
+`x86_64 <https://github.com/llvm/llvm-project/tree/main/libc/config/linux/x86_64>`_
+and `aarch64 <https://github.com/llvm/llvm-project/tree/main/libc/config/linux/aarch64>`_.
+The libc CMake machinery looks for subdirectories named after the target
+architecture.
+
+The entrypoints.txt file
+========================
+
+One of the important pieces of config information is listed in a file named
+``entrypoints.txt``. This file lists the targets for the entrypoints (see
+:ref:`entrypoints`) you want to include in the static archive of the libc (for
+the :ref:`overlay_mode` and/or the :ref:`fullbuild_mode`.) If you are doing an
+architecture specific bring up, then an ``entrypoints.txt`` file should be
+created in the architecture subdirectory for each architecture. Else, having a
+single ``entrypoints.txt`` in the operating system directory is sufficient.
+
+The Linux config has an ``entrypoint.txt`` for each individual target
+architecture separately: `aarch64 <https://github.com/llvm/llvm-project/tree/main/libc/config/linux/aarch64>`_,
+`arm32 <https://github.com/llvm/llvm-project/tree/main/libc/config/linux/arm>`_ and
+`x86_64 <https://github.com/llvm/llvm-project/tree/main/libc/config/linux/x86_64>`_. On the
+other hand, the Windows config has a single ``entrypoints.txt``
+`file <https://github.com/llvm/llvm-project/tree/main/libc/config/windows/entrypoints.txt>`_.
+
+A typical bring up procedure will normally bring up a small group of entrypoints
+at a time. The usual practice is to progressively add the targets for those
+entrypoints to the ``entrypoints.txt`` file as they are being brought up. The
+same is the case if one is implementing a new entrypoint - the target for the
+new entrypoint should be added to the relevant ``entrypoints.txt`` file. If
+the implementation of the new entrypoint supports multiple operating systems and
+target architectures, then multiple ``entrypoints.txt`` files will have to be
+updated.
+
+The headers.txt file
+====================
+
+Another important piece of config informtion is listed in a file named
+``headers.txt``. It lists the targets for the set of public headers that are
+provided by the libc. This is relevant only if the libc is to be used in the
+:ref:`fullbuild_mode` on the target operating system and architecture. As with
+the ``entrypoints.txt`` file, one ``headers.txt`` file should be listed for
+each individual target architecture if you are doing an architecture specific
+bring up. The Linux config has ``headers.txt`` file listed seperately for the
+`aarch64 <https://github.com/llvm/llvm-project/tree/main/libc/config/linux/aarch64>`_
+config and the
+`x86_64 <https://github.com/llvm/llvm-project/tree/main/libc/config/linux/x86_64>`_
+config.


        


More information about the libc-commits mailing list