mirror of
https://github.com/gcc-mirror/gcc.git
synced 2024-11-21 13:40:47 +00:00
libcpp: Use constexpr for _cpp_trigraph_map initialization for C++14
The _cpp_trigraph_map initialization used to be done for C99+ using designated initializers, but can't be done that way for C++ because the designated initializer support in C++ as array designators are just an extension there and don't allow skipping anything nor going backwards. But, we can get the same effect using C++14 constexpr constructor. With the following patch we get rid of the runtime initialization and the array can be in .rodata. 2024-10-07 Jakub Jelinek <jakub@redhat.com> * internal.h (_cpp_trigraph_map_s): New type for C++14 or later. (_cpp_trigraph_map_d): New variable for C++14 or later. (_cpp_trigraph_map): Define to _cpp_trigraph_map_d.map for C++14 or later. * init.cc (init_trigraph_map): Define to nothing for C++14 or later. (TRIGRAPH_MAP, END, s): Define differently for C++14 or later.
This commit is contained in:
parent
c0002a675a
commit
e4c0595ec4
@ -41,8 +41,8 @@ static void read_original_directory (cpp_reader *);
|
||||
static void post_options (cpp_reader *);
|
||||
|
||||
/* If we have designated initializers (GCC >2.7) these tables can be
|
||||
initialized, constant data. Otherwise, they have to be filled in at
|
||||
runtime. */
|
||||
initialized, constant data. Similarly for C++14 and later.
|
||||
Otherwise, they have to be filled in at runtime. */
|
||||
#if HAVE_DESIGNATED_INITIALIZERS
|
||||
|
||||
#define init_trigraph_map() /* Nothing. */
|
||||
@ -52,6 +52,15 @@ __extension__ const uchar _cpp_trigraph_map[UCHAR_MAX + 1] = {
|
||||
#define END };
|
||||
#define s(p, v) [p] = v,
|
||||
|
||||
#elif __cpp_constexpr >= 201304L
|
||||
|
||||
#define init_trigraph_map() /* Nothing. */
|
||||
#define TRIGRAPH_MAP \
|
||||
constexpr _cpp_trigraph_map_s::_cpp_trigraph_map_s () : map {} {
|
||||
#define END } \
|
||||
constexpr _cpp_trigraph_map_s _cpp_trigraph_map_d;
|
||||
#define s(p, v) map[p] = v;
|
||||
|
||||
#else
|
||||
|
||||
#define TRIGRAPH_MAP uchar _cpp_trigraph_map[UCHAR_MAX + 1] = { 0 }; \
|
||||
|
@ -668,6 +668,12 @@ struct cpp_embed_params
|
||||
compiler that supports C99. */
|
||||
#if HAVE_DESIGNATED_INITIALIZERS
|
||||
extern const unsigned char _cpp_trigraph_map[UCHAR_MAX + 1];
|
||||
#elif __cpp_constexpr >= 201304L
|
||||
extern const struct _cpp_trigraph_map_s {
|
||||
unsigned char map[UCHAR_MAX + 1];
|
||||
constexpr _cpp_trigraph_map_s ();
|
||||
} _cpp_trigraph_map_d;
|
||||
#define _cpp_trigraph_map _cpp_trigraph_map_d.map
|
||||
#else
|
||||
extern unsigned char _cpp_trigraph_map[UCHAR_MAX + 1];
|
||||
#endif
|
||||
|
Loading…
Reference in New Issue
Block a user