mirror of
https://github.com/RIOT-OS/RIOT.git
synced 2024-12-29 04:50:03 +01:00
dist/tools: Added script for C11 atomics compat
Added a script to determine the sizes of the default C11 atomic types and generate an C++ header with preprocessor defines to access the sizes of the types and an integer type of the same size (and therefore alignment requirements).
This commit is contained in:
parent
cd8562e8c0
commit
809d74bca6
44
dist/tools/generate_c11_atomics_cpp_compat_header/README.md
vendored
Normal file
44
dist/tools/generate_c11_atomics_cpp_compat_header/README.md
vendored
Normal file
@ -0,0 +1,44 @@
|
|||||||
|
# Usage
|
||||||
|
|
||||||
|
./generate_c11_atomics_cpp_compat_header.sh [CC [CFLAGS]]
|
||||||
|
|
||||||
|
## Parameter CC
|
||||||
|
|
||||||
|
The C compiler to use to determine the size of the C11 atomics types. If not
|
||||||
|
given, the environment variable CC is used instead.
|
||||||
|
|
||||||
|
## Parameter CFLAGS
|
||||||
|
|
||||||
|
The CFLAGS to pass to the C compiler during determination of the size of the
|
||||||
|
C11 atomic types. If not given, the environment variable CFLAGS is used instead.
|
||||||
|
|
||||||
|
# Output
|
||||||
|
|
||||||
|
The script will write the sizes of each type defined in C11 atomics and which
|
||||||
|
`uint<NUM>_t` type has the same size as the atomic type. Note that C11 allows
|
||||||
|
to prefix any type with the `_Atomic` specifier to get an atomic version of it.
|
||||||
|
This script will only generate entries for the default `typedef`ed types like
|
||||||
|
`atomic_bool`, `atomic_int`, or `atomic_int_least16_t`.
|
||||||
|
|
||||||
|
The output will look like this:
|
||||||
|
|
||||||
|
``` C++
|
||||||
|
/* This file was automatically generated using ./dist/tools/generate_c11_atomics_cpp_compat_header/generate_c11_atomics_cpp_compat_header.sh /*
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#define ATOMIC_BOOL_SIZE (1U)
|
||||||
|
#define ATOMIC_BOOL_SAME_SIZED_TYPE uint8_t
|
||||||
|
#define ATOMIC_CHAR_SIZE (1U)
|
||||||
|
#define ATOMIC_CHAR_SAME_SIZED_TYPE uint8_t
|
||||||
|
#define ATOMIC_SCHAR_SIZE (1U)
|
||||||
|
#define ATOMIC_SCHAR_SAME_SIZED_TYPE uint8_t
|
||||||
|
#define ATOMIC_UCHAR_SIZE (1U)
|
||||||
|
#define ATOMIC_UCHAR_SAME_SIZED_TYPE uint8_t
|
||||||
|
#define ATOMIC_SHORT_SIZE (2U)
|
||||||
|
#define ATOMIC_SHORT_SAME_SIZED_TYPE uint16_t
|
||||||
|
#define ATOMIC_USHORT_SIZE (2U)
|
||||||
|
#define ATOMIC_USHORT_SAME_SIZED_TYPE uint16_t
|
||||||
|
#define ATOMIC_INT_SIZE (4U)
|
||||||
|
#define ATOMIC_INT_SAME_SIZED_TYPE uint32_t
|
||||||
|
...
|
||||||
|
```
|
137
dist/tools/generate_c11_atomics_cpp_compat_header/generate_c11_atomics_cpp_compat_header.sh
vendored
Executable file
137
dist/tools/generate_c11_atomics_cpp_compat_header/generate_c11_atomics_cpp_compat_header.sh
vendored
Executable file
@ -0,0 +1,137 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
TESTFILE=/tmp/riot_are_types_of_same_size_compilation_check.c
|
||||||
|
|
||||||
|
ATOMIC_TYPES="
|
||||||
|
atomic_bool
|
||||||
|
atomic_char
|
||||||
|
atomic_schar
|
||||||
|
atomic_uchar
|
||||||
|
atomic_short
|
||||||
|
atomic_ushort
|
||||||
|
atomic_int
|
||||||
|
atomic_uint
|
||||||
|
atomic_long
|
||||||
|
atomic_ulong
|
||||||
|
atomic_llong
|
||||||
|
atomic_ullong
|
||||||
|
atomic_int_least8_t
|
||||||
|
atomic_uint_least8_t
|
||||||
|
atomic_int_least16_t
|
||||||
|
atomic_uint_least16_t
|
||||||
|
atomic_int_least32_t
|
||||||
|
atomic_uint_least32_t
|
||||||
|
atomic_int_least64_t
|
||||||
|
atomic_uint_least64_t
|
||||||
|
atomic_int_fast8_t
|
||||||
|
atomic_uint_fast8_t
|
||||||
|
atomic_int_fast16_t
|
||||||
|
atomic_uint_fast16_t
|
||||||
|
atomic_int_fast32_t
|
||||||
|
atomic_uint_fast32_t
|
||||||
|
atomic_int_fast64_t
|
||||||
|
atomic_uint_fast64_t
|
||||||
|
atomic_intptr_t
|
||||||
|
atomic_uintptr_t
|
||||||
|
atomic_size_t
|
||||||
|
atomic_ptrdiff_t
|
||||||
|
atomic_intmax_t
|
||||||
|
atomic_uintmax_t
|
||||||
|
"
|
||||||
|
|
||||||
|
are_types_of_same_size() {
|
||||||
|
cat > $TESTFILE << EOF
|
||||||
|
#include <stdint.h>
|
||||||
|
#ifdef __msp430__
|
||||||
|
#include <sys/cdefs.h>
|
||||||
|
#endif
|
||||||
|
#include <stdatomic.h>
|
||||||
|
int main(void) {
|
||||||
|
_Static_assert(sizeof($1) == sizeof($2), "Assert types are equally sized");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
EOF
|
||||||
|
$CC $CFLAGS -o /dev/null -c $TESTFILE 2> /dev/null > /dev/null
|
||||||
|
}
|
||||||
|
|
||||||
|
get_size() {
|
||||||
|
if $(are_types_of_same_size $1 uint8_t); then
|
||||||
|
echo "1"
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
|
||||||
|
if $(are_types_of_same_size $1 uint16_t); then
|
||||||
|
echo "2"
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
|
||||||
|
if $(are_types_of_same_size $1 uint32_t); then
|
||||||
|
echo "4"
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
|
||||||
|
if $(are_types_of_same_size $1 uint64_t); then
|
||||||
|
echo "8"
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "Failed to determine size of $1"
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
get_same_sized_type() {
|
||||||
|
if $(are_types_of_same_size $1 uint8_t); then
|
||||||
|
echo "uint8_t"
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
|
||||||
|
if $(are_types_of_same_size $1 uint16_t); then
|
||||||
|
echo "uint16_t"
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
|
||||||
|
if $(are_types_of_same_size $1 uint32_t); then
|
||||||
|
echo "uint32_t"
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
|
||||||
|
if $(are_types_of_same_size $1 uint64_t); then
|
||||||
|
echo "uint64_t"
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "Failed to determine same sized type for $1"
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
print_defines() {
|
||||||
|
printf "#define %-48s(%sU)\n" "$(echo $1 | tr [a-z] [A-Z])_SIZE" "$(get_size $1)"
|
||||||
|
printf "#define %-48s%s\n" "$(echo $1 | tr [a-z] [A-Z])_SAME_SIZED_TYPE" "$(get_same_sized_type $1)"
|
||||||
|
}
|
||||||
|
|
||||||
|
if [ $# -ge 1 ]; then
|
||||||
|
if [ "$1" = "-h" ] || [ "$1" = "--help" ]; then
|
||||||
|
echo "Usage: $0 [CC [CFLAGS]]"
|
||||||
|
echo "See README.md for more details"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
CC="$1"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ $# -ge 2 ]; then
|
||||||
|
CFLAGS="$2"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -z "$CC" ]; then
|
||||||
|
echo "C compiler needs to be specified either as environment variable, or"
|
||||||
|
echo "as first argument. See README.md for documentation."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "/* This file was automatically generated using $0 */"
|
||||||
|
echo "#pragma once"
|
||||||
|
echo
|
||||||
|
|
||||||
|
for atomic_type in $ATOMIC_TYPES; do
|
||||||
|
print_defines $atomic_type
|
||||||
|
done
|
Loading…
Reference in New Issue
Block a user