aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2024-09-19 17:53:27 +0200
committerJakub Jelinek <jakub@gcc.gnu.org>2024-09-19 17:53:27 +0200
commit16dda95e39fa04e5ab43486a980e8866ee12efd7 (patch)
treedc690a6df412548efae03abf561ab90d05327db7
parentcee868ae0dfb5bef590a0a82426d32ba1d2b1a92 (diff)
downloadgcc-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.cc19
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
}