[PATCH] CSKY: Support attribute section.

Cooper Qu cooper.qu@linux.alibaba.com
Wed Aug 26 03:21:14 GMT 2020


bfd
        * elf32-csky.c (csky_archs): Fix arch names.
        (csky_find_arch_with_name): New.
        (elf32_csky_merge_attributes): New.
        (csky_elf_merge_private_bfd_data): Add process of merge
        attribute section.
        (elf32_csky_obj_attrs_arg_type): New.
        (elf32_csky_obj_attrs_handle_unknown): New.
        (elf_backend_obj_attrs_vendor): Define.
        (elf_backend_obj_attrs_section): Define.
        (elf_backend_obj_attrs_arg_type): Define.
        (elf_backend_obj_attrs_section_type): Define.

binutils/
        * readelf.c (get_csky_section_type_name): New.
        (get_section_type_name): Add handler for CSKY.
        (display_csky_attribute): New.
        (process_arch_specific): Add handler for CSKY.
        * testsuite/binutils-all/strip-3.d: Remove .csky.attributes
        section.

elfcpp/
        * elfcpp.h (enum SHT): New enum SHT_CSKY_ATTRIBUTES.

gas/
        * gas/config/tc-csky.c (md_begin): Set attributes.
        (isa_flag): Change type to unsigned 64 bits.
        (struct csky_cpu_info): Likewise.
        (struct csky_macro_info): Likewise.
        (set_csky_attribute): New.
        * testsuite/gas/csky/802j.d: Ignore .csky.attributes section.
        * testsuite/gas/csky/all.d: Likewise.
        * testsuite/gas/csky/bsr1.d: Likewise.
        * testsuite/gas/csky/csky_vdsp.d: Likewise.
        * testsuite/gas/csky/cskyv2_all.d: Likewise.
        * testsuite/gas/csky/cskyv2_ck803r2.d: Likewise.
        * testsuite/gas/csky/cskyv2_ck860.d: Likewise.
        * testsuite/gas/csky/cskyv2_dsp.d: Likewise.
        * testsuite/gas/csky/cskyv2_elrw.d: Likewise.
        * testsuite/gas/csky/cskyv2_float.d: Likewise.
        * testsuite/gas/csky/enhance_dsp.d: Likewise.
        * testsuite/gas/csky/java.d: Likewise.
        * testsuite/gas/csky/v1_float.d: Likewise.
        * testsuite/gas/csky/v2_float_part1.d: Likewise.
        * testsuite/gas/csky/v2_float_part2.d: Likewise.
        * testsuite/gas/csky/v2_tls_gd.d: Likewise.
        * testsuite/gas/csky/v2_tls_ie.d: Likewise.
        * testsuite/gas/csky/v2_tls_ld.d: Likewise.
        * testsuite/gas/csky/v2_tls_le.d: Likewise.
        * testsuite/gas/elf/elf.exp: Add handler for CSKY.
        * testsuite/gas/elf/section2.e-csky: New.

include/
        * elf/csky.h (SHT_CSKY_ATTRIBUTES): Define.
        (Tag_CSKY_ARCH_NAME): New enum constant.
        (Tag_CSKY_CPU_NAME): Likewise.
        (Tag_CSKY_ISA_FLAGS): Likewise.
        (Tag_CSKY_DSP_VERSION): Likewise.
        (Tag_CSKY_VDSP_VERSION): Likewise.
        (Tag_CSKY_FPU_VERSION): Likewise.
        (Tag_CSKY_FPU_ABI): Likewise.
        (Tag_CSKY_FPU_ROUNDING): Likewise.
        (Tag_CSKY_FPU_DENORMAL): Likewise.
        (Tag_CSKY_FPU_Exception): Likewise.
        (Tag_CSKY_FPU_NUMBER_MODULE): Likewise.
        (Tag_CSKY_FPU_HARDFP): Likewise.
        (Tag_CSKY_MAX): Likewise.
        (VAL_CSKY_DSP_VERSION_EXTENSION): Likewise.
        (VAL_CSKY_DSP_VERSION_2): Likewise.
        (VAL_CSKY_VDSP_VERSION_1): Likewise.
        (VAL_CSKY_VDSP_VERSION_2): Likewise.
        (VAL_CSKY_FPU_ABI_SOFT): Likewise.
        (VAL_CSKY_FPU_ABI_SOFTFP): Likewise.
        (VAL_CSKY_FPU_ABI_HARD): Likewise.
        (VAL_CSKY_FPU_HARDFP_HALF): Likewise.
        (VAL_CSKY_FPU_HARDFP_SINGLE): Likewise.
        (VAL_CSKY_FPU_HARDFP_DOUBLE): Likewise.
        * opcode/csky.h (CSKY_ISA_VDSP_V2): Define.
        CSKYV1_ISA_E1: Change to long constant type.
        CSKYV2_ISA_E1: Likewise.
        CSKYV2_ISA_1E2: Likewise.
        CSKYV2_ISA_2E3: Likewise.
        CSKYV2_ISA_3E7: Likewise.
        CSKYV2_ISA_7E10: Likewise.
        CSKYV2_ISA_3E3R1: Likewise.
        CSKYV2_ISA_3E3R2: Likewise.
        CSKYV2_ISA_10E60: Likewise.
        CSKY_ISA_TRUST: Likewise.
        CSKY_ISA_CACHE: Likewise.
        CSKY_ISA_NVIC: Likewise.
        CSKY_ISA_CP: Likewise.
        CSKY_ISA_MP: Likewise.
        CSKY_ISA_MP_1E2: Likewise.
        CSKY_ISA_JAVA: Likewise.
        CSKY_ISA_MAC: Likewise.
        CSKY_ISA_MAC_DSP: Likewise.
        CSKY_ISA_DSP: Likewise.
        CSKY_ISA_DSP_1E2: Likewise.
        CSKY_ISA_DSP_ENHANCE: Likewise.
        CSKY_ISA_FLOAT_E1: Likewise.
        CSKY_ISA_FLOAT_1E2: Likewise.
        CSKY_ISA_FLOAT_1E3: Likewise.
        CSKY_ISA_FLOAT_3E4: Likewise.
        CSKY_ISA_VDSP: Likewise.

ld/
        * emulparams/cskyelf.sh: Support attribute section.
        * testsuite/ld-csky/tls-le-v1.d: Match .csky.attributes section.
        * ld/testsuite/ld-csky/tls-le.d: Likewise.
        * testsuite/ld-elf/non-contiguous.ld: Ignore .csky.attributes
        section.

opcodes/
        * csky-dis.c (CSKY_DEFAULT_ISA): Define.
        (csky_dis_info): Add member isa.
        (csky_find_inst_info): Skip instructions that do not belong to
        current CPU.
        (csky_get_disassembler): Get infomation from attribute section.
        (print_insn_csky): Set defualt ISA flag.
        * csky.h (CSKY_ISA_VDSP_2): Rename from CSKY_ISA_VDSP_V2.
        * csky-opc.h (struct csky_opcode): Change isa_flag16 and
        isa_flag32'type to unsigned 64 bits.

---
 bfd/ChangeLog                             |  14 +
 bfd/elf32-csky.c                          | 360 ++++++++++++++++++----
 binutils/ChangeLog                        |   9 +
 binutils/readelf.c                        | 121 ++++++++
 binutils/testsuite/binutils-all/strip-3.d |   2 +-
 elfcpp/ChangeLog                          |   4 +
 elfcpp/elfcpp.h                           |   4 +
 gas/ChangeLog                             |  29 ++
 gas/config/tc-csky.c                      |  90 +++++-
 gas/testsuite/gas/csky/802j.d             |   1 +
 gas/testsuite/gas/csky/all.d              |   1 +
 gas/testsuite/gas/csky/bsr1.d             |   1 +
 gas/testsuite/gas/csky/csky_vdsp.d        |   1 +
 gas/testsuite/gas/csky/cskyv2_all.d       |   1 +
 gas/testsuite/gas/csky/cskyv2_ck803r2.d   |   1 +
 gas/testsuite/gas/csky/cskyv2_ck860.d     |   3 +-
 gas/testsuite/gas/csky/cskyv2_dsp.d       |   3 +-
 gas/testsuite/gas/csky/cskyv2_elrw.d      |   1 +
 gas/testsuite/gas/csky/cskyv2_float.d     |   1 +
 gas/testsuite/gas/csky/enhance_dsp.d      |   1 +
 gas/testsuite/gas/csky/java.d             |   1 +
 gas/testsuite/gas/csky/v1_float.d         |   1 +
 gas/testsuite/gas/csky/v2_float_part1.d   |   1 +
 gas/testsuite/gas/csky/v2_float_part2.d   |   1 +
 gas/testsuite/gas/csky/v2_tls_gd.d        |   1 +
 gas/testsuite/gas/csky/v2_tls_ie.d        |   1 +
 gas/testsuite/gas/csky/v2_tls_ld.d        |   1 +
 gas/testsuite/gas/csky/v2_tls_le.d        |   3 +-
 gas/testsuite/gas/elf/elf.exp             |   3 +
 gas/testsuite/gas/elf/section2.e-csky     |   9 +
 include/ChangeLog                         |  54 ++++
 include/elf/csky.h                        |  75 +++++
 include/opcode/csky.h                     |  55 ++--
 ld/ChangeLog                              |   8 +
 ld/emulparams/cskyelf.sh                  |   1 +
 ld/testsuite/ld-csky/tls-le-v1.d          |   2 +
 ld/testsuite/ld-csky/tls-le.d             |   2 +
 ld/testsuite/ld-elf/non-contiguous.ld     |   1 +
 opcodes/ChangeLog                         |  12 +
 opcodes/csky-dis.c                        |  44 ++-
 opcodes/csky-opc.h                        |   4 +-
 41 files changed, 827 insertions(+), 101 deletions(-)
 create mode 100644 gas/testsuite/gas/elf/section2.e-csky

diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index 8a2677791fa..32735c24882 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,3 +1,17 @@
+2020-08-26  Cooper Qu  <cooper.qu@linux.alibaba.com>
+
+        * elf32-csky.c (csky_archs): Fix arch names.
+        (csky_find_arch_with_name): New.
+        (elf32_csky_merge_attributes): New.
+        (csky_elf_merge_private_bfd_data): Add process of merge
+        attribute section.
+        (elf32_csky_obj_attrs_arg_type): New.
+        (elf32_csky_obj_attrs_handle_unknown): New.
+        (elf_backend_obj_attrs_vendor): Define.
+        (elf_backend_obj_attrs_section): Define.
+        (elf_backend_obj_attrs_arg_type): Define.
+        (elf_backend_obj_attrs_section_type): Define.
+
 2020-08-26  Alan Modra  <amodra@gmail.com>
 
 	* archures.c (bfd_mach_ck860): Define.
