47541a2a8d
Resolves: RHEL-30410
380 lines
11 KiB
Diff
380 lines
11 KiB
Diff
From dfab07b9ead66f08661325c03175e1df9210ccd7 Mon Sep 17 00:00:00 2001
|
|
From: Jan Beulich <jbeulich@suse.com>
|
|
Date: Fri, 1 Sep 2023 12:29:44 +0200
|
|
Subject: [PATCH] x86: unindent most of set_cpu_arch()
|
|
|
|
Inverting the initial if()'s condition allows to move out the bulk of
|
|
the function by a level, improving readability at least a bit. While
|
|
doing that also pull the push/pop handling up first, such that "else if"
|
|
after "return" isn't needed anymore; the order in which special cases
|
|
are checked doesn't really matter.
|
|
---
|
|
gas/config/tc-i386.c | 305 ++++++++++++++++++++++---------------------
|
|
1 file changed, 154 insertions(+), 151 deletions(-)
|
|
|
|
diff --git a/gas/config/tc-i386.c b/gas/config/tc-i386.c
|
|
index 19a5f2d61e5..00abfc78264 100644
|
|
--- a/gas/config/tc-i386.c
|
|
+++ b/gas/config/tc-i386.c
|
|
@@ -2793,29 +2793,134 @@ set_cpu_arch (int dummy ATTRIBUTE_UNUSED)
|
|
bool no_cond_jump_promotion;
|
|
} arch_stack_entry;
|
|
static const arch_stack_entry *arch_stack_top;
|
|
+ char *s;
|
|
+ int e;
|
|
+ const char *string;
|
|
+ unsigned int j = 0;
|
|
+ i386_cpu_flags flags;
|
|
|
|
SKIP_WHITESPACE ();
|
|
|
|
- if (!is_end_of_line[(unsigned char) *input_line_pointer])
|
|
+ if (is_end_of_line[(unsigned char) *input_line_pointer])
|
|
+ {
|
|
+ as_bad (_("missing cpu architecture"));
|
|
+ input_line_pointer++;
|
|
+ return;
|
|
+ }
|
|
+
|
|
+ e = get_symbol_name (&s);
|
|
+ string = s;
|
|
+
|
|
+ if (strcmp (string, "push") == 0)
|
|
+ {
|
|
+ arch_stack_entry *top = XNEW (arch_stack_entry);
|
|
+
|
|
+ top->name = cpu_arch_name;
|
|
+ if (cpu_sub_arch_name)
|
|
+ top->sub_name = xstrdup (cpu_sub_arch_name);
|
|
+ else
|
|
+ top->sub_name = NULL;
|
|
+ top->flags = cpu_arch_flags;
|
|
+ top->isa = cpu_arch_isa;
|
|
+ top->isa_flags = cpu_arch_isa_flags;
|
|
+ top->flag_code = flag_code;
|
|
+ top->stackop_size = stackop_size;
|
|
+ top->no_cond_jump_promotion = no_cond_jump_promotion;
|
|
+
|
|
+ top->prev = arch_stack_top;
|
|
+ arch_stack_top = top;
|
|
+
|
|
+ (void) restore_line_pointer (e);
|
|
+ demand_empty_rest_of_line ();
|
|
+ return;
|
|
+ }
|
|
+
|
|
+ if (strcmp (string, "pop") == 0)
|
|
{
|
|
- char *s;
|
|
- int e = get_symbol_name (&s);
|
|
- const char *string = s;
|
|
- unsigned int j = 0;
|
|
- i386_cpu_flags flags;
|
|
+ const arch_stack_entry *top = arch_stack_top;
|
|
|
|
- if (strcmp (string, "default") == 0)
|
|
+ if (!top)
|
|
+ as_bad (_(".arch stack is empty"));
|
|
+ else if (top->flag_code != flag_code
|
|
+ || top->stackop_size != stackop_size)
|
|
+ {
|
|
+ static const unsigned int bits[] = {
|
|
+ [CODE_16BIT] = 16,
|
|
+ [CODE_32BIT] = 32,
|
|
+ [CODE_64BIT] = 64,
|
|
+ };
|
|
+
|
|
+ as_bad (_("this `.arch pop' requires `.code%u%s' to be in effect"),
|
|
+ bits[top->flag_code],
|
|
+ top->stackop_size == LONG_MNEM_SUFFIX ? "gcc" : "");
|
|
+ }
|
|
+ else
|
|
+ {
|
|
+ arch_stack_top = top->prev;
|
|
+
|
|
+ cpu_arch_name = top->name;
|
|
+ free (cpu_sub_arch_name);
|
|
+ cpu_sub_arch_name = top->sub_name;
|
|
+ cpu_arch_flags = top->flags;
|
|
+ cpu_arch_isa = top->isa;
|
|
+ cpu_arch_isa_flags = top->isa_flags;
|
|
+ no_cond_jump_promotion = top->no_cond_jump_promotion;
|
|
+
|
|
+ XDELETE (top);
|
|
+ }
|
|
+
|
|
+ (void) restore_line_pointer (e);
|
|
+ demand_empty_rest_of_line ();
|
|
+ return;
|
|
+ }
|
|
+
|
|
+ if (strcmp (string, "default") == 0)
|
|
+ {
|
|
+ if (strcmp (default_arch, "iamcu") == 0)
|
|
+ string = default_arch;
|
|
+ else
|
|
{
|
|
- if (strcmp (default_arch, "iamcu") == 0)
|
|
- string = default_arch;
|
|
+ static const i386_cpu_flags cpu_unknown_flags = CPU_UNKNOWN_FLAGS;
|
|
+
|
|
+ cpu_arch_name = NULL;
|
|
+ free (cpu_sub_arch_name);
|
|
+ cpu_sub_arch_name = NULL;
|
|
+ cpu_arch_flags = cpu_unknown_flags;
|
|
+ if (flag_code == CODE_64BIT)
|
|
+ {
|
|
+ cpu_arch_flags.bitfield.cpu64 = 1;
|
|
+ cpu_arch_flags.bitfield.cpuno64 = 0;
|
|
+ }
|
|
else
|
|
{
|
|
- static const i386_cpu_flags cpu_unknown_flags = CPU_UNKNOWN_FLAGS;
|
|
+ cpu_arch_flags.bitfield.cpu64 = 0;
|
|
+ cpu_arch_flags.bitfield.cpuno64 = 1;
|
|
+ }
|
|
+ cpu_arch_isa = PROCESSOR_UNKNOWN;
|
|
+ cpu_arch_isa_flags = cpu_arch[flag_code == CODE_64BIT].enable;
|
|
+ if (!cpu_arch_tune_set)
|
|
+ {
|
|
+ cpu_arch_tune = cpu_arch_isa;
|
|
+ cpu_arch_tune_flags = cpu_arch_isa_flags;
|
|
+ }
|
|
+
|
|
+ j = ARRAY_SIZE (cpu_arch) + 1;
|
|
+ }
|
|
+ }
|
|
+
|
|
+ for (; j < ARRAY_SIZE (cpu_arch); j++)
|
|
+ {
|
|
+ if (strcmp (string + (*string == '.'), cpu_arch[j].name) == 0
|
|
+ && (*string == '.') == (cpu_arch[j].type == PROCESSOR_NONE))
|
|
+ {
|
|
+ if (*string != '.')
|
|
+ {
|
|
+ check_cpu_arch_compatible (string, cpu_arch[j].enable);
|
|
|
|
- cpu_arch_name = NULL;
|
|
+ cpu_arch_name = cpu_arch[j].name;
|
|
free (cpu_sub_arch_name);
|
|
cpu_sub_arch_name = NULL;
|
|
- cpu_arch_flags = cpu_unknown_flags;
|
|
+ cpu_arch_flags = cpu_arch[j].enable;
|
|
if (flag_code == CODE_64BIT)
|
|
{
|
|
cpu_arch_flags.bitfield.cpu64 = 1;
|
|
@@ -2826,173 +2931,71 @@ set_cpu_arch (int dummy ATTRIBUTE_UNUSED)
|
|
cpu_arch_flags.bitfield.cpu64 = 0;
|
|
cpu_arch_flags.bitfield.cpuno64 = 1;
|
|
}
|
|
- cpu_arch_isa = PROCESSOR_UNKNOWN;
|
|
- cpu_arch_isa_flags = cpu_arch[flag_code == CODE_64BIT].enable;
|
|
+ cpu_arch_isa = cpu_arch[j].type;
|
|
+ cpu_arch_isa_flags = cpu_arch[j].enable;
|
|
if (!cpu_arch_tune_set)
|
|
{
|
|
cpu_arch_tune = cpu_arch_isa;
|
|
cpu_arch_tune_flags = cpu_arch_isa_flags;
|
|
}
|
|
-
|
|
- j = ARRAY_SIZE (cpu_arch) + 1;
|
|
+ pre_386_16bit_warned = false;
|
|
+ break;
|
|
}
|
|
- }
|
|
- else if (strcmp (string, "push") == 0)
|
|
- {
|
|
- arch_stack_entry *top = XNEW (arch_stack_entry);
|
|
|
|
- top->name = cpu_arch_name;
|
|
- if (cpu_sub_arch_name)
|
|
- top->sub_name = xstrdup (cpu_sub_arch_name);
|
|
- else
|
|
- top->sub_name = NULL;
|
|
- top->flags = cpu_arch_flags;
|
|
- top->isa = cpu_arch_isa;
|
|
- top->isa_flags = cpu_arch_isa_flags;
|
|
- top->flag_code = flag_code;
|
|
- top->stackop_size = stackop_size;
|
|
- top->no_cond_jump_promotion = no_cond_jump_promotion;
|
|
+ if (cpu_flags_all_zero (&cpu_arch[j].enable))
|
|
+ continue;
|
|
|
|
- top->prev = arch_stack_top;
|
|
- arch_stack_top = top;
|
|
+ flags = cpu_flags_or (cpu_arch_flags, cpu_arch[j].enable);
|
|
|
|
- (void) restore_line_pointer (e);
|
|
- demand_empty_rest_of_line ();
|
|
- return;
|
|
- }
|
|
- else if (strcmp (string, "pop") == 0)
|
|
- {
|
|
- const arch_stack_entry *top = arch_stack_top;
|
|
-
|
|
- if (!top)
|
|
- as_bad (_(".arch stack is empty"));
|
|
- else if (top->flag_code != flag_code
|
|
- || top->stackop_size != stackop_size)
|
|
+ if (!cpu_flags_equal (&flags, &cpu_arch_flags))
|
|
{
|
|
- static const unsigned int bits[] = {
|
|
- [CODE_16BIT] = 16,
|
|
- [CODE_32BIT] = 32,
|
|
- [CODE_64BIT] = 64,
|
|
- };
|
|
-
|
|
- as_bad (_("this `.arch pop' requires `.code%u%s' to be in effect"),
|
|
- bits[top->flag_code],
|
|
- top->stackop_size == LONG_MNEM_SUFFIX ? "gcc" : "");
|
|
+ extend_cpu_sub_arch_name (string + 1);
|
|
+ cpu_arch_flags = flags;
|
|
+ cpu_arch_isa_flags = flags;
|
|
}
|
|
else
|
|
- {
|
|
- arch_stack_top = top->prev;
|
|
-
|
|
- cpu_arch_name = top->name;
|
|
- free (cpu_sub_arch_name);
|
|
- cpu_sub_arch_name = top->sub_name;
|
|
- cpu_arch_flags = top->flags;
|
|
- cpu_arch_isa = top->isa;
|
|
- cpu_arch_isa_flags = top->isa_flags;
|
|
- no_cond_jump_promotion = top->no_cond_jump_promotion;
|
|
-
|
|
- XDELETE (top);
|
|
- }
|
|
+ cpu_arch_isa_flags
|
|
+ = cpu_flags_or (cpu_arch_isa_flags, cpu_arch[j].enable);
|
|
|
|
(void) restore_line_pointer (e);
|
|
demand_empty_rest_of_line ();
|
|
return;
|
|
}
|
|
+ }
|
|
|
|
- for (; j < ARRAY_SIZE (cpu_arch); j++)
|
|
- {
|
|
- if (strcmp (string + (*string == '.'), cpu_arch[j].name) == 0
|
|
- && (*string == '.') == (cpu_arch[j].type == PROCESSOR_NONE))
|
|
- {
|
|
- if (*string != '.')
|
|
- {
|
|
- check_cpu_arch_compatible (string, cpu_arch[j].enable);
|
|
-
|
|
- cpu_arch_name = cpu_arch[j].name;
|
|
- free (cpu_sub_arch_name);
|
|
- cpu_sub_arch_name = NULL;
|
|
- cpu_arch_flags = cpu_arch[j].enable;
|
|
- if (flag_code == CODE_64BIT)
|
|
- {
|
|
- cpu_arch_flags.bitfield.cpu64 = 1;
|
|
- cpu_arch_flags.bitfield.cpuno64 = 0;
|
|
- }
|
|
- else
|
|
- {
|
|
- cpu_arch_flags.bitfield.cpu64 = 0;
|
|
- cpu_arch_flags.bitfield.cpuno64 = 1;
|
|
- }
|
|
- cpu_arch_isa = cpu_arch[j].type;
|
|
- cpu_arch_isa_flags = cpu_arch[j].enable;
|
|
- if (!cpu_arch_tune_set)
|
|
- {
|
|
- cpu_arch_tune = cpu_arch_isa;
|
|
- cpu_arch_tune_flags = cpu_arch_isa_flags;
|
|
- }
|
|
- pre_386_16bit_warned = false;
|
|
- break;
|
|
- }
|
|
-
|
|
- if (cpu_flags_all_zero (&cpu_arch[j].enable))
|
|
- continue;
|
|
-
|
|
- flags = cpu_flags_or (cpu_arch_flags,
|
|
- cpu_arch[j].enable);
|
|
-
|
|
- if (!cpu_flags_equal (&flags, &cpu_arch_flags))
|
|
- {
|
|
- extend_cpu_sub_arch_name (string + 1);
|
|
- cpu_arch_flags = flags;
|
|
- cpu_arch_isa_flags = flags;
|
|
- }
|
|
- else
|
|
- cpu_arch_isa_flags
|
|
- = cpu_flags_or (cpu_arch_isa_flags,
|
|
- cpu_arch[j].enable);
|
|
- (void) restore_line_pointer (e);
|
|
- demand_empty_rest_of_line ();
|
|
- return;
|
|
- }
|
|
- }
|
|
-
|
|
- if (startswith (string, ".no") && j >= ARRAY_SIZE (cpu_arch))
|
|
- {
|
|
- /* Disable an ISA extension. */
|
|
- for (j = 0; j < ARRAY_SIZE (cpu_arch); j++)
|
|
- if (cpu_arch[j].type == PROCESSOR_NONE
|
|
- && strcmp (string + 3, cpu_arch[j].name) == 0)
|
|
+ if (startswith (string, ".no") && j >= ARRAY_SIZE (cpu_arch))
|
|
+ {
|
|
+ /* Disable an ISA extension. */
|
|
+ for (j = 0; j < ARRAY_SIZE (cpu_arch); j++)
|
|
+ if (cpu_arch[j].type == PROCESSOR_NONE
|
|
+ && strcmp (string + 3, cpu_arch[j].name) == 0)
|
|
+ {
|
|
+ flags = cpu_flags_and_not (cpu_arch_flags, cpu_arch[j].disable);
|
|
+ if (!cpu_flags_equal (&flags, &cpu_arch_flags))
|
|
{
|
|
- flags = cpu_flags_and_not (cpu_arch_flags,
|
|
- cpu_arch[j].disable);
|
|
- if (!cpu_flags_equal (&flags, &cpu_arch_flags))
|
|
- {
|
|
- extend_cpu_sub_arch_name (string + 1);
|
|
- cpu_arch_flags = flags;
|
|
- cpu_arch_isa_flags = flags;
|
|
- }
|
|
- (void) restore_line_pointer (e);
|
|
- demand_empty_rest_of_line ();
|
|
- return;
|
|
+ extend_cpu_sub_arch_name (string + 1);
|
|
+ cpu_arch_flags = flags;
|
|
+ cpu_arch_isa_flags = flags;
|
|
}
|
|
- }
|
|
-
|
|
- if (j == ARRAY_SIZE (cpu_arch))
|
|
- as_bad (_("no such architecture: `%s'"), string);
|
|
|
|
- *input_line_pointer = e;
|
|
+ (void) restore_line_pointer (e);
|
|
+ demand_empty_rest_of_line ();
|
|
+ return;
|
|
+ }
|
|
}
|
|
- else
|
|
- as_bad (_("missing cpu architecture"));
|
|
+
|
|
+ if (j == ARRAY_SIZE (cpu_arch))
|
|
+ as_bad (_("no such architecture: `%s'"), string);
|
|
+
|
|
+ *input_line_pointer = e;
|
|
|
|
no_cond_jump_promotion = 0;
|
|
if (*input_line_pointer == ','
|
|
&& !is_end_of_line[(unsigned char) input_line_pointer[1]])
|
|
{
|
|
- char *string;
|
|
- char e;
|
|
-
|
|
++input_line_pointer;
|
|
- e = get_symbol_name (&string);
|
|
+ e = get_symbol_name (&s);
|
|
+ string = s;
|
|
|
|
if (strcmp (string, "nojumps") == 0)
|
|
no_cond_jump_promotion = 1;
|
|
--
|
|
2.43.0
|
|
|