public inbox for binutils-cvs@sourceware.org
help / color / mirror / Atom feed
From: Jan Beulich <jbeulich@sourceware.org>
To: bfd-cvs@sourceware.org
Subject: [binutils-gdb] x86: permit "default" with .arch
Date: Wed,  6 Jul 2022 07:23:03 +0000 (GMT)	[thread overview]
Message-ID: <20220706072303.415683857C49@sourceware.org> (raw)

https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=3ce2ebcf888ef86974be57f7c0ea973538317d11

commit 3ce2ebcf888ef86974be57f7c0ea973538317d11
Author: Jan Beulich <jbeulich@suse.com>
Date:   Wed Jul 6 09:21:40 2022 +0200

    x86: permit "default" with .arch
    
    So far there was no way to reset the architecture to that assembly would
    start with in the absence of any overrides (command line or directives).
    Note that for Intel MCU "default" is merely an alias of "iamcu".
    
    While there also zap a stray @item from the doc section, as noticed
    when inspecting the generated output (which still has some quirks, but
    those aren't easy to address without re-flowing almost the entire
    section).

Diff:
---
 gas/config/tc-i386.c               | 56 +++++++++++++++++++++++++++++++++-----
 gas/doc/c-i386.texi                |  3 +-
 gas/testsuite/gas/i386/arch-dflt.l | 19 +++++++++++++
 gas/testsuite/gas/i386/arch-dflt.s | 14 ++++++++++
 gas/testsuite/gas/i386/i386.exp    |  1 +
 5 files changed, 85 insertions(+), 8 deletions(-)