diff --git a/bfd/elf32-csky.c b/bfd/elf32-csky.c
index 7806ec7417a..80155cd556e 100644
--- a/bfd/elf32-csky.c
+++ b/bfd/elf32-csky.c
@@ -56,14 +56,15 @@ typedef struct csky_arch_for_merge
 static struct csky_arch_for_merge csky_archs[] =
 {
   /* 510 and 610 merge to 610 without warning.  */
-  { "510",  CSKY_ARCH_510,  CSKY_V1,  0, 0},
-  { "610",  CSKY_ARCH_610,  CSKY_V1,  1, 0},
+  { "ck510",  CSKY_ARCH_510,  CSKY_V1,  0, 0},
+  { "ck610",  CSKY_ARCH_610,  CSKY_V1,  1, 0},
   /* 801, 802, 803, 807, 810 merge to largest one.  */
-  { "801",  CSKY_ARCH_801,  CSKY_V2,  0, 1},
-  { "802",  CSKY_ARCH_802,  CSKY_V2,  1, 1},
-  { "803",  CSKY_ARCH_803,  CSKY_V2,  2, 1},
-  { "807",  CSKY_ARCH_807,  CSKY_V2,  3, 1},
-  { "810",  CSKY_ARCH_810,  CSKY_V2,  4, 1},
+  { "ck801",  CSKY_ARCH_801,  CSKY_V2,  0, 1},
+  { "ck802",  CSKY_ARCH_802,  CSKY_V2,  1, 1},
+  { "ck803",  CSKY_ARCH_803,  CSKY_V2,  2, 1},
+  { "ck807",  CSKY_ARCH_807,  CSKY_V2,  3, 1},
+  { "ck810",  CSKY_ARCH_810,  CSKY_V2,  4, 1},
+  { "ck860",  CSKY_ARCH_860,  CSKY_V2,  5, 1},
   { NULL, 0, 0, 0, 0}
 };
 
@@ -2802,6 +2803,199 @@ csky_find_arch_with_eflag (const unsigned long arch_eflag)
   return csky_arch;
 }
 
+static csky_arch_for_merge *
+csky_find_arch_with_name (const char *name)
+{
+  csky_arch_for_merge *csky_arch = NULL;
+  const char *msg;
+
+  if (name == NULL)
+    return NULL;
+
+  for (csky_arch = csky_archs; csky_arch->name != NULL; csky_arch++)
+    {
+      if (strncmp (csky_arch->name, name, strlen (csky_arch->name)) == 0)
+	break;
+    }
+  if (csky_arch == NULL)
+    {
+      msg = _("warning: unrecognised arch name '%#x'");
+      (*_bfd_error_handler) (msg, name);
+      bfd_set_error (bfd_error_wrong_format);
+    }
+  return csky_arch;
+}
+
+static bfd_boolean
+elf32_csky_merge_attributes (bfd *ibfd, struct bfd_link_info *info)
+{
+  bfd *obfd = info->output_bfd;
+  obj_attribute *in_attr;
+  obj_attribute *out_attr;
+  obj_attribute tattr;
+  csky_arch_for_merge *old_arch = NULL;
+  csky_arch_for_merge *new_arch = NULL;
+  int i;
+  bfd_boolean result = TRUE;
+  const char *msg = NULL;
+
+  const char *sec_name = get_elf_backend_data (ibfd)->obj_attrs_section;
+
+  /* Skip the linker stubs file.  This preserves previous behavior
+     of accepting unknown attributes in the first input file - but
+     is that a bug?  */
+  if (ibfd->flags & BFD_LINKER_CREATED)
+    return TRUE;
+
+  /* Skip any input that hasn't attribute section.
+     This enables to link object files without attribute section with
+     any others.  */
+  if (bfd_get_section_by_name (ibfd, sec_name) == NULL)
+    {
+      return TRUE;
+    }
+
+  if (!elf_known_obj_attributes_proc (obfd)[0].i)
+    {
+      /* This is the first object.  Copy the attributes.  */
+      out_attr = elf_known_obj_attributes_proc (obfd);
+
+      /* If Tag_CSKY_CPU_NAME is already set, save it.  */
+      memcpy (&tattr, &out_attr[Tag_CSKY_ARCH_NAME], sizeof (tattr));
+
+      _bfd_elf_copy_obj_attributes (ibfd, obfd);
+
+      out_attr = elf_known_obj_attributes_proc (obfd);
+
+      /* Restore Tag_CSKY_CPU_NAME.  */
+      memcpy (&out_attr[Tag_CSKY_ARCH_NAME], &tattr, sizeof (tattr));
+
+      /* Use the Tag_null value to indicate the attributes have been
+	 initialized.  */
+      out_attr[0].i = 1;
+    }
+
+  in_attr = elf_known_obj_attributes_proc (ibfd);
+  out_attr = elf_known_obj_attributes_proc (obfd);
+
+  for (i = LEAST_KNOWN_OBJ_ATTRIBUTE; i < NUM_KNOWN_OBJ_ATTRIBUTES; i++)
+    {
+      /* Merge this attribute with existing attributes.  */
+      switch (i)
+        {
+	case Tag_CSKY_CPU_NAME:
+	case Tag_CSKY_ARCH_NAME:
+	  /* Do arch merge.  */
+	  new_arch = csky_find_arch_with_name (in_attr[Tag_CSKY_ARCH_NAME].s);
+	  old_arch = csky_find_arch_with_name (out_attr[Tag_CSKY_ARCH_NAME].s);
+
+	  if (new_arch != NULL && old_arch != NULL)
+	    {
+	      if (new_arch->class != old_arch->class)
+		{
+		  msg = _("%pB: machine flag conflict with target");
+		  (*_bfd_error_handler) (msg, ibfd);
+		  bfd_set_error (bfd_error_wrong_format);
+		  return FALSE;
+		}
+	      else if (new_arch->class_level != old_arch->class_level)
+		{
+		  csky_arch_for_merge *newest_arch =
+		    ((new_arch->class_level > old_arch->class_level) ?
+		  new_arch : old_arch);
+
+		  if (new_arch->do_warning || old_arch->do_warning)
+		    {
+		      msg = _("warning: file %pB's arch flag %s conflict "
+			      "with target %s,set target arch flag to %s");
+		      (*_bfd_error_handler) (msg, ibfd,  new_arch->name,
+					     old_arch->name,
+					     (newest_arch->name));
+		      bfd_set_error (bfd_error_wrong_format);
+                    }
+
+		  if (out_attr[Tag_CSKY_ARCH_NAME].s != NULL)
+		    bfd_release (obfd, out_attr[Tag_CSKY_ARCH_NAME].s);
+
+		  out_attr[Tag_CSKY_ARCH_NAME].s =
+		    _bfd_elf_attr_strdup (obfd, newest_arch->name);
+		}
+	    }
+
+	  break;
+
+	case Tag_CSKY_ISA_FLAGS:
+	case Tag_CSKY_ISA_EXT_FLAGS:
+	  /* Do ISA merge.  */
+	  break;
+
+	case Tag_CSKY_VDSP_VERSION:
+	  if (out_attr[i].i == 0)
+	    out_attr[i].i = in_attr[i].i;
+	  else if (out_attr[i].i != in_attr[i].i)
+	    {
+	      _bfd_error_handler
+		(_("Error: %pB and %pB has different VDSP version"), ibfd, obfd);
+	      result = FALSE;
+	    }
+	  break;
+
+	case Tag_CSKY_FPU_VERSION:
+	  if (out_attr[i].i <= in_attr[i].i
+	      && out_attr[i].i == 0)
+	    out_attr[i].i = in_attr[i].i;
+	  break;
+
+	case Tag_CSKY_DSP_VERSION:
+	  if (out_attr[i].i == 0)
+	    out_attr[i].i = in_attr[i].i;
+	  else if (out_attr[i].i != in_attr[i].i)
+	    {
+	      _bfd_error_handler
+		(_("Error: %pB and %pB has different DSP version"), ibfd, obfd);
+	      result = FALSE;
+	    }
+	  break;
+
+	case Tag_CSKY_FPU_ABI:
+	  if (out_attr[i].i != in_attr[i].i
+	      && (out_attr[i].i == 0
+		  || (out_attr[i].i == VAL_CSKY_FPU_ABI_SOFT
+		      && in_attr[i].i == VAL_CSKY_FPU_ABI_SOFTFP)))
+	    {
+	      out_attr[i].i = in_attr[i].i;
+	    }
+	  else if (out_attr[i].i == VAL_CSKY_FPU_ABI_HARD
+		   && (out_attr[i].i != in_attr[i].i
+		       && in_attr[i].i != 0))
+	    {
+	      _bfd_error_handler
+	       (_("Error: %pB and %pB has different FPU ABI"), ibfd, obfd);
+	       result = FALSE;
+	    }
+	  break;
+
+	default:
+	  result =
+	    result && _bfd_elf_merge_unknown_attribute_low (ibfd, obfd, i);
+	  break;
+	}
+
+      /* If out_attr was copied from in_attr then it won't have a type yet.  */
+      if (in_attr[i].type && !out_attr[i].type)
+	out_attr[i].type = in_attr[i].type;
+    }
+
+  /* Merge Tag_compatibility attributes and any common GNU ones.  */
+  if (!_bfd_elf_merge_object_attributes (ibfd, info))
+    return FALSE;
+
+  /* Check for any attributes not known on CSKY.  */
+  result &= _bfd_elf_merge_unknown_attribute_list (ibfd, obfd);
+
+  return result;
+}
+
 /* Merge backend specific data from an object file to the output
    object file when linking.  */
 
@@ -2813,6 +3007,9 @@ csky_elf_merge_private_bfd_data (bfd *ibfd, struct bfd_link_info *info)
   flagword new_flags;
   csky_arch_for_merge *old_arch = NULL;
   csky_arch_for_merge *new_arch = NULL;
+  flagword newest_flag = 0;
+  const char *sec_name;
+  obj_attribute *out_attr;
 
   /* Check if we have the same endianness.  */
   if (! _bfd_generic_verify_endian_match (ibfd, info))
@@ -2822,76 +3019,79 @@ csky_elf_merge_private_bfd_data (bfd *ibfd, struct bfd_link_info *info)
       || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
     return TRUE;
 
