From 99d09cdbd43bd0ebc6079dba91d8a71dc12ee45e Mon Sep 17 00:00:00 2001 From: Alexandre Oliva Date: Tue, 6 Jan 2004 19:19:18 +0000 Subject: [PATCH] 2003-12-19 Alexandre Oliva * config/tc-frv.h (md_apply_fix3): Don't define. * config/tc-frv.c (md_apply_fix3): New. Shift/truncate %hi/%lo operands. * config/tc-frv.h (TC_FORCE_RELOCATION_SUB_LOCAL): Define. 2003-10-07 Alexandre Oliva * config/tc-frv.c (line_separator_chars): Add `!'. 2003-09-19 Alexandre Oliva * config/tc-frv.c (md_assemble): Clear insn upfront. 2003-09-18 Alexandre Oliva * config/tc-frv.c (OPTION_FDPIC): New macro. (md_longopts): Add mfdpic. (md_parse_option): Handle it. 2003-08-04 Alexandre Oliva * config/tc-frv.c (md_cgen_lookup_reloc) : Use reloc type encoded in fix-up. (frv_pic_ptr): Parse funcdesc. --- gas/ChangeLog | 20 +++++++++++++++++++ gas/config/tc-frv.c | 55 ++++++++++++++++++++++++++++++++++++++++++++++++++--- gas/config/tc-frv.h | 7 +++++-- 3 files changed, 77 insertions(+), 5 deletions(-) diff --git a/gas/ChangeLog b/gas/ChangeLog index 00cbf01..9f8e49b 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,23 @@ +2004-01-06 Alexandre Oliva + + 2003-12-19 Alexandre Oliva + * config/tc-frv.h (md_apply_fix3): Don't define. + * config/tc-frv.c (md_apply_fix3): New. Shift/truncate %hi/%lo + operands. + * config/tc-frv.h (TC_FORCE_RELOCATION_SUB_LOCAL): Define. + 2003-10-07 Alexandre Oliva + * config/tc-frv.c (line_separator_chars): Add `!'. + 2003-09-19 Alexandre Oliva + * config/tc-frv.c (md_assemble): Clear insn upfront. + 2003-09-18 Alexandre Oliva + * config/tc-frv.c (OPTION_FDPIC): New macro. + (md_longopts): Add mfdpic. + (md_parse_option): Handle it. + 2003-08-04 Alexandre Oliva + * config/tc-frv.c (md_cgen_lookup_reloc) : Use reloc type encoded in fix-up. + (frv_pic_ptr): Parse funcdesc. + 2004-01-05 Maciej W. Rozycki * doc/as.texinfo: Let texi2pod parse asconfig.texi and diff --git a/gas/config/tc-frv.c b/gas/config/tc-frv.c index 85503cd..96e630b 100644 --- a/gas/config/tc-frv.c +++ b/gas/config/tc-frv.c @@ -115,7 +115,7 @@ static struct vliw_insn_list *current_vliw_insn; const char comment_chars[] = ";"; const char line_comment_chars[] = "#"; -const char line_separator_chars[] = ""; +const char line_separator_chars[] = "!"; const char EXP_CHARS[] = "eE"; const char FLT_CHARS[] = "dD"; @@ -218,6 +218,7 @@ const char * md_shortopts = FRV_SHORTOPTS; #define OPTION_TOMCAT_STATS (OPTION_MD_BASE + 18) #define OPTION_PACK (OPTION_MD_BASE + 19) #define OPTION_NO_PACK (OPTION_MD_BASE + 20) +#define OPTION_FDPIC (OPTION_MD_BASE + 21) struct option md_longopts[] = { @@ -243,6 +244,7 @@ struct option md_longopts[] = { "mtomcat-stats", no_argument, NULL, OPTION_TOMCAT_STATS }, { "mpack", no_argument, NULL, OPTION_PACK }, { "mno-pack", no_argument, NULL, OPTION_NO_PACK }, + { "mfdpic", no_argument, NULL, OPTION_FDPIC }, { NULL, no_argument, NULL, 0 }, }; @@ -406,6 +408,11 @@ md_parse_option (c, arg) g_switch_value = 0; break; + case OPTION_FDPIC: + frv_flags |= EF_FRV_FDPIC; + frv_pic_flag = "-mfdpic"; + break; + case OPTION_TOMCAT_DEBUG: tomcat_debug = 1; break; @@ -1050,6 +1057,8 @@ md_assemble (str) /* Initialize GAS's cgen interface for a new instruction. */ gas_cgen_init_parse (); + memset (&insn, 0, sizeof (insn)); + insn.insn = frv_cgen_assemble_insn (gas_cgen_cpu_desc, str, & insn.fields, insn.buffer, &errmsg); @@ -1312,6 +1321,9 @@ md_cgen_lookup_reloc (insn, operand, fixP) case FRV_OPERAND_D12: case FRV_OPERAND_S12: + if (fixP->fx_cgen.opinfo != 0) + return fixP->fx_cgen.opinfo; + return BFD_RELOC_FRV_GPREL12; case FRV_OPERAND_U12: @@ -1338,6 +1350,30 @@ frv_force_relocation (fix) return generic_force_reloc (fix); } + +/* Apply a fixup that could be resolved within the assembler. */ + +void +md_apply_fix3 (fixP, valP, seg) + fixS * fixP; + valueT * valP; + segT seg; +{ + if (fixP->fx_addsy == 0) + switch (fixP->fx_cgen.opinfo) + { + case BFD_RELOC_FRV_HI16: + *valP >>= 16; + /* Fall through. */ + case BFD_RELOC_FRV_LO16: + *valP &= 0xffff; + break; + } + + gas_cgen_md_apply_fix3 (fixP, valP, seg); + return; +} + /* Write a value out to the object file, using the appropriate endianness. */ @@ -1483,12 +1519,25 @@ frv_pic_ptr (nbytes) do { - expression (&exp); + bfd_reloc_code_real_type reloc_type = BFD_RELOC_CTOR; + + if (strncasecmp (input_line_pointer, "funcdesc(", 9) == 0) + { + input_line_pointer += 9; + expression (&exp); + if (*input_line_pointer == ')') + input_line_pointer++; + else + as_bad ("missing ')'"); + reloc_type = BFD_RELOC_FRV_FUNCDESC; + } + else + expression (&exp); p = frag_more (4); memset (p, 0, 4); fix_new_exp (frag_now, p - frag_now->fr_literal, 4, &exp, 0, - BFD_RELOC_CTOR); + reloc_type); } while (*input_line_pointer++ == ','); diff --git a/gas/config/tc-frv.h b/gas/config/tc-frv.h index 4d1d54c..d2e185d 100644 --- a/gas/config/tc-frv.h +++ b/gas/config/tc-frv.h @@ -45,8 +45,6 @@ /* Values passed to md_apply_fix3 don't include the symbol value. */ #define MD_APPLY_SYM_VALUE(FIX) 0 -#define md_apply_fix3 gas_cgen_md_apply_fix3 - extern void frv_tomcat_workaround PARAMS ((void)); #define md_cleanup frv_tomcat_workaround @@ -63,6 +61,11 @@ extern bfd_boolean frv_fix_adjustable PARAMS ((struct fix *)); #define TC_FORCE_RELOCATION(fix) frv_force_relocation (fix) extern int frv_force_relocation PARAMS ((struct fix *)); +/* If we simplify subtractions that aren't SUB_SAME or SUB_ABS, we end + up with PCrel fixups, but since we don't have any PCrel relocs, we + crash. Preventing simplification gets us a good, early error. */ +#define TC_FORCE_RELOCATION_SUB_LOCAL(fixP) 1 + #undef GAS_CGEN_MAX_FIXUPS #define GAS_CGEN_MAX_FIXUPS 1 -- 2.7.4