From 6807164500e9920638e2ab0cdb4bf8321d24f8eb Mon Sep 17 00:00:00 2001 From: c8ef Date: Fri, 7 Feb 2025 09:20:18 +0800 Subject: [PATCH] [libc] Add the `` header. (#125168) Closes [#124631](https://github.com/llvm/llvm-project/issues/124631). ref: https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/endian.h.html This patch adds the implementation of `endian.h`, which includes the header itself and three related macros. These macros in the header rely on the compiler preprocessor, similar to how https://github.com/llvm/llvm-project/blob/main/libc/src/__support/endian_internal.h does. Hopefully this will meet the requirements for compiling llvm with llvm-libc. --- libc/config/linux/aarch64/headers.txt | 1 + libc/config/linux/x86_64/headers.txt | 1 + libc/docs/CMakeLists.txt | 1 + libc/docs/headers/index.rst | 1 + libc/include/CMakeLists.txt | 9 ++++++ libc/include/endian.h.def | 17 ++++++++++ libc/include/endian.yaml | 9 ++++++ libc/include/llvm-libc-macros/CMakeLists.txt | 6 ++++ libc/include/llvm-libc-macros/endian-macros.h | 16 ++++++++++ libc/utils/docgen/endian.yaml | 32 +++++++++++++++++++ 10 files changed, 93 insertions(+) create mode 100644 libc/include/endian.h.def create mode 100644 libc/include/endian.yaml create mode 100644 libc/include/llvm-libc-macros/endian-macros.h create mode 100644 libc/utils/docgen/endian.yaml diff --git a/libc/config/linux/aarch64/headers.txt b/libc/config/linux/aarch64/headers.txt index 32edfb2cd941..54c65765abe4 100644 --- a/libc/config/linux/aarch64/headers.txt +++ b/libc/config/linux/aarch64/headers.txt @@ -4,6 +4,7 @@ set(TARGET_PUBLIC_HEADERS libc.include.ctype libc.include.dlfcn libc.include.elf + libc.include.endian libc.include.errno libc.include.features libc.include.fenv diff --git a/libc/config/linux/x86_64/headers.txt b/libc/config/linux/x86_64/headers.txt index 8d422698821b..bd2fc3df7596 100644 --- a/libc/config/linux/x86_64/headers.txt +++ b/libc/config/linux/x86_64/headers.txt @@ -6,6 +6,7 @@ set(TARGET_PUBLIC_HEADERS libc.include.dirent libc.include.dlfcn libc.include.elf + libc.include.endian libc.include.errno libc.include.fcntl libc.include.features diff --git a/libc/docs/CMakeLists.txt b/libc/docs/CMakeLists.txt index fc5e505c3be6..97f27fe6a6e0 100644 --- a/libc/docs/CMakeLists.txt +++ b/libc/docs/CMakeLists.txt @@ -39,6 +39,7 @@ if (SPHINX_FOUND) assert cpio ctype + endian errno fenv float diff --git a/libc/docs/headers/index.rst b/libc/docs/headers/index.rst index bd48dd5989bc..745b6f44750d 100644 --- a/libc/docs/headers/index.rst +++ b/libc/docs/headers/index.rst @@ -10,6 +10,7 @@ Implementation Status complex cpio ctype + endian errno fenv float diff --git a/libc/include/CMakeLists.txt b/libc/include/CMakeLists.txt index 624f83a4ec28..63745542662d 100644 --- a/libc/include/CMakeLists.txt +++ b/libc/include/CMakeLists.txt @@ -73,6 +73,15 @@ add_header_macro( .llvm_libc_common_h ) +add_header_macro( + endian + ../libc/include/endian.yaml + endian.h + DEPENDS + .llvm-libc-macros.endian_macros + .llvm_libc_common_h +) + add_header_macro( features ../libc/include/features.yaml diff --git a/libc/include/endian.h.def b/libc/include/endian.h.def new file mode 100644 index 000000000000..f331f08edc68 --- /dev/null +++ b/libc/include/endian.h.def @@ -0,0 +1,17 @@ +//===-- POSIX header endian.h ---------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_ENDIAN_H +#define LLVM_LIBC_ENDIAN_H + +#include "__llvm-libc-common.h" +#include "llvm-libc-macros/endian-macros.h" + +%%public_api() + +#endif // LLVM_LIBC_ENDIAN_H diff --git a/libc/include/endian.yaml b/libc/include/endian.yaml new file mode 100644 index 000000000000..6497f897b639 --- /dev/null +++ b/libc/include/endian.yaml @@ -0,0 +1,9 @@ +header: endian.h +header_template: endian.h.def +standards: + - POSIX +macros: [] +types: [] +enums: [] +objects: [] +functions: [] diff --git a/libc/include/llvm-libc-macros/CMakeLists.txt b/libc/include/llvm-libc-macros/CMakeLists.txt index 441b550543f6..ea892a87dbe7 100644 --- a/libc/include/llvm-libc-macros/CMakeLists.txt +++ b/libc/include/llvm-libc-macros/CMakeLists.txt @@ -310,6 +310,12 @@ add_macro_header( elf-macros.h ) +add_macro_header( + endian_macros + HDR + endian-macros.h +) + add_macro_header( locale_macros HDR diff --git a/libc/include/llvm-libc-macros/endian-macros.h b/libc/include/llvm-libc-macros/endian-macros.h new file mode 100644 index 000000000000..94e1d60f8ff4 --- /dev/null +++ b/libc/include/llvm-libc-macros/endian-macros.h @@ -0,0 +1,16 @@ +//===-- Definition of macros from endian.h --------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_MACROS_ENDIAN_MACROS_H +#define LLVM_LIBC_MACROS_ENDIAN_MACROS_H + +#define LITTLE_ENDIAN __ORDER_LITTLE_ENDIAN__ +#define BIG_ENDIAN __ORDER_BIG_ENDIAN__ +#define BYTE_ORDER __BYTE_ORDER__ + +#endif // LLVM_LIBC_MACROS_ENDIAN_MACROS_H diff --git a/libc/utils/docgen/endian.yaml b/libc/utils/docgen/endian.yaml new file mode 100644 index 000000000000..f100a1126066 --- /dev/null +++ b/libc/utils/docgen/endian.yaml @@ -0,0 +1,32 @@ +macros: + LITTLE_ENDIAN: + in-latest-posix: '' + BIG_ENDIAN: + in-latest-posix: '' + BYTE_ORDER: + in-latest-posix: '' + be16toh: + in-latest-posix: '' + be32toh: + in-latest-posix: '' + be64toh: + in-latest-posix: '' + htobe16: + in-latest-posix: '' + htobe32: + in-latest-posix: '' + htobe64: + in-latest-posix: '' + htole16: + in-latest-posix: '' + htole32: + in-latest-posix: '' + htole64: + in-latest-posix: '' + le16toh: + in-latest-posix: '' + le32toh: + in-latest-posix: '' + le64toh: + in-latest-posix: '' +