-  new_flags = elf_elfheader (ibfd)->e_flags;
-  old_flags = elf_elfheader (obfd)->e_flags;
+  /* Merge ".csky.attribute" section.  */
+  if (!elf32_csky_merge_attributes (ibfd, info))
+    return FALSE;
 
   if (! elf_flags_init (obfd))
     {
       /* First call, no flags set.  */
       elf_flags_init (obfd) = TRUE;
-      elf_elfheader (obfd)->e_flags = new_flags;
     }
-  else if (new_flags == old_flags)
-    /* Do nothing.  */
-    ;
-  else if (new_flags == 0 || old_flags == 0)
-    /* When one flag is 0, assign the other one's flag.  */
-      elf_elfheader (obfd)->e_flags = new_flags | old_flags;
-  else
+
+  /* Try to merge e_flag.  */
+  new_flags = elf_elfheader (ibfd)->e_flags;
+  old_flags = elf_elfheader (obfd)->e_flags;
+  out_attr = elf_known_obj_attributes_proc (obfd);
+
+  /* the flags like"e , f ,g ..." , we take collection.  */
+  newest_flag = (old_flags & (~CSKY_ARCH_MASK))
+   | (new_flags & (~CSKY_ARCH_MASK));
+
+  sec_name = get_elf_backend_data (ibfd)->obj_attrs_section;
+  if (bfd_get_section_by_name (ibfd, sec_name) == NULL)
     {
-      flagword newest_flag = 0;
+      /* Input BFDs have no ".csky.attribute" section.  */
+      new_arch = csky_find_arch_with_eflag (new_flags & CSKY_ARCH_MASK);
+      old_arch = csky_find_arch_with_name (out_attr[Tag_CSKY_ARCH_NAME].s);
 
-      if ((new_flags & CSKY_ARCH_MASK) != 0
-	  && (old_flags & CSKY_ARCH_MASK) != 0)
+      if (new_arch != NULL && old_arch != NULL)
 	{
-	  new_arch = csky_find_arch_with_eflag (new_flags & CSKY_ARCH_MASK);
-	  old_arch = csky_find_arch_with_eflag (old_flags & CSKY_ARCH_MASK);
-	  /* Collect flags like e, f, g.  */
-	  newest_flag = (old_flags & (~CSKY_ARCH_MASK))
-			 | (new_flags & (~CSKY_ARCH_MASK));
-	  if (new_arch != NULL && old_arch != NULL)
+	  if (new_arch->class != old_arch->class)
 	    {
-	      if (new_arch->class != old_arch->class)
+	      _bfd_error_handler
+		/* xgettext:c-format */
+		(_("%pB: machine flag conflict with target"), ibfd);
+	      bfd_set_error (bfd_error_wrong_format);
+	      return FALSE;
+	    }
+	  else if (new_arch->class_level != old_arch->class_level)
+	    {
+	      csky_arch_for_merge *newest_arch =
+		(new_arch->class_level > old_arch->class_level
+		 ? new_arch : old_arch);
+
+	      if (new_arch->do_warning || old_arch->do_warning)
 		{
 		  _bfd_error_handler
 		    /* xgettext:c-format */
-		    (_("%pB: machine flag conflict with target"), ibfd);
+		    (_("warning: file %pB's arch flag %s conflicts with "
+		       "target ck%s, using %s"),
+		     ibfd, new_arch->name, old_arch->name,
+		     newest_arch->name);
 		  bfd_set_error (bfd_error_wrong_format);
-		  return FALSE;
 		}
-	      else if (new_arch->class_level != old_arch->class_level)
-		{
-		  csky_arch_for_merge *newest_arch
-		    = (new_arch->class_level > old_arch->class_level
-		       ? new_arch : old_arch);
-		  if (new_arch->do_warning || old_arch->do_warning)
-		    {
-		      _bfd_error_handler
-			/* xgettext:c-format */
-			(_("warning: file %pB's arch flag ck%s conflicts with "
-			   "target ck%s, using ck%s"),
-			 ibfd, new_arch->name, old_arch->name,
-			 newest_arch->name);
-		       bfd_set_error (bfd_error_wrong_format);
-		    }
 
-		  newest_flag |= newest_arch->arch_eflag;
-		}
-	      else
-		newest_flag |= ((new_flags & (CSKY_ARCH_MASK | CSKY_ABI_MASK))
-				| (old_flags
-				   & (CSKY_ARCH_MASK | CSKY_ABI_MASK)));
+	      if (out_attr[Tag_CSKY_ARCH_NAME].s != NULL)
+		bfd_release (obfd, out_attr[Tag_CSKY_ARCH_NAME].s);
+
+	      out_attr[Tag_CSKY_ARCH_NAME].s =
+		_bfd_elf_attr_strdup (obfd, newest_arch->name);
 	    }
 	  else
 	    newest_flag |= ((new_flags & (CSKY_ARCH_MASK | CSKY_ABI_MASK))
 			    | (old_flags & (CSKY_ARCH_MASK | CSKY_ABI_MASK)));
 	}
       else
-	newest_flag |= ((new_flags & (CSKY_ARCH_MASK | CSKY_ABI_MASK))
-			| (old_flags & (CSKY_ARCH_MASK | CSKY_ABI_MASK)));
-
-      elf_elfheader (obfd)->e_flags = newest_flag;
+	{
+	  if (new_arch && new_arch->name != NULL)
+	    out_attr[Tag_CSKY_ARCH_NAME].s =
+	  _bfd_elf_attr_strdup (obfd, new_arch->name);
+	}
     }
+
+  elf_elfheader (obfd)->e_flags = newest_flag;
+
   return TRUE;
 }
 
@@ -5035,6 +5235,47 @@ csky_elf_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
   return TRUE;
 }
 
+/* Determine whether an object attribute tag takes an integer, a
+   string or both.  */
+
+static int
+elf32_csky_obj_attrs_arg_type (int tag)
+{
+  switch (tag)
+    {
+    case Tag_compatibility:
+      return ATTR_TYPE_FLAG_INT_VAL | ATTR_TYPE_FLAG_STR_VAL;
+    case Tag_CSKY_ARCH_NAME:
+    case Tag_CSKY_CPU_NAME:
+    case Tag_CSKY_FPU_NUMBER_MODULE:
+      return ATTR_TYPE_FLAG_STR_VAL;
+    case Tag_CSKY_ISA_FLAGS:
+    case Tag_CSKY_ISA_EXT_FLAGS:
+    case Tag_CSKY_DSP_VERSION:
+    case Tag_CSKY_VDSP_VERSION:
+    case Tag_CSKY_FPU_VERSION:
+    case Tag_CSKY_FPU_ABI:
+    case Tag_CSKY_FPU_ROUNDING:
+    case Tag_CSKY_FPU_HARDFP:
+    case Tag_CSKY_FPU_Exception:
+    case Tag_CSKY_FPU_DENORMAL:
+      return ATTR_TYPE_FLAG_INT_VAL;
+    default:
+      break;
+    }
+
+  return (tag & 1) != 0 ? ATTR_TYPE_FLAG_STR_VAL : ATTR_TYPE_FLAG_INT_VAL;
+}
+
+/* Attribute numbers >=64 (mod 128) can be safely ignored.  */
+
+static bfd_boolean
+elf32_csky_obj_attrs_handle_unknown (bfd *abfd ATTRIBUTE_UNUSED,
+				     int tag ATTRIBUTE_UNUSED)
+{
+  return TRUE;
+}
+
 /* End of external entry points for sizing and building linker stubs.  */
 
 /* CPU-related basic API.  */
@@ -5088,4 +5329,15 @@ csky_elf_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
 #define elf_backend_grok_prstatus             csky_elf_grok_prstatus
 #define elf_backend_grok_psinfo               csky_elf_grok_psinfo
 
+/* Attribute sections.  */
+#undef  elf_backend_obj_attrs_vendor
+#define elf_backend_obj_attrs_vendor          "csky"
+#undef  elf_backend_obj_attrs_section
+#define elf_backend_obj_attrs_section         ".csky.attributes"
+#undef  elf_backend_obj_attrs_arg_type
+#define elf_backend_obj_attrs_arg_type        elf32_csky_obj_attrs_arg_type
+#undef  elf_backend_obj_attrs_section_type
+#define elf_backend_obj_attrs_section_type    SHT_CSKY_ATTRIBUTES
+#define elf_backend_obj_attrs_handle_unknown  elf32_csky_obj_attrs_handle_unknown
+
 #include "elf32-target.h"
diff --git a/binutils/ChangeLog b/binutils/ChangeLog
index 4be47478b32..7bb1a9734e5 100644
--- a/binutils/ChangeLog
+++ b/binutils/ChangeLog
@@ -1,3 +1,12 @@
+2020-08-26  Cooper Qu  <cooper.qu@linux.alibaba.com>
+
+        * readelf.c (get_csky_section_type_name): New.
+        (get_section_type_name): Add handler for CSKY.
+        (display_csky_attribute): New.
+        (process_arch_specific): Add handler for CSKY.
+        * testsuite/binutils-all/strip-3.d: Remove .csky.attributes
+        section.
+
 2020-08-24  Alan Modra  <amodra@gmail.com>
 
 	* readelf.c (dump_section_as_strings) Avoid false positive
diff --git a/binutils/readelf.c b/binutils/readelf.c
index 86be92e3b00..4f2ac7a50c6 100644
--- a/binutils/readelf.c
+++ b/binutils/readelf.c
@@ -4310,6 +4310,16 @@ get_riscv_section_type_name (unsigned int sh_type)
     }
 }
 
