Skip to content

Commit

Permalink
[libc] implement the final macros for stdbit.h support (llvm#84798)
Browse files Browse the repository at this point in the history
Relevant sections of n3096:
- 7.18.1p1
- 7.18.2
  • Loading branch information
nickdesaulniers authored Mar 12, 2024
1 parent bae47d4 commit f0c0dda
Show file tree
Hide file tree
Showing 5 changed files with 31 additions and 5 deletions.
2 changes: 1 addition & 1 deletion libc/docs/c23.rst
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,7 @@ Additions:
* dfmal
* fsqrt*
* dsqrtl
* stdbit.h (New header)
* stdbit.h (New header) |check|
* stdckdint.h (New header) |check|
* stddef.h

Expand Down
8 changes: 4 additions & 4 deletions libc/docs/stdbit.rst
Original file line number Diff line number Diff line change
Expand Up @@ -110,10 +110,10 @@ Macros
========================= =========
Macro Name Available
========================= =========
__STDC_VERSION_STDBIT_H__
__STDC_ENDIAN_LITTLE__
__STDC_ENDIAN_BIG__
__STDC_ENDIAN_NATIVE__
__STDC_VERSION_STDBIT_H__ |check|
__STDC_ENDIAN_LITTLE__ |check|
__STDC_ENDIAN_BIG__ |check|
__STDC_ENDIAN_NATIVE__ |check|
stdc_leading_zeros |check|
stdc_leading_ones |check|
stdc_trailing_zeros |check|
Expand Down
5 changes: 5 additions & 0 deletions libc/include/llvm-libc-macros/stdbit-macros.h
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,11 @@
#ifndef __LLVM_LIBC_MACROS_STDBIT_MACROS_H
#define __LLVM_LIBC_MACROS_STDBIT_MACROS_H

#define __STDC_VERSION_STDBIT_H__ 202311L
#define __STDC_ENDIAN_LITTLE__ __ORDER_LITTLE_ENDIAN__
#define __STDC_ENDIAN_BIG__ __ORDER_BIG_ENDIAN__
#define __STDC_ENDIAN_NATIVE__ __BYTE_ORDER__

// TODO(https://github.com/llvm/llvm-project/issues/80509): support _BitInt().
#ifdef __cplusplus
inline unsigned stdc_leading_zeros(unsigned char x) {
Expand Down
4 changes: 4 additions & 0 deletions libc/spec/stdc.td
Original file line number Diff line number Diff line change
Expand Up @@ -805,6 +805,10 @@ def StdC : StandardSpec<"stdc"> {
HeaderSpec StdBit = HeaderSpec<
"stdbit.h",
[
Macro<"__STDC_VERSION_STDBIT_H__">,
Macro<"__STDC_ENDIAN_LITTLE__">,
Macro<"__STDC_ENDIAN_BIG__">,
Macro<"__STDC_ENDIAN_NATIVE__">,
Macro<"stdc_leading_zeros">,
Macro<"stdc_leading_ones">,
Macro<"stdc_trailing_zeros">,
Expand Down
17 changes: 17 additions & 0 deletions libc/test/include/stdbit_test.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -141,3 +141,20 @@ TEST(LlvmLibcStdbitTest, TypeGenericMacroBitCeil) {
EXPECT_EQ(stdc_bit_ceil(0UL), 0x6DUL);
EXPECT_EQ(stdc_bit_ceil(0ULL), 0x6EULL);
}

TEST(LlvmLibcStdbitTest, VersionMacro) {
// 7.18.1p2 an integer constant expression with a value equivalent to 202311L.
EXPECT_EQ(__STDC_VERSION_STDBIT_H__, 202311L);
}

TEST(LlvmLibcStdbitTest, EndianMacros) {
// 7.18.2p3 The values of the integer constant expressions for
// __STDC_ENDIAN_LITTLE__ and __STDC_ENDIAN_BIG__ are not equal.
EXPECT_NE(__STDC_ENDIAN_LITTLE__, __STDC_ENDIAN_BIG__);
// The standard does allow for __STDC_ENDIAN_NATIVE__ to be an integer
// constant expression with an implementation defined value for non-big or
// little endianness environments. I assert such machines are no longer
// relevant.
EXPECT_TRUE(__STDC_ENDIAN_NATIVE__ == __STDC_ENDIAN_LITTLE__ ||
__STDC_ENDIAN_NATIVE__ == __STDC_ENDIAN_BIG__);
}

0 comments on commit f0c0dda

Please sign in to comment.