diff --git a/gas/config/tc-i386.c b/gas/config/tc-i386.c
index 4829ff8aaad..a52ac8b77cc 100644
--- a/gas/config/tc-i386.c
+++ b/gas/config/tc-i386.c
@@ -938,8 +938,8 @@ const relax_typeS md_relax_table[] =
 
 static const arch_entry cpu_arch[] =
 {
-  /* Do not replace the first two entries - i386_target_format()
-     relies on them being there in this order.  */
+  /* Do not replace the first two entries - i386_target_format() and
+     set_cpu_arch() rely on them being there in this order.  */
   ARCH (generic32, GENERIC32, GENERIC32, false),
   ARCH (generic64, GENERIC64, GENERIC64, false),
   ARCH (i8086, UNKNOWN, NONE, false),
@@ -2724,12 +2724,47 @@ set_cpu_arch (int dummy ATTRIBUTE_UNUSED)
 
   if (!is_end_of_line[(unsigned char) *input_line_pointer])
     {
-      char *string;
-      int e = get_symbol_name (&string);
-      unsigned int j;
+      char *s;
+      int e = get_symbol_name (&s);
+      const char *string = s;
+      unsigned int j = 0;
       i386_cpu_flags flags;
 
-      for (j = 0; j < ARRAY_SIZE (cpu_arch); j++)
+      if (strcmp (string, "default") == 0)
+	{
+	  if (strcmp (default_arch, "iamcu") == 0)
+	    string = default_arch;
+	  else
+	    {
+	      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
+		{
+		  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].flags;
+	      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, cpu_arch[j].name) == 0)
 	    {
@@ -2802,7 +2837,7 @@ set_cpu_arch (int dummy ATTRIBUTE_UNUSED)
 	  j = ARRAY_SIZE (cpu_arch);
 	}
 
-      if (j >= ARRAY_SIZE (cpu_arch))
+      if (j == ARRAY_SIZE (cpu_arch))
 	as_bad (_("no such architecture: `%s'"), string);
 
       *input_line_pointer = e;
@@ -13676,6 +13711,13 @@ show_arch (FILE *stream, int ext, int check)
 
   p = start;
   left = size - (start - message);
+
+  if (!ext && check)
+    {
+      p = output_message (stream, p, message, start, &left,
+			  STRING_COMMA_LEN ("default"));
+    }
+
   for (j = 0; j < ARRAY_SIZE (cpu_arch); j++)
     {
       /* Should it be skipped?  */
diff --git a/gas/doc/c-i386.texi b/gas/doc/c-i386.texi
index 5262af2023b..95fd8ec9dc9 100644
--- a/gas/doc/c-i386.texi
+++ b/gas/doc/c-i386.texi
@@ -1504,6 +1504,7 @@ directive enables a warning when gas detects an instruction that is not
 supported on the CPU specified.  The choices for @var{cpu_type} are:
 
 @multitable @columnfractions .20 .20 .20 .20
+@item @samp{default}
 @item @samp{i8086} @tab @samp{i186} @tab @samp{i286} @tab @samp{i386}
 @item @samp{i486} @tab @samp{i586} @tab @samp{i686} @tab @samp{pentium}
 @item @samp{pentiumpro} @tab @samp{pentiumii} @tab @samp{pentiumiii} @tab @samp{pentium4}
@@ -1531,7 +1532,7 @@ supported on the CPU specified.  The choices for @var{cpu_type} are:
 @item @samp{.avx512_vpopcntdq} @tab @samp{.avx512_vbmi2} @tab @samp{.avx512_vnni}
 @item @samp{.avx512_bitalg} @tab @samp{.avx512_bf16} @tab @samp{.avx512_vp2intersect}
 @item @samp{.tdx} @tab @samp{.avx_vnni}  @tab @samp{.avx512_fp16}
-@item @samp{.clwb} @tab @samp{.rdpid} @tab @samp{.ptwrite} @tab @item @samp{.ibt}
+@item @samp{.clwb} @tab @samp{.rdpid} @tab @samp{.ptwrite} @tab @samp{.ibt}
 @item @samp{.wbnoinvd} @tab @samp{.pconfig} @tab @samp{.waitpkg} @tab @samp{.cldemote}
 @item @samp{.shstk} @tab @samp{.gfni} @tab @samp{.vaes} @tab @samp{.vpclmulqdq}
 @item @samp{.movdiri} @tab @samp{.movdir64b} @tab @samp{.enqcmd} @tab @samp{.tsxldtrk}
diff --git a/gas/testsuite/gas/i386/arch-dflt.l b/gas/testsuite/gas/i386/arch-dflt.l
new file mode 100644
index 00000000000..d0953b1f86d
--- /dev/null
+++ b/gas/testsuite/gas/i386/arch-dflt.l
@@ -0,0 +1,19 @@
+.*: Assembler messages:
+.*:3: Error:.*`cmovl'.*
+.*:9: Error:.*`cmovg'.*
+GAS LISTING .*
+
+
+[ 	]*[0-9]*[ 	]+\.text
+[ 	]*[0-9]*[ 	]+start:
+[ 	]*[0-9]*[ 	]+cmovl	%eax, %ecx
+[ 	]*[0-9]*[ 	]*
+[ 	]*[0-9]*[ 	]+\.arch default
+[ 	]*[0-9]*[ 	]+\?\?\?\? 0F4DC8[ 	]+cmovnl	%eax, %ecx
+[ 	]*[0-9]*[ 	]*
+[ 	]*[0-9]*[ 	]+\.arch generic32
+[ 	]*[0-9]*[ 	]+cmovg	%eax, %ecx
+[ 	]*[0-9]*[ 	]*
+[ 	]*[0-9]*[ 	]+\.arch default
+[ 	]*[0-9]*[ 	]+\?\?\?\? 0F4EC8[ 	]+cmovng	%eax, %ecx
+#pass
diff --git a/gas/testsuite/gas/i386/arch-dflt.s b/gas/testsuite/gas/i386/arch-dflt.s
new file mode 100644
index 00000000000..718bf6f4d51
--- /dev/null
+++ b/gas/testsuite/gas/i386/arch-dflt.s
@@ -0,0 +1,14 @@
+	.text
+start:
+	cmovl	%eax, %ecx
+
+	.arch default
+	cmovnl	%eax, %ecx
+
+	.arch generic32
+	cmovg	%eax, %ecx
+
+	.arch default
+	cmovng	%eax, %ecx
+
+	.end
diff --git a/gas/testsuite/gas/i386/i386.exp b/gas/testsuite/gas/i386/i386.exp
index ebb1b492462..de4eb1cfba5 100644
--- a/gas/testsuite/gas/i386/i386.exp
+++ b/gas/testsuite/gas/i386/i386.exp
@@ -205,6 +205,7 @@ if [gas_32_check] then {
     run_dump_test "arch-12"
     run_dump_test "arch-13"
     run_dump_test "arch-14"
+    run_list_test "arch-dflt" "-march=generic32 -al"
     run_dump_test "8087"
     run_dump_test "287"
     run_dump_test "387"


                 reply	other threads:[~2022-07-06  7:23 UTC|newest]

Thread overview: [no followups] expand[flat|nested]  mbox.gz  Atom feed

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20220706072303.415683857C49@sourceware.org \
    --to=jbeulich@sourceware.org \
    --cc=bfd-cvs@sourceware.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).