+static const char *
+get_csky_section_type_name (unsigned int sh_type)
+{
+  switch (sh_type)
+    {
+    case SHT_CSKY_ATTRIBUTES:  return "CSKY_ATTRIBUTES";
+    default:  return NULL;
+    }
+}
+
 static const char *
 get_section_type_name (Filedata * filedata, unsigned int sh_type)
 {
@@ -4393,6 +4403,9 @@ get_section_type_name (Filedata * filedata, unsigned int sh_type)
 	    case EM_RISCV:
 	      result = get_riscv_section_type_name (sh_type);
 	      break;
+	    case EM_CSKY:
+	      result = get_csky_section_type_name (sh_type);
+	      break;
 	    default:
 	      result = NULL;
 	      break;
@@ -16345,6 +16358,110 @@ display_riscv_attribute (unsigned char *p,
   return p;
 }
 
+static unsigned char *
+display_csky_attribute (unsigned char * p,
+			const unsigned char * const end)
+{
+  unsigned int tag;
+  unsigned int val;
+  READ_ULEB (tag, p, end);
+
+  if (tag >= Tag_CSKY_MAX)
+    {
+      return display_tag_value (-1, p, end);
+    }
+
+  switch (tag)
+    {
+    case Tag_CSKY_ARCH_NAME:
+      printf ("  Tag_CSKY_ARCH_NAME:\t\t");
+      return display_tag_value (-1, p, end);
+    case Tag_CSKY_CPU_NAME:
+      printf ("  Tag_CSKY_CPU_NAME:\t\t");
+      return display_tag_value (-1, p, end);
+
+    case Tag_CSKY_ISA_FLAGS:
+      printf ("  Tag_CSKY_ISA_FLAGS:\t\t");
+      return display_tag_value (0, p, end);
+    case Tag_CSKY_ISA_EXT_FLAGS:
+      printf ("  Tag_CSKY_ISA_EXT_FLAGS:\t");
+      return display_tag_value (0, p, end);
+
+    case Tag_CSKY_DSP_VERSION:
+      printf ("  Tag_CSKY_DSP_VERSION:\t\t");
+      READ_ULEB (val, p, end);
+      if (val == VAL_CSKY_DSP_VERSION_EXTENSION)
+	printf ("DSP Extension\n");
+      else if (val == VAL_CSKY_DSP_VERSION_2)
+	printf ("DSP 2.0\n");
+      break;
+
+    case Tag_CSKY_VDSP_VERSION:
+      printf ("  Tag_CSKY_VDSP_VERSION:\t");
+      READ_ULEB (val, p, end);
+      printf ("VDSP Version %d\n", val);
+      break;
+
+    case Tag_CSKY_FPU_VERSION:
+      printf ("  Tag_CSKY_FPU_VERSION:\t\t");
+      READ_ULEB (val, p, end);
+      if (val == VAL_CSKY_FPU_VERSION_1)
+	printf ("ABIV1 FPU Version 1\n");
+      else if (val == VAL_CSKY_FPU_VERSION_2)
+	printf ("FPU Version 2\n");
+      break;
+
+    case Tag_CSKY_FPU_ABI:
+      printf ("  Tag_CSKY_FPU_ABI:\t\t");
+      READ_ULEB (val, p, end);
+      if (val == VAL_CSKY_FPU_ABI_HARD)
+	printf ("Hard\n");
+      else if (val == VAL_CSKY_FPU_ABI_SOFTFP)
+	printf ("SoftFP\n");
+      else if (val == VAL_CSKY_FPU_ABI_SOFT)
+	printf ("Soft\n");
+      break;
+    case Tag_CSKY_FPU_ROUNDING:
+      READ_ULEB (val, p, end);
+      if (val == 1) {
+	printf ("  Tag_CSKY_FPU_ROUNDING:\t");
+	printf ("Needed\n");
+      }
+      break;
+    case Tag_CSKY_FPU_DENORMAL:
+      READ_ULEB (val, p, end);
+      if (val == 1) {
+	printf ("  Tag_CSKY_FPU_DENORMAL:\t");
+	printf ("Needed\n");
+      }
+      break;
+    case Tag_CSKY_FPU_Exception:
+      READ_ULEB (val, p, end);
+      if (val == 1) {
+	printf ("  Tag_CSKY_FPU_Exception:\t");
+	printf ("Needed\n");
+      }
+      break;
+    case Tag_CSKY_FPU_NUMBER_MODULE:
+      printf ("  Tag_CSKY_FPU_NUMBER_MODULE:\t");
+      return display_tag_value (-1, p, end);
+    case Tag_CSKY_FPU_HARDFP:
+      printf ("  Tag_CSKY_FPU_HARDFP:\t\t");
+      READ_ULEB (val, p, end);
+      if (val & VAL_CSKY_FPU_HARDFP_HALF)
+	printf (" Half");
+      if (val & VAL_CSKY_FPU_HARDFP_SINGLE)
+	printf (" Single");
+      if (val & VAL_CSKY_FPU_HARDFP_DOUBLE)
+	printf (" Double");
+      printf ("\n");
+      break;
+    default:
+      return display_tag_value (tag, p, end);
+     }
+  return p;
+}
+
 static bfd_boolean
 process_attributes (Filedata * filedata,
 		    const char * public_name,
@@ -20133,6 +20250,10 @@ process_arch_specific (Filedata * filedata)
 				 display_tic6x_attribute,
 				 display_generic_attribute);
 
+    case EM_CSKY:
+      return process_attributes (filedata, "csky", SHT_CSKY_ATTRIBUTES,
+				 display_csky_attribute, NULL);
+
     default:
       return process_attributes (filedata, "gnu", SHT_GNU_ATTRIBUTES,
 				 display_public_gnu_attributes,
diff --git a/binutils/testsuite/binutils-all/strip-3.d b/binutils/testsuite/binutils-all/strip-3.d
index 2a886d2dcc6..cb2f78eef5c 100644
--- a/binutils/testsuite/binutils-all/strip-3.d
+++ b/binutils/testsuite/binutils-all/strip-3.d
@@ -1,6 +1,6 @@
 #PROG: strip
 #source: empty.s
-#strip: -R .text -R .data -R .bss -R .ARM.attributes -R .reginfo -R .gnu.attributes -R .MIPS.abiflags -R .pdr -R .xtensa.info -R .ARC.attributes -R .note.gnu.property -R .riscv.attributes
+#strip: -R .text -R .data -R .bss -R .ARM.attributes -R .reginfo -R .gnu.attributes -R .MIPS.abiflags -R .pdr -R .xtensa.info -R .ARC.attributes -R .note.gnu.property -R .riscv.attributes -R .csky.attributes
 #readelf: -S --wide
 #name: strip empty file
 #target: *-*-linux* *-*-gnu* arm*-*-uclinuxfdpiceabi
diff --git a/elfcpp/ChangeLog b/elfcpp/ChangeLog
index efb82c57703..e65f69b776a 100644
--- a/elfcpp/ChangeLog
+++ b/elfcpp/ChangeLog
@@ -1,3 +1,7 @@
+2020-08-26  Cooper Qu  <cooper.qu@linux.alibaba.com>
+
+        * elfcpp.h (enum SHT): New enum SHT_CSKY_ATTRIBUTES.
+
 2020-07-04  Nick Clifton  <nickc@redhat.com>
 
 	Binutils 2.35 branch created.
diff --git a/elfcpp/elfcpp.h b/elfcpp/elfcpp.h
index 9c7c6294e42..65d803c00e2 100644
--- a/elfcpp/elfcpp.h
+++ b/elfcpp/elfcpp.h
@@ -413,6 +413,10 @@ enum SHT
   // AARCH64-specific section type.
   SHT_AARCH64_ATTRIBUTES = 0x70000003,
 
+  // CSKY-specific section types.
+  // Object file compatibility attributes.
+  SHT_CSKY_ATTRIBUTES = 0x70000001,
+
   // Link editor is to sort the entries in this section based on the
   // address specified in the associated symbol table entry.
   SHT_ORDERED = 0x7fffffff
diff --git a/gas/ChangeLog b/gas/ChangeLog
index d8c92dbe28e..d76a1648fa5 100644
--- a/gas/ChangeLog
+++ b/gas/ChangeLog
@@ -1,3 +1,32 @@
+2020-08-26  Cooper Qu  <cooper.qu@linux.alibaba.com>
+
+        * gas/config/tc-csky.c (md_begin): Set attributes.
+        (isa_flag): Change type to unsigned 64 bits.
+        (struct csky_cpu_info): Likewise.
+        (struct csky_macro_info): Likewise.
+        (set_csky_attribute): New.
+        * testsuite/gas/csky/802j.d: Ignore .csky.attributes section.
+        * testsuite/gas/csky/all.d: Likewise.
+        * testsuite/gas/csky/bsr1.d: Likewise.
+        * testsuite/gas/csky/csky_vdsp.d: Likewise.
+        * testsuite/gas/csky/cskyv2_all.d: Likewise.
+        * testsuite/gas/csky/cskyv2_ck803r2.d: Likewise.
+        * testsuite/gas/csky/cskyv2_ck860.d: Likewise.
+        * testsuite/gas/csky/cskyv2_dsp.d: Likewise.
+        * testsuite/gas/csky/cskyv2_elrw.d: Likewise.
+        * testsuite/gas/csky/cskyv2_float.d: Likewise.
+        * testsuite/gas/csky/enhance_dsp.d: Likewise.
+        * testsuite/gas/csky/java.d: Likewise.
+        * testsuite/gas/csky/v1_float.d: Likewise.
+        * testsuite/gas/csky/v2_float_part1.d: Likewise.
+        * testsuite/gas/csky/v2_float_part2.d: Likewise.
+        * testsuite/gas/csky/v2_tls_gd.d: Likewise.
+        * testsuite/gas/csky/v2_tls_ie.d: Likewise.
+        * testsuite/gas/csky/v2_tls_ld.d: Likewise.
+        * testsuite/gas/csky/v2_tls_le.d: Likewise.
+        * testsuite/gas/elf/elf.exp: Add handler for CSKY.
+        * testsuite/gas/elf/section2.e-csky: New.
+
 2020-08-25  Alan Modra  <amodra@gmail.com>
 
 	PR26501
diff --git a/gas/config/tc-csky.c b/gas/config/tc-csky.c
index f621fa9824b..9f2975e5f68 100644
--- a/gas/config/tc-csky.c
+++ b/gas/config/tc-csky.c
@@ -212,7 +212,7 @@ enum
 unsigned int mach_flag = 0;
 unsigned int arch_flag = 0;
 unsigned int other_flag = 0;
-unsigned int isa_flag = 0;
+BFD_HOST_U_64_BIT isa_flag = 0;
 unsigned int dsp_flag = 0;
 
 typedef struct stack_size_entry
@@ -233,7 +233,7 @@ struct csky_cpu_info
 {
   const char *name;
   unsigned int mach_flag;
-  unsigned int isa_flag;
+  BFD_HOST_U_64_BIT isa_flag;
 };
 
 typedef enum
@@ -249,7 +249,7 @@ struct csky_macro_info
   const char *name;
   /* How many operands : if operands == 5, all of 1,2,3,4 are ok.  */
   long oprnd_num;
-  int isa_flag;
+  BFD_HOST_U_64_BIT isa_flag;
   /* Do the work.  */
   void (*handle_func)(void);
 };
@@ -1186,6 +1186,78 @@ md_show_usage (FILE *fp)
   -mvdsp			enable vector DSP instructions\n"));
 }
 
