[PATCH] CSKY: Support attribute section.

Lifang Xia lifang_xia@c-sky.com
Fri Aug 28 09:25:46 GMT 2020


Merged.

On 2020/8/26 11:21, Cooper Qu wrote:
> 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;


More information about the Binutils mailing list