From 0861f561ebdd283e389c2c2fdb099bffadffecfa Mon Sep 17 00:00:00 2001 From: Cooper Qu Date: Wed, 26 Aug 2020 11:21:14 +0800 Subject: CSKY: Support attribute section. 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. --- gas/config/tc-csky.c | 90 +++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 85 insertions(+), 5 deletions(-) (limited to 'gas/config/tc-csky.c') diff --git a/gas/config/tc-csky.c b/gas/config/tc-csky.c index f621fa9..9f2975e 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 -- cgit v1.1