+static void set_csky_attribute (void)
+{
+  if (mach_flag & CSKY_ARCH_DSP)
+    {
+      if (dsp_flag & CSKY_DSP_FLAG_V2)
+	{
+	  /* Set DSPV2.  */
+	  bfd_elf_add_obj_attr_int (stdoutput, OBJ_ATTR_PROC,
+				    Tag_CSKY_DSP_VERSION,
+				    VAL_CSKY_DSP_VERSION_2);
+	}
+      else if (isa_flag & CSKY_ISA_DSP)
+	{
+	  /* Set DSP extension.  */
+	  bfd_elf_add_obj_attr_int (stdoutput, OBJ_ATTR_PROC,
+				    Tag_CSKY_DSP_VERSION,
+				    VAL_CSKY_DSP_VERSION_EXTENSION);
+	}
+      /* Set VDSP attribute.  */
+      if (isa_flag & CSKY_ISA_VDSP)
+	bfd_elf_add_obj_attr_int (stdoutput, OBJ_ATTR_PROC,
+				  Tag_CSKY_VDSP_VERSION,
+				  VAL_CSKY_VDSP_VERSION_1);
+
+      else if (isa_flag & CSKY_ISA_VDSP_2)
+	bfd_elf_add_obj_attr_int (stdoutput, OBJ_ATTR_PROC,
+				  Tag_CSKY_VDSP_VERSION,
+				  VAL_CSKY_VDSP_VERSION_2);
+
+    }
+
+  if (mach_flag & CSKY_ARCH_FLOAT)
+    {
+      unsigned int val = VAL_CSKY_FPU_HARDFP_SINGLE;
+      if (IS_CSKY_ARCH_V1 (mach_flag)) {
+	bfd_elf_add_obj_attr_int (stdoutput, OBJ_ATTR_PROC,
+				  Tag_CSKY_FPU_VERSION,
+				  VAL_CSKY_FPU_VERSION_1);
+      }
+      else
+	{
+	  if (isa_flag & CSKY_ISA_FLOAT_3E4)
+	    {
+	      bfd_elf_add_obj_attr_int (stdoutput, OBJ_ATTR_PROC,
+					Tag_CSKY_FPU_VERSION,
+					VAL_CSKY_FPU_VERSION_2);
+	      val |= VAL_CSKY_FPU_HARDFP_DOUBLE;
+	    }
+	  else
+	    {
+	      bfd_elf_add_obj_attr_int (stdoutput, OBJ_ATTR_PROC,
+					Tag_CSKY_FPU_VERSION,
+					VAL_CSKY_FPU_VERSION_2);
+	    }
+
+	  bfd_elf_add_obj_attr_int (stdoutput, OBJ_ATTR_PROC,
+				    Tag_CSKY_FPU_HARDFP,
+				    val);
+	  bfd_elf_add_obj_attr_string (stdoutput, OBJ_ATTR_PROC,
+				    Tag_CSKY_FPU_NUMBER_MODULE,
+				    "IEEE 754");
+	}
+    }
+
+
+  bfd_elf_add_obj_attr_int (stdoutput, OBJ_ATTR_PROC,
+			    Tag_CSKY_ISA_FLAGS, isa_flag);
+
+  bfd_elf_add_obj_attr_int (stdoutput, OBJ_ATTR_PROC,
+			    Tag_CSKY_ISA_EXT_FLAGS, (isa_flag >> 32));
+}
+
 /* Target-specific initialization and option handling.  */
 
 void
@@ -1263,6 +1335,8 @@ md_begin (void)
   for (p_arch = csky_archs; p_arch->arch_flag != 0; p_arch++)
     if ((mach_flag & CSKY_ARCH_MASK) == (p_arch->arch_flag & CSKY_ARCH_MASK))
       {
+	bfd_elf_add_obj_attr_string (stdoutput, OBJ_ATTR_PROC,
+				     Tag_CSKY_ARCH_NAME, p_arch->name);
 	bfd_mach_flag =  p_arch->bfd_mach_flag;
 	break;
       }
@@ -1271,6 +1345,8 @@ md_begin (void)
   for (p_cpu = csky_cpus; p_cpu->mach_flag != 0; p_cpu++)
     if ((mach_flag & CPU_ARCH_MASK) == p_cpu->mach_flag)
       {
+	bfd_elf_add_obj_attr_string (stdoutput, OBJ_ATTR_PROC,
+				     Tag_CSKY_CPU_NAME, p_cpu->name);
 	isa_flag |= p_cpu->isa_flag;
 	break;
       }
@@ -1298,6 +1374,7 @@ md_begin (void)
 	    {
 	      /* In 803, dspv1 is conflict with dspv2. We keep dspv2.  */
 	      as_warn ("option -mdsp conflicts with -medsp, only enabling -medsp");
+        dsp_flag &= ~CSKY_DSP_FLAG_V1;
 	      isa_flag &= ~(CSKY_ISA_MAC_DSP | CSKY_ISA_DSP);
 	      isa_flag |= CSKY_ISA_DSP_ENHANCE;
 	    }
@@ -1306,6 +1383,7 @@ md_begin (void)
 	{
 	  if (dsp_flag & CSKY_DSP_FLAG_V2)
 	    {
+	      dsp_flag &= ~CSKY_DSP_FLAG_V2;
 	      isa_flag &= ~CSKY_ISA_DSP_ENHANCE;
 	      as_warn ("-medsp option is only supported by ck803s, ignoring -medsp");
 	    }
@@ -1370,7 +1448,7 @@ md_begin (void)
       else
 	do_intr_stack = 1;
     }
-  /* TODO: add isa_flag(SIMP/CACHE/APS).  */
+  /* Add isa_flag(SIMP/CACHE/APS).  */
   isa_flag |= (mach_flag & CSKY_ARCH_MAC) ? CSKY_ISA_MAC : 0;
   isa_flag |= (mach_flag & CSKY_ARCH_MP) ? CSKY_ISA_MP : 0;
   isa_flag |= (mach_flag & CSKY_ARCH_CP) ? CSKY_ISA_CP : 0;
@@ -1418,9 +1496,11 @@ md_begin (void)
     str_hash_insert (csky_macros_hash,
 		     v2_lrw_macro_opcode.name, &v2_lrw_macro_opcode, 0);
   /* Set e_flag to ELF Head.  */
-  bfd_set_private_flags (stdoutput, mach_flag);
+  bfd_set_private_flags (stdoutput, mach_flag & ~(0xffff));
   /* Set bfd_mach to bfd backend data.  */
   bfd_set_arch_mach (stdoutput, bfd_arch_csky, bfd_mach_flag);
