2003-12-19 Alexandre Oliva <aoliva@redhat.com>
authorAlexandre Oliva <aoliva@redhat.com>
Tue, 6 Jan 2004 19:19:18 +0000 (19:19 +0000)
committerAlexandre Oliva <aoliva@redhat.com>
Tue, 6 Jan 2004 19:19:18 +0000 (19:19 +0000)
* 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  <aoliva@redhat.com>
* config/tc-frv.c (line_separator_chars): Add `!'.
2003-09-19  Alexandre Oliva  <aoliva@redhat.com>
* config/tc-frv.c (md_assemble): Clear insn upfront.
2003-09-18  Alexandre Oliva  <aoliva@redhat.com>
* config/tc-frv.c (OPTION_FDPIC): New macro.
(md_longopts): Add mfdpic.
(md_parse_option): Handle it.
2003-08-04  Alexandre Oliva  <aoliva@redhat.com>
* config/tc-frv.c (md_cgen_lookup_reloc) <FRV_OPERAND_D12,
FRV_OPERAND_S12>: Use reloc type encoded in fix-up.
(frv_pic_ptr): Parse funcdesc.

gas/ChangeLog
gas/config/tc-frv.c
gas/config/tc-frv.h

index 00cbf01a58c83914dcc0d985a3152c1fa33e389d..9f8e49b76fe95e9fac76436ba644f8b911d4276b 100644 (file)
@@ -1,3 +1,23 @@
+2004-01-06  Alexandre Oliva  <aoliva@redhat.com>
+
+       2003-12-19  Alexandre Oliva  <aoliva@redhat.com>
+       * 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  <aoliva@redhat.com>
+       * config/tc-frv.c (line_separator_chars): Add `!'.
+       2003-09-19  Alexandre Oliva  <aoliva@redhat.com>
+       * config/tc-frv.c (md_assemble): Clear insn upfront.
+       2003-09-18  Alexandre Oliva  <aoliva@redhat.com>
+       * config/tc-frv.c (OPTION_FDPIC): New macro.
+       (md_longopts): Add mfdpic.
+       (md_parse_option): Handle it.
+       2003-08-04  Alexandre Oliva  <aoliva@redhat.com>
+       * config/tc-frv.c (md_cgen_lookup_reloc) <FRV_OPERAND_D12,
+       FRV_OPERAND_S12>: Use reloc type encoded in fix-up.
+       (frv_pic_ptr): Parse funcdesc.
+
 2004-01-05  Maciej W. Rozycki  <macro@ds2.pg.gda.pl>
 
        * doc/as.texinfo: Let texi2pod parse asconfig.texi and
index 85503cd9008e86b5dbdc0fb28d72538542ce0bc1..96e630bf29813f0eb8013521d70e66fac195d07f 100644 (file)
@@ -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;
+}
+
 \f
 /* 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++ == ',');
 
index 4d1d54c6585ee2d09263ed64ee52bbe9d48d10df..d2e185d0a7d6844f6111553655a67306b852004e 100644 (file)
@@ -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