public inbox for binutils@sourceware.org
 help / color / mirror / Atom feed
From: liuzhensong <liuzhensong@loongson.cn>
To: binutils@sourceware.org
Cc: i.swmail@xen0n.name, xry111@xry111.site, maskray@google.com,
	mengqinggang@loongson.cn, liuzhensong <liuzhensong@loongson.cn>
Subject: [PATCH v2] LoongArch: Set e_flags to 0x40 of ELF while using new relocations.
Date: Wed, 21 Sep 2022 09:17:56 +0800	[thread overview]
Message-ID: <20220921011756.451005-1-liuzhensong@loongson.cn> (raw)

  As the docs[1] describes, update the e_flags of ELF.
  1. 32 or 64 bit is represented by EI_CLASS.
  2. The bits of e_flags
       Base ABI [2:0]:
         soft float    --  0x1
         single float  --  0x2
         double float  --  0x3

       ABI version [7:6]:
         obj-v0 -- 0x0
         obj-v1 -- 0x1
  3. Discussions [2].

  docs:
  [1] https://github.com/loongson/LoongArch-Documentation/blob/
      main/docs/LoongArch-ELF-ABI-EN.adoc#e_flags-identifies-abi-type-and-version
  [2] https://github.com/loongson/LoongArch-Documentation/pull/61
---
 bfd/elfnn-loongarch.c     | 21 ++++++++++++++++---
 binutils/readelf.c        | 10 ++++-----
 gas/config/tc-loongarch.c | 20 +++++++++---------
 include/elf/loongarch.h   | 44 +++++++++++++++++++--------------------
 4 files changed, 54 insertions(+), 41 deletions(-)

diff --git a/bfd/elfnn-loongarch.c b/bfd/elfnn-loongarch.c
index 33c85e5207c..5b4b83eb07a 100644
--- a/bfd/elfnn-loongarch.c
+++ b/bfd/elfnn-loongarch.c
@@ -416,8 +416,22 @@ elfNN_loongarch_merge_private_bfd_data (bfd *ibfd, struct bfd_link_info *info)
       elf_elfheader (obfd)->e_flags = in_flags;
       return true;
     }
+  else if (out_flags != in_flags)
+    {
+      if ((EF_LOONGARCH_IS_OBJ_V0 (out_flags)
+	   && EF_LOONGARCH_IS_OBJ_V1 (in_flags))
+	  || (EF_LOONGARCH_IS_OBJ_V0 (in_flags)
+	      && EF_LOONGARCH_IS_OBJ_V1 (out_flags)))
+	{
+	  elf_elfheader (obfd)->e_flags |= EF_LOONGARCH_ABI_OBJ_V1;
+	  out_flags = elf_elfheader (obfd)->e_flags;
+	  in_flags = out_flags;
+	}
+    }
 
   /* Disallow linking different ABIs.  */
+  /* Only check relocation version.
+     The obj_v0 is compatible with obj_v1 in this "release cycle".  */
   if (EF_LOONGARCH_ABI(out_flags ^ in_flags) & EF_LOONGARCH_ABI_MASK)
     {
       _bfd_error_handler (_("%pB: can't link different ABI object."), ibfd);
@@ -1579,15 +1593,16 @@ loongarch_elf_size_dynamic_sections (bfd *output_bfd,
       if (bfd_link_executable (info) && !info->nointerp)
 	{
 	  const char *interpreter;
-	  flagword flags = elf_elfheader (output_bfd)->e_flags;
 	  s = bfd_get_linker_section (dynobj, ".interp");
 	  BFD_ASSERT (s != NULL);
-	  if (EF_LOONGARCH_IS_ILP32 (flags))
+
+	  if (elf_elfheader (output_bfd)->e_ident[EI_CLASS] == ELFCLASS32)
 	    interpreter = "/lib32/ld.so.1";
-	  else if (EF_LOONGARCH_IS_LP64 (flags))
+	  else if (elf_elfheader (output_bfd)->e_ident[EI_CLASS] == ELFCLASS64)
 	    interpreter = "/lib64/ld.so.1";
 	  else
 	    interpreter = "/lib/ld.so.1";
+
 	  s->contents = (unsigned char *) interpreter;
 	  s->size = strlen (interpreter) + 1;
 	}
diff --git a/binutils/readelf.c b/binutils/readelf.c
index cafba9a4f56..6926cf16140 100644
--- a/binutils/readelf.c
+++ b/binutils/readelf.c
@@ -4340,11 +4340,6 @@ get_machine_flags (Filedata * filedata, unsigned e_flags, unsigned e_machine)
 	    }
 	  break;
 	case EM_LOONGARCH:
-	  if (EF_LOONGARCH_IS_LP64 (e_flags))
-	    strcat (buf, ", LP64");
-	  else if (EF_LOONGARCH_IS_ILP32 (e_flags))
-	    strcat (buf, ", ILP32");
-
 	  if (EF_LOONGARCH_IS_SOFT_FLOAT (e_flags))
 	    strcat (buf, ", SOFT-FLOAT");
 	  else if (EF_LOONGARCH_IS_SINGLE_FLOAT (e_flags))
@@ -4352,6 +4347,11 @@ get_machine_flags (Filedata * filedata, unsigned e_flags, unsigned e_machine)
 	  else if (EF_LOONGARCH_IS_DOUBLE_FLOAT (e_flags))
 	    strcat (buf, ", DOUBLE-FLOAT");
 
+	  if (EF_LOONGARCH_IS_OBJ_V0 (e_flags))
+	    strcat (buf, ", OBJ-v0");
+	  else if (EF_LOONGARCH_IS_OBJ_V1 (e_flags))
+	    strcat (buf, ", OBJ-v1");
+
 	  break;
 	}
     }