+
+  set_csky_attribute ();
 }
 
 /* The C-SKY assembler emits mapping symbols $t and $d to mark the
diff --git a/gas/testsuite/gas/csky/802j.d b/gas/testsuite/gas/csky/802j.d
index af7c8577590..c75666b20cd 100644
--- a/gas/testsuite/gas/csky/802j.d
+++ b/gas/testsuite/gas/csky/802j.d
@@ -11,3 +11,4 @@ Disassembly of section \.text:
 \s*[0-9a-f]*:\s*1460\s*nie
 \s*[0-9a-f]*:\s*1461\s*nir
 \s*[0-9a-f]*:\s*3ae0\s*jmpix\s*r2,\s*16.*
+#...
diff --git a/gas/testsuite/gas/csky/all.d b/gas/testsuite/gas/csky/all.d
index c5da5b0cfd0..606bcc0d3c6 100644
--- a/gas/testsuite/gas/csky/all.d
+++ b/gas/testsuite/gas/csky/all.d
@@ -148,3 +148,4 @@ Disassembly of section \.text:
 \s*[0-9a-f]*:\s*1e37\s*or\s*r7, r7, r3
 \s*[0-9a-f]*:\s*1715\s*xor\s*r5, r5, r1
 \s*[0-9a-f]*:\s*1726\s*xor\s*r6, r6, r2
+#...
diff --git a/gas/testsuite/gas/csky/bsr1.d b/gas/testsuite/gas/csky/bsr1.d
index 91ba60df164..69bef886879 100644
--- a/gas/testsuite/gas/csky/bsr1.d
+++ b/gas/testsuite/gas/csky/bsr1.d
@@ -10,3 +10,4 @@ Disassembly of section \.text:
 \s*[0-9a-f]:\s*f7fe\s*br\s*0x0\s*\/\/\s*0\s*\<lable*\>
 \s*[0-9a-f]:\s*e7fd\s*bt\s*0x0\s*\/\/\s*0\s*\<lable*\>
 \s*[0-9a-f]:\s*effc\s*bf\s*0x0\s*\/\/\s*0\s*\<lable*\>
+#...
diff --git a/gas/testsuite/gas/csky/csky_vdsp.d b/gas/testsuite/gas/csky/csky_vdsp.d
index 0e2eaa2c0d1..3af441315b9 100644
--- a/gas/testsuite/gas/csky/csky_vdsp.d
+++ b/gas/testsuite/gas/csky/csky_vdsp.d
@@ -362,3 +362,4 @@ Disassembly of section \.text:
 \s*[0-9a-f]*:\s*f8830fa2\s*vicl\.8\s*vr2,\s*vr3,\s*vr4
 \s*[0-9a-f]*:\s*f8930fa2\s*vicl\.16\s*vr2,\s*vr3,\s*vr4
 \s*[0-9a-f]*:\s*fa830fa2\s*vicl\.32\s*vr2,\s*vr3,\s*vr4
+#...
diff --git a/gas/testsuite/gas/csky/cskyv2_all.d b/gas/testsuite/gas/csky/cskyv2_all.d
index 5092690aa3f..bb688ec97d4 100644
--- a/gas/testsuite/gas/csky/cskyv2_all.d
+++ b/gas/testsuite/gas/csky/cskyv2_all.d
@@ -323,3 +323,4 @@ Disassembly of section \.text:
 \s*[0-9a-f]*:\s*cc480000\s*lrs\.w\s*r2,\s*\[0x0\].*
 \s*[0-9a-f]*:\s*ec430002\s*ori\s*r2,\s*r3,\s*2
 \s*[0-9a-f]*:\s*ec43000a\s*ori\s*r2,\s*r3,\s*10
+#...
diff --git a/gas/testsuite/gas/csky/cskyv2_ck803r2.d b/gas/testsuite/gas/csky/cskyv2_ck803r2.d
index 298022aefdb..8ef9e905c09 100644
--- a/gas/testsuite/gas/csky/cskyv2_ck803r2.d
+++ b/gas/testsuite/gas/csky/cskyv2_ck803r2.d
@@ -10,3 +10,4 @@ Disassembly of section \.text:
 #...
 \s*[0-9a-f]*:\s*6c03\s*mov\s*r0,\s*r0
 \s*[0-9a-f]*:\s*e820fffd\s*bnezad\s*r0,\s*0.*
+#...
diff --git a/gas/testsuite/gas/csky/cskyv2_ck860.d b/gas/testsuite/gas/csky/cskyv2_ck860.d
index 2beb8845b7b..639bdbf8cd9 100644
--- a/gas/testsuite/gas/csky/cskyv2_ck860.d
+++ b/gas/testsuite/gas/csky/cskyv2_ck860.d
@@ -38,4 +38,5 @@ Disassembly of section \.text:
 \s*[0-9a-f]*:\s*c2000420\s*sync.s
 \s*[0-9a-f]*:\s*c0000420\s*sync
 \s*[0-9a-f]*:\s*d8437000\s*ldex.w\s*r2,\s*\(r3,\s*0x0\)
-\s*[0-9a-f]*:\s*dc437000\s*stex.w\s*r2,\s*\(r3,\s*0x0\)
\ No newline at end of file
+\s*[0-9a-f]*:\s*dc437000\s*stex.w\s*r2,\s*\(r3,\s*0x0\)
+#...
diff --git a/gas/testsuite/gas/csky/cskyv2_dsp.d b/gas/testsuite/gas/csky/cskyv2_dsp.d
index f2e3d33c309..3bc52fee8c3 100644
--- a/gas/testsuite/gas/csky/cskyv2_dsp.d
+++ b/gas/testsuite/gas/csky/cskyv2_dsp.d
@@ -1,4 +1,4 @@
-# name: csky - all
+# name: csky - dsp
 #as: -mcpu=ck810e -W
 #objdump: -D
 
@@ -16,3 +16,4 @@ Disassembly of section \.text:
 \s*[0-9a-f]*:\s*c4319080\s*mulshs\s*r17,\s*r1
 \s*[0-9a-f]*:\s*c6ec9440\s*mulswa\s*r12,\s*r23
 \s*[0-9a-f]*:\s*c4a39480\s*mulsws\s*r3,\s*r5
+#...
diff --git a/gas/testsuite/gas/csky/cskyv2_elrw.d b/gas/testsuite/gas/csky/cskyv2_elrw.d
index 5a52d5ac57f..d0acefbfce4 100644
--- a/gas/testsuite/gas/csky/cskyv2_elrw.d
+++ b/gas/testsuite/gas/csky/cskyv2_elrw.d
@@ -8,3 +8,4 @@
 #...
 \s*[0-9a-f]*:\s*c0004020\s*rte
 \s*[0-9a-f]*:\s*00001234\s*\.long\s*0x00001234
+#...
diff --git a/gas/testsuite/gas/csky/cskyv2_float.d b/gas/testsuite/gas/csky/cskyv2_float.d
index f1039c9e68a..b1ed9cb72e3 100644
--- a/gas/testsuite/gas/csky/cskyv2_float.d
+++ b/gas/testsuite/gas/csky/cskyv2_float.d
@@ -57,3 +57,4 @@ Disassembly of section \.text:
 \s*[0-9a-f]*:\s*f4041aab\s*fuitod\s*fr11,\s*fr4
 \s*[0-9a-f]*:\s*f4081ac2\s*fdtos\s*fr2,\s*fr8
 \s*[0-9a-f]*:\s*f40b1ae5\s*fstod\s*fr5,\s*fr11
+#...
diff --git a/gas/testsuite/gas/csky/enhance_dsp.d b/gas/testsuite/gas/csky/enhance_dsp.d
index 96d26ab6c50..17b33eaecb0 100644
--- a/gas/testsuite/gas/csky/enhance_dsp.d
+++ b/gas/testsuite/gas/csky/enhance_dsp.d
@@ -216,3 +216,4 @@ Disassembly of section \.text:
 \s*[0-9a-f]*:\s*f8838ce2\s*mulsca\.s16\.e\s*r2,\s*r3,\s*r4
 \s*[0-9a-f]*:\s*f8838ce2\s*mulsca\.s16\.e\s*r2,\s*r3,\s*r4
 \s*[0-9a-f]*:\s*f8838442\s*mula\.32\.l\s*r2,\s*r3,\s*r4
+#...
diff --git a/gas/testsuite/gas/csky/java.d b/gas/testsuite/gas/csky/java.d
index f433d529089..c0791bff037 100644
--- a/gas/testsuite/gas/csky/java.d
+++ b/gas/testsuite/gas/csky/java.d
@@ -10,3 +10,4 @@ Disassembly of section \.text:
 \s*[0-9a-f]:\s*14ae\s*bpop\.w\s*r3
 \s*[0-9a-f]:\s*14ec\s*bpush\.h\s*r3
 \s*[0-9a-f]:\s*14ee\s*bpush\.w\s*r3
+#...
diff --git a/gas/testsuite/gas/csky/v1_float.d b/gas/testsuite/gas/csky/v1_float.d
index 995a77d3826..4c08897706b 100644
--- a/gas/testsuite/gas/csky/v1_float.d
+++ b/gas/testsuite/gas/csky/v1_float.d
@@ -220,3 +220,4 @@ Disassembly of section \.text:
 \s*[0-9a-f]*:\s*ffe08002\s*\.long\s*0xffe08002
 \s*[0-9a-f]*:\s*ffe20002\s*\.long\s*0xffe20002
 \s*[0-9a-f]*:\s*ffe18002\s*\.long\s*0xffe18002
+#...
diff --git a/gas/testsuite/gas/csky/v2_float_part1.d b/gas/testsuite/gas/csky/v2_float_part1.d
index aa0b0a4495d..c3f5d56e7b6 100644
--- a/gas/testsuite/gas/csky/v2_float_part1.d
+++ b/gas/testsuite/gas/csky/v2_float_part1.d
@@ -52,3 +52,4 @@ Disassembly of section \.text:
 \s*[0-9a-f]*:\s*f4830202\s*fmuls\s*fr2,\s*fr3,\s*fr4
 \s*[0-9a-f]*:\s*f4830022\s*fsubs\s*fr2,\s*fr3,\s*fr4
 \s*[0-9a-f]*:\s*f4830002\s*fadds\s*fr2,\s*fr3,\s*fr4
+#...
diff --git a/gas/testsuite/gas/csky/v2_float_part2.d b/gas/testsuite/gas/csky/v2_float_part2.d
index 94b04e06e3b..78fa37bc038 100644
--- a/gas/testsuite/gas/csky/v2_float_part2.d
+++ b/gas/testsuite/gas/csky/v2_float_part2.d
@@ -18,3 +18,4 @@ Disassembly of section \.text:
 \s*[0-9a-f]*:\s*4048f5c3\s*\.long\s*0x4048f5c3
 \s*[0-9a-f]*:\s*51eb851f\s*\.long\s*0x51eb851f
 \s*[0-9a-f]*:\s*40091eb8\s*\.long\s*0x40091eb8
+#...
diff --git a/gas/testsuite/gas/csky/v2_tls_gd.d b/gas/testsuite/gas/csky/v2_tls_gd.d
index 226beaa5c7f..6680d6e0321 100644
--- a/gas/testsuite/gas/csky/v2_tls_gd.d
+++ b/gas/testsuite/gas/csky/v2_tls_gd.d
@@ -8,3 +8,4 @@ Disassembly of section \.text:
 #...
 \s*[0-9a-f]*:\s*R_CKCORE_TLS_GD32\s*xxx.*
 \s*[0-9a-f]*:\s*R_CKCORE_PLT32\s*__tls_get_addr
+#...
diff --git a/gas/testsuite/gas/csky/v2_tls_ie.d b/gas/testsuite/gas/csky/v2_tls_ie.d
index db77387875a..d55d1cebffc 100644
--- a/gas/testsuite/gas/csky/v2_tls_ie.d
+++ b/gas/testsuite/gas/csky/v2_tls_ie.d
@@ -7,3 +7,4 @@
 Disassembly of section \.text:
 #...
 \s*[0-9a-f]*:\s*R_CKCORE_TLS_IE32\s*xxx.*
+#...
diff --git a/gas/testsuite/gas/csky/v2_tls_ld.d b/gas/testsuite/gas/csky/v2_tls_ld.d
index 9f12ace4dcc..4843a4198b4 100644
--- a/gas/testsuite/gas/csky/v2_tls_ld.d
+++ b/gas/testsuite/gas/csky/v2_tls_ld.d
@@ -9,3 +9,4 @@ Disassembly of section \.text:
 \s*[0-9a-f]*:\s*R_CKCORE_TLS_LDM32\s*xxx.*
 \s*[0-9a-f]*:\s*R_CKCORE_PLT32\s*__tls_get_addr
 \s*[0-9a-f]*:\s*R_CKCORE_TLS_LDO32\s*xxx
+#...
diff --git a/gas/testsuite/gas/csky/v2_tls_le.d b/gas/testsuite/gas/csky/v2_tls_le.d
index c34d6d70471..e4ab53637fe 100644
--- a/gas/testsuite/gas/csky/v2_tls_le.d
+++ b/gas/testsuite/gas/csky/v2_tls_le.d
@@ -1,4 +1,4 @@
-# name: csky - v2 TLS IE
+# name: csky - v2 TLS LE
 #as: -mcpu=ck810 -W
 #objdump: -Dr
 
@@ -7,3 +7,4 @@
 Disassembly of section \.text:
 #...
 \s*[0-9a-f]*:\s*R_CKCORE_TLS_LE32\s*xxx
+#...
diff --git a/gas/testsuite/gas/elf/elf.exp b/gas/testsuite/gas/elf/elf.exp
index 2f9893b3d2b..8520421ba30 100644
--- a/gas/testsuite/gas/elf/elf.exp
+++ b/gas/testsuite/gas/elf/elf.exp
@@ -65,6 +65,9 @@ if { [is_elf_format] } then {
     if {[istarget "avr*-*-*"]} {
 	set dump_opts {{as -mno-link-relax}}
     }
+    if {[istarget "csky*-*-*"]} {
+	set target_machine -csky
+    }
     if {[istarget "m32r*-*-*"]} then {
 	set target_machine -m32r
     }
diff --git a/gas/testsuite/gas/elf/section2.e-csky b/gas/testsuite/gas/elf/section2.e-csky
new file mode 100644
index 00000000000..115bae2173d
--- /dev/null
+++ b/gas/testsuite/gas/elf/section2.e-csky
@@ -0,0 +1,9 @@
+
+Symbol table '.symtab' contains 6 entries:
+ +Num: +Value +Size +Type +Bind +Vis +Ndx +Name
+ +0: 0+0 +0 +NOTYPE +LOCAL +DEFAULT +UND 
+ +1: 0+0 +0 +SECTION +LOCAL +DEFAULT +1 
+ +2: 0+0 +0 +SECTION +LOCAL +DEFAULT +2 
+ +3: 0+0 +0 +SECTION +LOCAL +DEFAULT +3 
+ +4: 0+0 +0 +SECTION +LOCAL +DEFAULT +4 
+ +5: 0+0 +0 +SECTION +LOCAL +DEFAULT +5 
diff --git a/include/ChangeLog b/include/ChangeLog
index 2ec02dc5000..97894c1f601 100644
--- a/include/ChangeLog
+++ b/include/ChangeLog
@@ -1,3 +1,57 @@
+2020-08-26  Cooper Qu  <cooper.qu@linux.alibaba.com>
+
+        * elf/csky.h (SHT_CSKY_ATTRIBUTES): Define.
+        (Tag_CSKY_ARCH_NAME): New enum constant.
+        (Tag_CSKY_CPU_NAME): Likewise.
+        (Tag_CSKY_ISA_FLAGS): Likewise.
+        (Tag_CSKY_DSP_VERSION): Likewise.
+        (Tag_CSKY_VDSP_VERSION): Likewise.
+        (Tag_CSKY_FPU_VERSION): Likewise.
+        (Tag_CSKY_FPU_ABI): Likewise.
+        (Tag_CSKY_FPU_ROUNDING): Likewise.
+        (Tag_CSKY_FPU_DENORMAL): Likewise.
+        (Tag_CSKY_FPU_Exception): Likewise.
+        (Tag_CSKY_FPU_NUMBER_MODULE): Likewise.
+        (Tag_CSKY_FPU_HARDFP): Likewise.
+        (Tag_CSKY_MAX): Likewise.
+        (VAL_CSKY_DSP_VERSION_EXTENSION): Likewise.
+        (VAL_CSKY_DSP_VERSION_2): Likewise.
+        (VAL_CSKY_VDSP_VERSION_1): Likewise.
+        (VAL_CSKY_VDSP_VERSION_2): Likewise.
+        (VAL_CSKY_FPU_ABI_SOFT): Likewise.
+        (VAL_CSKY_FPU_ABI_SOFTFP): Likewise.
+        (VAL_CSKY_FPU_ABI_HARD): Likewise.
+        (VAL_CSKY_FPU_HARDFP_HALF): Likewise.
+        (VAL_CSKY_FPU_HARDFP_SINGLE): Likewise.
+        (VAL_CSKY_FPU_HARDFP_DOUBLE): Likewise.
+        * opcode/csky.h (CSKY_ISA_VDSP_V2): Define.
+        CSKYV1_ISA_E1: Change to long constant type.
+        CSKYV2_ISA_E1: Likewise.
+        CSKYV2_ISA_1E2: Likewise.
+        CSKYV2_ISA_2E3: Likewise.
+        CSKYV2_ISA_3E7: Likewise.
+        CSKYV2_ISA_7E10: Likewise.
+        CSKYV2_ISA_3E3R1: Likewise.
+        CSKYV2_ISA_3E3R2: Likewise.
+        CSKYV2_ISA_10E60: Likewise.
+        CSKY_ISA_TRUST: Likewise.
+        CSKY_ISA_CACHE: Likewise.
+        CSKY_ISA_NVIC: Likewise.
+        CSKY_ISA_CP: Likewise.
+        CSKY_ISA_MP: Likewise.
+        CSKY_ISA_MP_1E2: Likewise.
+        CSKY_ISA_JAVA: Likewise.
+        CSKY_ISA_MAC: Likewise.
+        CSKY_ISA_MAC_DSP: Likewise.
+        CSKY_ISA_DSP: Likewise.
+        CSKY_ISA_DSP_1E2: Likewise.
+        CSKY_ISA_DSP_ENHANCE: Likewise.
+        CSKY_ISA_FLOAT_E1: Likewise.
+        CSKY_ISA_FLOAT_1E2: Likewise.
+        CSKY_ISA_FLOAT_1E3: Likewise.
+        CSKY_ISA_FLOAT_3E4: Likewise.
+        CSKY_ISA_VDSP: Likewise.
+
 2020-08-24  Cooper Qu  <cooper.qu@linux.alibaba.com>
 
 	* opcode/csky.h (CSKYV2_ISA_10E60): New.
diff --git a/include/elf/csky.h b/include/elf/csky.h
index a0571392af0..cbce6c0173e 100644
--- a/include/elf/csky.h
+++ b/include/elf/csky.h
@@ -94,4 +94,79 @@ START_RELOC_NUMBERS (elf_csky_reloc_type)
     RELOC_NUMBER (R_CKCORE_PCREL_BLOOP_IMM12BY4, 64)
 END_RELOC_NUMBERS (R_CKCORE_MAX)
 
+/* Additional section types.  */
+#define SHT_CSKY_ATTRIBUTES       0x70000001 /* Section holds attributes.  */
+
+/* Object attribute tags.  */
+enum
+{
+  /* 0-3 are generic. */
+  /* Arch name for this object file.  */
+  Tag_CSKY_ARCH_NAME = 4,
+  Tag_CSKY_CPU_NAME = 5,
+
+  /* ISA flags for this object file.  */
+  Tag_CSKY_ISA_FLAGS,
+  Tag_CSKY_ISA_EXT_FLAGS,
+
+  /* CSKY DSP version used by this object file.  */
+  Tag_CSKY_DSP_VERSION,
+
+  /* CSKY VDSP version used by this object file.  */
+  Tag_CSKY_VDSP_VERSION,
+
+  /* CSKY FPU version used by this object file.  */
+  Tag_CSKY_FPU_VERSION = 0x10,
+  /* FPU ABI.  params: Soft GR/Hard GR/Hard FR. */
+  Tag_CSKY_FPU_ABI,
+  /* Rounding Support.  */
+  Tag_CSKY_FPU_ROUNDING,
+  /* Denormal Support.  */
+  Tag_CSKY_FPU_DENORMAL,
+  /* Exeception Support.  */
+  Tag_CSKY_FPU_Exception,
+  /* Number Module Support("IEEE 754").  */
+  Tag_CSKY_FPU_NUMBER_MODULE,
+  /* Half/Single/Double.  */
+  Tag_CSKY_FPU_HARDFP,
+
+  Tag_CSKY_MAX,
+};
+
+/* Object attribute values.  */
+enum
+{
+  /* Values defined for Tag_CSKY_DSP_VERSION.  */
+  VAL_CSKY_DSP_VERSION_EXTENSION = 1,	/* hi-lo DSP extension.  */
+  VAL_CSKY_DSP_VERSION_2 = 2,		/* CK803s EDSP.  */
+};
+
+enum
+{
+  /* Values defined for Tag_CSKY_VDSP_VERSION.  */
+  VAL_CSKY_VDSP_VERSION_1 = 1,	/* VDSP version 1.  */
+  VAL_CSKY_VDSP_VERSION_2	/* VDSP version 1.  */
+};
+
+enum
+{
+  /* Values defined for Tag_CSKY_FPU_VERSION.  */
+  VAL_CSKY_FPU_VERSION_1 = 1,	/* ABIV1 FPU.  */
+  VAL_CSKY_FPU_VERSION_2,	/* ABIV2 FPU.  */
+};
+
+enum
+{
+  VAL_CSKY_FPU_ABI_SOFT = 1,
+  VAL_CSKY_FPU_ABI_SOFTFP,
+  VAL_CSKY_FPU_ABI_HARD,
+};
+
+enum
+{
+  VAL_CSKY_FPU_HARDFP_HALF = 1,
+  VAL_CSKY_FPU_HARDFP_SINGLE = 2,
+  VAL_CSKY_FPU_HARDFP_DOUBLE = 4,
+};
+
 #endif /* _ELF_CSKY_H  */
