diff options
author | Jakub Jelinek <jakub@redhat.com> | 2024-09-19 17:53:27 +0200 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2024-09-19 17:53:27 +0200 |
commit | 16dda95e39fa04e5ab43486a980e8866ee12efd7 (patch) | |
tree | dc690a6df412548efae03abf561ab90d05327db7 | |
parent | cee868ae0dfb5bef590a0a82426d32ba1d2b1a92 (diff) | |
download | gcc-16dda95e39fa04e5ab43486a980e8866ee12efd7.zip gcc-16dda95e39fa04e5ab43486a980e8866ee12efd7.tar.gz gcc-16dda95e39fa04e5ab43486a980e8866ee12efd7.tar.bz2 |
dwarf2asm: Use constexpr for eh_data_format_name initialization for C++14
Similarly to the previous patch, dwarf2asm.cc had
HAVE_DESIGNATED_INITIALIZERS support, and as fallback a huge switch.
The switch from what I can see is expanded as a jump table with 256
label pointers and code at those labels then loads addresses of
string literals.
The following patch instead uses a table with 256 const char * pointers,
NULL for ICE, non-NULL for returning something, similarly to the
HAVE_DESIGNATED_INITIALIZERS case.
2024-09-19 Jakub Jelinek <jakub@redhat.com>
* dwarf2asm.cc (eh_data_format_name): Use constexpr initialization
of format_names table for C++14 instead of a large switch.
-rw-r--r-- | gcc/dwarf2asm.cc | 19 |
1 files changed, 17 insertions, 2 deletions
diff --git a/gcc/dwarf2asm.cc b/gcc/dwarf2asm.cc index 6c835ba..72e831a 100644 --- a/gcc/dwarf2asm.cc +++ b/gcc/dwarf2asm.cc @@ -488,14 +488,22 @@ eh_data_format_name (int format) { #if HAVE_DESIGNATED_INITIALIZERS #define S(p, v) [p] = v, +#elif __cpp_constexpr >= 201304L +#define S(p, v) names[p] = v; #else #define S(p, v) case p: return v; #endif #if HAVE_DESIGNATED_INITIALIZERS __extension__ static const char * const format_names[256] = { +#elif __cpp_constexpr >= 201304L + static constexpr struct format_names_s { + const char *names[256]; + constexpr format_names_s () : names {} + { #else - switch (format) { + switch (format) + { #endif S(DW_EH_PE_absptr, "absolute") @@ -635,8 +643,15 @@ eh_data_format_name (int format) gcc_assert (format >= 0 && format < 0x100 && format_names[format]); return format_names[format]; +#elif __cpp_constexpr >= 201304L + } + } format_names; + + gcc_assert (format >= 0 && format < 0x100 && format_names.names[format]); + + return format_names.names[format]; #else - } + } gcc_unreachable (); #endif } |