diff --git a/gas/config/tc-loongarch.c b/gas/config/tc-loongarch.c
index 5bb8d317c5a..3e9204a5fa4 100644
--- a/gas/config/tc-loongarch.c
+++ b/gas/config/tc-loongarch.c
@@ -143,13 +143,13 @@ md_parse_option (int c, const char *arg)
   char ilp32[256] = "";
   unsigned char *suf = (unsigned char *)arg;
 
-  lp64['s'] = lp64['S'] = EF_LOONGARCH_ABI_LP64_SOFT_FLOAT;
-  lp64['f'] = lp64['F'] = EF_LOONGARCH_ABI_LP64_SINGLE_FLOAT;
-  lp64['d'] = lp64['D'] = EF_LOONGARCH_ABI_LP64_DOUBLE_FLOAT;
+  lp64['s'] = lp64['S'] = EF_LOONGARCH_ABI_SOFT_FLOAT;
+  lp64['f'] = lp64['F'] = EF_LOONGARCH_ABI_SINGLE_FLOAT;
+  lp64['d'] = lp64['D'] = EF_LOONGARCH_ABI_DOUBLE_FLOAT;
 
-  ilp32['s'] = ilp32['S'] = EF_LOONGARCH_ABI_ILP32_SOFT_FLOAT;
-  ilp32['f'] = ilp32['F'] = EF_LOONGARCH_ABI_ILP32_SINGLE_FLOAT;
-  ilp32['d'] = ilp32['D'] = EF_LOONGARCH_ABI_ILP32_DOUBLE_FLOAT;
+  ilp32['s'] = ilp32['S'] = EF_LOONGARCH_ABI_SOFT_FLOAT;
+  ilp32['f'] = ilp32['F'] = EF_LOONGARCH_ABI_SINGLE_FLOAT;
+  ilp32['d'] = ilp32['D'] = EF_LOONGARCH_ABI_DOUBLE_FLOAT;
 
   switch (c)
     {
@@ -216,24 +216,24 @@ void
 loongarch_after_parse_args ()
 {
   /* Set default ABI/ISA LP64D.  */
-  if (!EF_LOONGARCH_IS_LP64(LARCH_opts.ase_abi)
-      && !EF_LOONGARCH_IS_ILP32(LARCH_opts.ase_abi))
+  if (!LARCH_opts.ase_ilp32)
     {
       if (strcmp (default_arch, "loongarch64") == 0)
 	{
-	  LARCH_opts.ase_abi = EF_LOONGARCH_ABI_LP64_DOUBLE_FLOAT;
+	  LARCH_opts.ase_abi = EF_LOONGARCH_ABI_DOUBLE_FLOAT;
 	  LARCH_opts.ase_ilp32 = 1;
 	  LARCH_opts.ase_lp64 = 1;
 	}
       else if (strcmp (default_arch, "loongarch32") == 0)
 	{
-	  LARCH_opts.ase_abi = EF_LOONGARCH_ABI_ILP32_DOUBLE_FLOAT;
+	  LARCH_opts.ase_abi = EF_LOONGARCH_ABI_DOUBLE_FLOAT;
 	  LARCH_opts.ase_ilp32 = 1;
 	}
       else
 	as_bad ("unknown default architecture `%s'", default_arch);
     }
 
+  LARCH_opts.ase_abi |= EF_LOONGARCH_ABI_OBJ_V1;
   /* Set default ISA double-float.  */
   if (!LARCH_opts.ase_nf
       && !LARCH_opts.ase_sf
diff --git a/include/elf/loongarch.h b/include/elf/loongarch.h
index 74757b82ca8..cceaa8cccc4 100644
--- a/include/elf/loongarch.h
+++ b/include/elf/loongarch.h
@@ -232,36 +232,34 @@ RELOC_NUMBER (R_LARCH_RELAX, 100)
 END_RELOC_NUMBERS (R_LARCH_count)
 
 /* Processor specific flags for the ELF header e_flags field.  */
-/*The flag lp64s/lp64f/lp64d/ilp32s/ilp32f/ilp32d 3bits. */
-#define EF_LOONGARCH_ABI_LP64_SOFT_FLOAT	0x1
-#define EF_LOONGARCH_ABI_LP64_SINGLE_FLOAT	0x2
-#define EF_LOONGARCH_ABI_LP64_DOUBLE_FLOAT	0x3
+/* ase ABI modifier, 3bits.  */
+#define EF_LOONGARCH_ABI_SOFT_FLOAT	0x1
+#define EF_LOONGARCH_ABI_SINGLE_FLOAT	0x2
+#define EF_LOONGARCH_ABI_DOUBLE_FLOAT	0x3
+#define EF_LOONGARCH_ABI_MODIFIER_MASK	0x7
 
-#define EF_LOONGARCH_ABI_ILP32_SOFT_FLOAT	0x5
-#define EF_LOONGARCH_ABI_ILP32_SINGLE_FLOAT	0x6
-#define EF_LOONGARCH_ABI_ILP32_DOUBLE_FLOAT	0x7
+#define EF_LOONGARCH_ABI_OBJ_V1  	0x40
+#define EF_LOONGARCH_ABI_OBJ_MASK	0xC0
 
-#define EF_LOONGARCH_ABI_MASK	    		0x7
-#define EF_LOONGARCH_ABI_ILP32_MASK	    	0x4
-#define EF_LOONGARCH_ABI_FLOAT_MASK	    	0x3
-#define EF_LOONGARCH_ABI_SOFT_FLOAT_MASK	0x1
-#define EF_LOONGARCH_ABI_SINGLE_FLOAT_MASK	0x2
-#define EF_LOONGARCH_ABI_DOUBLE_FLOAT_MASK	0x3
+#define EF_LOONGARCH_ABI_MASK \
+      (EF_LOONGARCH_ABI_OBJ_MASK | EF_LOONGARCH_ABI_MODIFIER_MASK)
 
-#define EF_LOONGARCH_ABI(abi)	(EF_LOONGARCH_ABI_MASK & (abi))
+#define EF_LOONGARCH_ABI_MODIFIER(abi) \
+      (EF_LOONGARCH_ABI_MODIFIER_MASK & (abi))
+#define EF_LOONGARCH_ABI_OBJ(abi) \
+      (EF_LOONGARCH_ABI_OBJ_MASK & (abi))
 
-#define EF_LOONGARCH_IS_LP64(abi) \
-  (EF_LOONGARCH_ABI(abi) && (!(EF_LOONGARCH_ABI(abi) & EF_LOONGARCH_ABI_ILP32_MASK)))
-#define EF_LOONGARCH_IS_ILP32(abi) \
-  (EF_LOONGARCH_ABI(abi) && (EF_LOONGARCH_ABI(abi) & EF_LOONGARCH_ABI_ILP32_MASK))
+#define EF_LOONGARCH_ABI(abi) ((abi) & EF_LOONGARCH_ABI_MASK)
 
 #define EF_LOONGARCH_IS_SOFT_FLOAT(abi) \
-  (!((EF_LOONGARCH_ABI(abi) & EF_LOONGARCH_ABI_FLOAT_MASK) ^ EF_LOONGARCH_ABI_SOFT_FLOAT_MASK))
-
+  (EF_LOONGARCH_ABI_MODIFIER (abi) == EF_LOONGARCH_ABI_SOFT_FLOAT)
 #define EF_LOONGARCH_IS_SINGLE_FLOAT(abi) \
-  (!((EF_LOONGARCH_ABI(abi) & EF_LOONGARCH_ABI_FLOAT_MASK) ^ EF_LOONGARCH_ABI_SINGLE_FLOAT_MASK))
-
+  (EF_LOONGARCH_ABI_MODIFIER (abi) == EF_LOONGARCH_ABI_SINGLE_FLOAT)
 #define EF_LOONGARCH_IS_DOUBLE_FLOAT(abi) \
-  (!((EF_LOONGARCH_ABI(abi) & EF_LOONGARCH_ABI_FLOAT_MASK) ^ EF_LOONGARCH_ABI_DOUBLE_FLOAT_MASK))
+  (EF_LOONGARCH_ABI_MODIFIER (abi) == EF_LOONGARCH_ABI_DOUBLE_FLOAT)
+
+#define EF_LOONGARCH_IS_OBJ_V0(abi) (!EF_LOONGARCH_ABI_OBJ(abi))
+#define EF_LOONGARCH_IS_OBJ_V1(abi) \
+      (EF_LOONGARCH_ABI_OBJ (abi) == EF_LOONGARCH_ABI_OBJ_V1)
 
 #endif /* _ELF_LOONGARCH_H */
-- 
2.31.1


             reply	other threads:[~2022-09-21  1:18 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-09-21  1:17 liuzhensong [this message]
2022-09-25  8:28 ` WANG Xuerui
2022-09-25  9:22   ` Xi Ruoyao
2022-09-27 16:49     ` Fangrui Song
2022-09-27  2:11   ` liuzhensong

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=20220921011756.451005-1-liuzhensong@loongson.cn \
    --to=liuzhensong@loongson.cn \
    --cc=binutils@sourceware.org \
    --cc=i.swmail@xen0n.name \
    --cc=maskray@google.com \
    --cc=mengqinggang@loongson.cn \
    --cc=xry111@xry111.site \
    /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).