diff --git a/include/opcode/csky.h b/include/opcode/csky.h
index 098bdc9ba65..493e822a5a3 100644
--- a/include/opcode/csky.h
+++ b/include/opcode/csky.h
@@ -22,41 +22,42 @@
 #include "dis-asm.h"
 
 /* The following bitmasks control instruction set architecture.  */
-#define CSKYV1_ISA_E1       (1 << 0)
-#define CSKYV2_ISA_E1       (1 << 1)
-#define CSKYV2_ISA_1E2      (1 << 2)
-#define CSKYV2_ISA_2E3      (1 << 3)
-#define CSKYV2_ISA_3E7      (1 << 4)
-#define CSKYV2_ISA_7E10     (1 << 5)
-#define CSKYV2_ISA_3E3R1    (1 << 6)
-#define CSKYV2_ISA_3E3R2    (1 << 7)
-#define CSKYV2_ISA_10E60    (1 << 8)
-
-#define CSKY_ISA_TRUST      (1 << 11)
-#define CSKY_ISA_CACHE      (1 << 12)
-#define CSKY_ISA_NVIC       (1 << 13)
-#define CSKY_ISA_CP         (1 << 14)
-#define CSKY_ISA_MP         (1 << 15)
-#define CSKY_ISA_MP_1E2     (1 << 16)
-#define CSKY_ISA_JAVA       (1 << 17)
-#define CSKY_ISA_MAC        (1 << 18)
-#define CSKY_ISA_MAC_DSP    (1 << 19)
+#define CSKYV1_ISA_E1       (1L << 0)
+#define CSKYV2_ISA_E1       (1L << 1)
+#define CSKYV2_ISA_1E2      (1L << 2)
+#define CSKYV2_ISA_2E3      (1L << 3)
+#define CSKYV2_ISA_3E7      (1L << 4)
+#define CSKYV2_ISA_7E10     (1L << 5)
+#define CSKYV2_ISA_3E3R1    (1L << 6)
+#define CSKYV2_ISA_3E3R2    (1L << 7)
+#define CSKYV2_ISA_10E60    (1L << 8)
+
+#define CSKY_ISA_TRUST      (1L << 11)
+#define CSKY_ISA_CACHE      (1L << 12)
+#define CSKY_ISA_NVIC       (1L << 13)
+#define CSKY_ISA_CP         (1L << 14)
+#define CSKY_ISA_MP         (1L << 15)
+#define CSKY_ISA_MP_1E2     (1L << 16)
+#define CSKY_ISA_JAVA       (1L << 17)
+#define CSKY_ISA_MAC        (1L << 18)
+#define CSKY_ISA_MAC_DSP    (1L << 19)
 
 /* Base ISA for csky v1 and v2.  */
