Date: Sat, 20 May 2006 06:39:57 GMT From: Kip Macy <kmacy@FreeBSD.org> To: Perforce Change Reviews <perforce@freebsd.org> Subject: PERFORCE change 97502 for review Message-ID: <200605200639.k4K6dvfC012015@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=97502 Change 97502 by kmacy@kmacy_storage:sun4v_work on 2006/05/20 06:39:03 import bits from latest binutils so that the %gl register (and others) will be recognized Affected files ... .. //depot/projects/kmacy_sun4v/src/contrib/binutils/gas/config/tc-sparc.c#3 edit .. //depot/projects/kmacy_sun4v/src/contrib/binutils/gas/write.c#3 edit Differences ... ==== //depot/projects/kmacy_sun4v/src/contrib/binutils/gas/config/tc-sparc.c#3 (text+ko) ==== @@ -1,6 +1,6 @@ /* tc-sparc.c -- Assemble for the SPARC Copyright 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, - 1999, 2000, 2001, 2002, 2003, 2004 + 1999, 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc. This file is part of GAS, the GNU Assembler. @@ -16,8 +16,8 @@ You should have received a copy of the GNU General Public License along with GAS; see the file COPYING. If not, write - to the Free Software Foundation, 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA. */ + to the Free Software Foundation, 51 Franklin Street - Fifth Floor, + Boston, MA 02110-1301, USA. */ #include <stdio.h> @@ -133,7 +133,7 @@ /* Handle of the OPCODE hash table. */ static struct hash_control *op_hash; -static int log2 PARAMS ((int)); +static int mylog2 PARAMS ((int)); static void s_data1 PARAMS ((void)); static void s_seg PARAMS ((int)); static void s_proc PARAMS ((int)); @@ -174,9 +174,6 @@ {NULL, 0, 0}, }; -/* Size of relocation record. */ -const int md_reloc_size = 12; - /* This array holds the chars that always start a comment. If the pre-processor is disabled, these aren't very useful. */ const char comment_chars[] = "!"; /* JF removed '|' from @@ -207,7 +204,7 @@ changed in read.c. Ideally it shouldn't have to know about it at all, but nothing is ideal around here. */ -#define isoctal(c) ((unsigned) ((c) - '0') < '8') +#define isoctal(c) ((unsigned) ((c) - '0') < 8) struct sparc_it { @@ -337,6 +334,10 @@ #endif #endif +#ifdef TE_VXWORKS + return "elf32-sparc-vxworks"; +#endif + #ifdef OBJ_ELF return sparc_arch_size == 64 ? "elf64-sparc" : "elf32-sparc"; #endif @@ -727,7 +728,7 @@ {NULL, NULL, NULL}, }; -/* sparc64 privileged registers. */ +/* sparc64 privileged and hyperprivileged registers. */ struct priv_reg_entry { @@ -753,10 +754,22 @@ {"otherwin", 13}, {"wstate", 14}, {"fq", 15}, + {"gl", 16}, {"ver", 31}, {"", -1}, /* End marker. */ }; +struct priv_reg_entry hpriv_reg_table[] = +{ + {"hpstate", 0}, + {"htstate", 1}, + {"hintp", 3}, + {"htba", 5}, + {"hver", 6}, + {"hstick_cmpr", 31}, + {"", -1}, /* End marker. */ +}; + /* v9a specific asrs. */ struct priv_reg_entry v9a_asr_table[] = @@ -1304,11 +1317,12 @@ know (str); special_case = sparc_ip (str, &insn); + if (insn == NULL) + return; /* We warn about attempts to put a floating point branch in a delay slot, unless the delay slot has been annulled. */ - if (insn != NULL - && last_insn != NULL + if (last_insn != NULL && (insn->flags & F_FBR) != 0 && (last_insn->flags & F_DELAYED) != 0 /* ??? This test isn't completely accurate. We assume anything with @@ -1321,7 +1335,6 @@ point instruction and a floating point branch. We insert one automatically, with a warning. */ if (max_architecture < SPARC_OPCODE_ARCH_V9 - && insn != NULL && last_insn != NULL && (insn->flags & F_FBR) != 0 && (last_insn->flags & F_FLOAT) != 0) @@ -1417,7 +1430,9 @@ break; default: - as_fatal (_("Unknown opcode: `%s'"), str); + as_bad (_("Unknown opcode: `%s'"), str); + *pinsn = NULL; + return special_case; } insn = (struct sparc_opcode *) hash_find (op_hash, str); *pinsn = insn; @@ -1573,6 +1588,42 @@ goto error; } + case '$': + case '%': + /* Parse a sparc64 hyperprivileged register. */ + if (*s == '%') + { + struct priv_reg_entry *p = hpriv_reg_table; + unsigned int len = 9999999; /* Init to make gcc happy. */ + + s += 1; + while (p->name[0] > s[0]) + p++; + while (p->name[0] == s[0]) + { + len = strlen (p->name); + if (strncmp (p->name, s, len) == 0) + break; + p++; + } + if (p->name[0] != s[0]) + { + error_message = _(": unrecognizable hyperprivileged register"); + goto error; + } + if (*args == '$') + opcode |= (p->regnum << 14); + else + opcode |= (p->regnum << 25); + s += len; + continue; + } + else + { + error_message = _(": unrecognizable hyperprivileged register"); + goto error; + } + case '_': case '/': /* Parse a v9a/v9b ancillary state register. */ @@ -2231,7 +2282,7 @@ { char *s1; char *op_arg = NULL; - expressionS op_exp; + static expressionS op_exp; bfd_reloc_code_real_type old_reloc = the_insn.reloc; /* Check for %hi, etc. */ @@ -2484,12 +2535,12 @@ goto error; } - /* Constants that won't fit are checked in md_apply_fix3 + /* Constants that won't fit are checked in md_apply_fix and bfd_install_relocation. ??? It would be preferable to install the constants into the insn here and save having to create a fixS for each one. There already exists code to handle - all the various cases (e.g. in md_apply_fix3 and + all the various cases (e.g. in md_apply_fix and bfd_install_relocation) so duplicating all that code here isn't right. */ } @@ -2877,7 +2928,7 @@ the_insn->pcrel, the_insn->reloc); /* Turn off overflow checking in fixup_segment. We'll do our - own overflow checking in md_apply_fix3. This is necessary because + own overflow checking in md_apply_fix. This is necessary because the insn size is 4 and fixup_segment will signal an overflow for large 8 byte quantities. */ fixP->fx_no_overflow = 1; @@ -2996,7 +3047,7 @@ hold. */ void -md_apply_fix3 (fixP, valP, segment) +md_apply_fix (fixP, valP, segment) fixS *fixP; valueT *valP; segT segment ATTRIBUTE_UNUSED; @@ -3012,7 +3063,41 @@ #ifdef OBJ_ELF /* SPARC ELF relocations don't use an addend in the data field. */ if (fixP->fx_addsy != NULL) - return; + { + switch (fixP->fx_r_type) + { + case BFD_RELOC_SPARC_TLS_GD_HI22: + case BFD_RELOC_SPARC_TLS_GD_LO10: + case BFD_RELOC_SPARC_TLS_GD_ADD: + case BFD_RELOC_SPARC_TLS_GD_CALL: + case BFD_RELOC_SPARC_TLS_LDM_HI22: + case BFD_RELOC_SPARC_TLS_LDM_LO10: + case BFD_RELOC_SPARC_TLS_LDM_ADD: + case BFD_RELOC_SPARC_TLS_LDM_CALL: + case BFD_RELOC_SPARC_TLS_LDO_HIX22: + case BFD_RELOC_SPARC_TLS_LDO_LOX10: + case BFD_RELOC_SPARC_TLS_LDO_ADD: + case BFD_RELOC_SPARC_TLS_IE_HI22: + case BFD_RELOC_SPARC_TLS_IE_LO10: + case BFD_RELOC_SPARC_TLS_IE_LD: + case BFD_RELOC_SPARC_TLS_IE_LDX: + case BFD_RELOC_SPARC_TLS_IE_ADD: + case BFD_RELOC_SPARC_TLS_LE_HIX22: + case BFD_RELOC_SPARC_TLS_LE_LOX10: + case BFD_RELOC_SPARC_TLS_DTPMOD32: + case BFD_RELOC_SPARC_TLS_DTPMOD64: + case BFD_RELOC_SPARC_TLS_DTPOFF32: + case BFD_RELOC_SPARC_TLS_DTPOFF64: + case BFD_RELOC_SPARC_TLS_TPOFF32: + case BFD_RELOC_SPARC_TLS_TPOFF64: + S_SET_THREAD_LOCAL (fixP->fx_addsy); + + default: + break; + } + + return; + } #endif /* This is a hack. There should be a better way to @@ -3447,6 +3532,10 @@ #else #define GOT_NAME "__GLOBAL_OFFSET_TABLE_" #endif +#ifdef TE_VXWORKS +#define GOTT_BASE "__GOTT_BASE__" +#define GOTT_INDEX "__GOTT_INDEX__" +#endif /* This code must be parallel to the OBJ_ELF tc_fix_adjustable. */ @@ -3459,18 +3548,30 @@ code = BFD_RELOC_SPARC_WPLT30; break; case BFD_RELOC_HI22: - if (fixp->fx_addsy != NULL - && strcmp (S_GET_NAME (fixp->fx_addsy), GOT_NAME) == 0) - code = BFD_RELOC_SPARC_PC22; - else - code = BFD_RELOC_SPARC_GOT22; + code = BFD_RELOC_SPARC_GOT22; + if (fixp->fx_addsy != NULL) + { + if (strcmp (S_GET_NAME (fixp->fx_addsy), GOT_NAME) == 0) + code = BFD_RELOC_SPARC_PC22; +#ifdef TE_VXWORKS + if (strcmp (S_GET_NAME (fixp->fx_addsy), GOTT_BASE) == 0 + || strcmp (S_GET_NAME (fixp->fx_addsy), GOTT_INDEX) == 0) + code = BFD_RELOC_HI22; /* Unchanged. */ +#endif + } break; case BFD_RELOC_LO10: - if (fixp->fx_addsy != NULL - && strcmp (S_GET_NAME (fixp->fx_addsy), GOT_NAME) == 0) - code = BFD_RELOC_SPARC_PC10; - else - code = BFD_RELOC_SPARC_GOT10; + code = BFD_RELOC_SPARC_GOT10; + if (fixp->fx_addsy != NULL) + { + if (strcmp (S_GET_NAME (fixp->fx_addsy), GOT_NAME) == 0) + code = BFD_RELOC_SPARC_PC10; +#ifdef TE_VXWORKS + if (strcmp (S_GET_NAME (fixp->fx_addsy), GOTT_BASE) == 0 + || strcmp (S_GET_NAME (fixp->fx_addsy), GOTT_INDEX) == 0) + code = BFD_RELOC_LO10; /* Unchanged. */ +#endif + } break; case BFD_RELOC_SPARC13: code = BFD_RELOC_SPARC_GOT13; @@ -3603,7 +3704,7 @@ of two. */ static int -log2 (value) +mylog2 (value) int value; { int shift; @@ -3705,7 +3806,7 @@ if (align != 0) { - temp = log2 (align); + temp = mylog2 (align); if (temp < 0) { as_bad (_("alignment not a power of 2")); @@ -3843,7 +3944,7 @@ if (temp > max_alignment) { temp = max_alignment; - as_warn (_("alignment too large; assuming %d"), temp); + as_warn (_("alignment too large; assuming %ld"), (long) temp); } #endif @@ -3868,7 +3969,7 @@ if (temp == 0) align = 0; else - align = log2 (temp); + align = mylog2 (temp); if (align < 0) { @@ -3925,9 +4026,7 @@ goto allocate_common; } -#ifdef BFD_ASSEMBLER symbol_get_bfdsym (symbolP)->flags |= BSF_OBJECT; -#endif demand_empty_rest_of_line (); return; @@ -4191,7 +4290,7 @@ if (sparc_no_align_cons) return; - nalign = log2 (nbytes); + nalign = mylog2 (nbytes); if (nalign == 0) return; ==== //depot/projects/kmacy_sun4v/src/contrib/binutils/gas/write.c#3 (text+ko) ==== @@ -2691,7 +2691,7 @@ } if (!fixP->fx_done) - md_apply_fix3 (fixP, &add_number, this_segment); + md_apply_fix (fixP, &add_number, this_segment); if (!fixP->fx_done) {
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200605200639.k4K6dvfC012015>