-#define CSKY_ISA_DSP        (1 << 20)
-#define CSKY_ISA_DSP_1E2    (1 << 21)
-#define CSKY_ISA_DSP_ENHANCE (1 << 22)
+#define CSKY_ISA_DSP        (1L << 20)
+#define CSKY_ISA_DSP_1E2    (1L << 21)
+#define CSKY_ISA_DSP_ENHANCE (1L << 22)
 
 /* Base float instruction (803f & 810f).  */
-#define CSKY_ISA_FLOAT_E1   (1 << 25)
+#define CSKY_ISA_FLOAT_E1   (1L << 25)
 /* M_FLOAT support (810f).  */
-#define CSKY_ISA_FLOAT_1E2  (1 << 26)
+#define CSKY_ISA_FLOAT_1E2  (1L << 26)
 /* 803 support (803f).  */
-#define CSKY_ISA_FLOAT_1E3  (1 << 27)
+#define CSKY_ISA_FLOAT_1E3  (1L << 27)
 /* 807 support (803f & 807f).  */
-#define CSKY_ISA_FLOAT_3E4  (1 << 28)
+#define CSKY_ISA_FLOAT_3E4  (1L << 28)
 /* Vector DSP support.  */
-#define CSKY_ISA_VDSP       (1 << 29)
+#define CSKY_ISA_VDSP       (1L << 29)
+#define CSKY_ISA_VDSP_2     (1L << 30)
 
 /* The following bitmasks control cpu architecture for CSKY.  */
 #define CSKY_ABI_V1         (1 << 28)
diff --git a/ld/ChangeLog b/ld/ChangeLog
index a12f91302b7..32a6ac2d31b 100644
--- a/ld/ChangeLog
+++ b/ld/ChangeLog
@@ -1,3 +1,11 @@
+2020-08-26  Cooper Qu  <cooper.qu@linux.alibaba.com>
+
+        * emulparams/cskyelf.sh: Support attribute section.
+        * testsuite/ld-csky/tls-le-v1.d: Match .csky.attributes section.
+        * ld/testsuite/ld-csky/tls-le.d: Likewise.
+        * testsuite/ld-elf/non-contiguous.ld: Ignore .csky.attributes
+        section.
+
 2020-08-25  Alan Modra  <amodra@gmail.com>
 
 	* testsuite/ld-libs/libs.exp: Don't run on sh-pe, tic30 or tic54x.
diff --git a/ld/emulparams/cskyelf.sh b/ld/emulparams/cskyelf.sh
index d572ac8b648..b940c6c2978 100644
--- a/ld/emulparams/cskyelf.sh
+++ b/ld/emulparams/cskyelf.sh
@@ -10,6 +10,7 @@ MAXPAGESIZE="CONSTANT (MAXPAGESIZE)"
 TEXT_START_ADDR=0x8000
 CHECK_RELOCS_AFTER_OPEN_INPUT=yes
 NONPAGED_TEXT_START_ADDR=0
+ATTRS_SECTIONS='.csky.attributes 0 : { KEEP (*(.csky.attributes)) KEEP (*(.csky.attributes)) }'
 ARCH=csky
 EMBEDDED=yes
 EXTRA_EM_FILE=cskyelf
diff --git a/ld/testsuite/ld-csky/tls-le-v1.d b/ld/testsuite/ld-csky/tls-le-v1.d
index 034d5d95d9a..d13c403819d 100644
--- a/ld/testsuite/ld-csky/tls-le-v1.d
+++ b/ld/testsuite/ld-csky/tls-le-v1.d
@@ -12,3 +12,5 @@ Idx Name          Size      VMA       LMA       File off  Algn
                   .*
   1 .tbss         .*
                   .*
+  2 .csky.attributes .*
+                  .*
diff --git a/ld/testsuite/ld-csky/tls-le.d b/ld/testsuite/ld-csky/tls-le.d
index 8a0d90f03f4..0a241b3b467 100644
--- a/ld/testsuite/ld-csky/tls-le.d
+++ b/ld/testsuite/ld-csky/tls-le.d
@@ -11,3 +11,5 @@ Idx Name          Size      VMA       LMA       File off  Algn
                   .*
   1 .tbss         .*
                   .*
+  2 .csky.attributes .*
+                  .*
diff --git a/ld/testsuite/ld-elf/non-contiguous.ld b/ld/testsuite/ld-elf/non-contiguous.ld
index fc72253bfaa..cfd3f248476 100644
--- a/ld/testsuite/ld-elf/non-contiguous.ld
+++ b/ld/testsuite/ld-elf/non-contiguous.ld
@@ -23,6 +23,7 @@ SECTIONS
 	     *(.note.renesas)
 	     *(.MIPS.abiflags)
 	     *(.MSP430.attributes)
+	     *(.csky.attributes)
 	     *(.gnu.attributes)
    }
 
diff --git a/opcodes/ChangeLog b/opcodes/ChangeLog
index f1951d48817..3acc1f1b39e 100644
--- a/opcodes/ChangeLog
+++ b/opcodes/ChangeLog
@@ -1,3 +1,15 @@
+2020-08-26  Cooper Qu  <cooper.qu@linux.alibaba.com>
+
+        * csky-dis.c (CSKY_DEFAULT_ISA): Define.
+        (csky_dis_info): Add member isa.
+        (csky_find_inst_info): Skip instructions that do not belong to
+        current CPU.
+        (csky_get_disassembler): Get infomation from attribute section.
+        (print_insn_csky): Set defualt ISA flag.
+        * csky.h (CSKY_ISA_VDSP_2): Rename from CSKY_ISA_VDSP_V2.
+        * csky-opc.h (struct csky_opcode): Change isa_flag16 and
+        isa_flag32'type to unsigned 64 bits.
+
 2020-08-25  Alan Modra  <amodra@gmail.com>
 
 	PR 26504
diff --git a/opcodes/csky-dis.c b/opcodes/csky-dis.c
index 537725baa40..6becad01301 100644
--- a/opcodes/csky-dis.c
+++ b/opcodes/csky-dis.c
@@ -23,6 +23,7 @@
 #include "config.h"
 #include <stdio.h>
 #include "bfd_stdint.h"
+#include <elf/csky.h>
 #include "disassemble.h"
 #include "elf-bfd.h"
 #include "opcode/csky.h"
@@ -32,6 +33,7 @@
 
 #define CSKY_INST_TYPE unsigned long
 #define HAS_SUB_OPERAND (unsigned int)0xffffffff
+#define CSKY_DEFAULT_ISA 0xffffffff
 
 enum sym_type
 {
@@ -47,6 +49,7 @@ struct csky_dis_info
   disassemble_info *info;
   /* Opcode information.  */
   struct csky_opcode_info const *opinfo;
+  BFD_HOST_U_64_BIT isa;
   /* The value of operand to show.  */
   int value;
   /* Whether to look up/print a symbol name.  */
@@ -159,10 +162,8 @@ csky_find_inst_info (struct csky_opcode_info const **pinfo,
   p = g_opcodeP;
   while (p->mnemonic)
     {
-      /* FIXME: Skip 860's instruction in other CPUs. It is not suitable.
-	 These codes need to be optimized.  */
-      if (((CSKY_ARCH_MASK & mach_flag) != CSKY_ARCH_860)
-	  && (p->isa_flag32 & CSKYV2_ISA_10E60))
+	if (!(p->isa_flag16 & dis_info.isa)
+	      && !(p->isa_flag32 & dis_info.isa))
 	{
 	  p++;
 	  continue;
@@ -235,9 +236,28 @@ csky_symbol_is_valid (asymbol *sym,
 disassembler_ftype
 csky_get_disassembler (bfd *abfd)
 {
-  if (abfd != NULL)
-    mach_flag = elf_elfheader (abfd)->e_flags;
-  return print_insn_csky;
+  obj_attribute *attr;
+  const char *sec_name = NULL;
+  if (!abfd)
+    return NULL;
+
+  mach_flag = elf_elfheader (abfd)->e_flags;
+
+  sec_name = get_elf_backend_data (abfd)->obj_attrs_section;
+  /* Skip any input that hasn't attribute section.
+     This enables to link object files without attribute section with
+     any others.  */
+  if (bfd_get_section_by_name (abfd, sec_name) != NULL)
+    {
+      attr = elf_known_obj_attributes_proc (abfd);
+      dis_info.isa = attr[Tag_CSKY_ISA_EXT_FLAGS].i;
+      dis_info.isa <<= 32;
+      dis_info.isa |= attr[Tag_CSKY_ISA_FLAGS].i;
+    }
+  else
+    dis_info.isa = CSKY_DEFAULT_ISA;
+
+   return print_insn_csky;
 }
 
 static int
@@ -937,10 +957,16 @@ print_insn_csky (bfd_vma memaddr, struct disassemble_info *info)
   if (mach_flag != INIT_MACH_FLAG && mach_flag != BINARY_MACH_FLAG)
     info->mach = mach_flag;
   else if (mach_flag == INIT_MACH_FLAG)
-    mach_flag = info->mach;
+    {
+      mach_flag = info->mach;
+      dis_info.isa = CSKY_DEFAULT_ISA;
+    }
 
   if (mach_flag == BINARY_MACH_FLAG && info->endian == BFD_ENDIAN_UNKNOWN)
-    info->endian = BFD_ENDIAN_LITTLE;
+    {
+      info->endian = BFD_ENDIAN_LITTLE;
+      dis_info.isa = CSKY_DEFAULT_ISA;
+    }
 
   /* First check the full symtab for a mapping symbol, even if there
      are no usable non-mapping symbols for this address.  */
diff --git a/opcodes/csky-opc.h b/opcodes/csky-opc.h
index 796d3757024..95df44dad38 100644
--- a/opcodes/csky-opc.h
+++ b/opcodes/csky-opc.h
@@ -262,8 +262,8 @@ struct csky_opcode
   /* Encodings for 32-bit opcodes.  */
   struct csky_opcode_info op32[OP_TABLE_NUM];
   /* Instruction set flag.  */
-  unsigned int isa_flag16;
-  unsigned int isa_flag32;
+  BFD_HOST_U_64_BIT isa_flag16;
+  BFD_HOST_U_64_BIT isa_flag32;
   /* Whether this insn needs relocation, 0: no, !=0: yes.  */
   signed int reloc16;
   signed int reloc32;
-- 
2.26.2



More information about the Binutils mailing list