* config/tc-ppc.c (ppc_frob_file_before_adjust): Warn if .toc too big.
[deliverable/binutils-gdb.git] / gas / config / tc-ppc.c
index c806f010eee971a420f4c8750ec005dfd0ab50fd..3f54f9e50a4e89acec198f824a090642b451383e 100644 (file)
@@ -1,6 +1,6 @@
 /* tc-ppc.c -- Assemble for the PowerPC or POWER (RS/6000)
-   Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003
-   Free Software Foundation, Inc.
+   Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003,
+   2004 Free Software Foundation, Inc.
    Written by Ian Lance Taylor, Cygnus Support.
 
    This file is part of GAS, the GNU Assembler.
@@ -183,7 +183,7 @@ const char EXP_CHARS[] = "eE";
    as in 0d1.0.  */
 const char FLT_CHARS[] = "dD";
 
-/* '+' and '-' can be used as postfix predicate predictors for conditional 
+/* '+' and '-' can be used as postfix predicate predictors for conditional
    branches.  So they need to be accepted as symbol characters.  */
 const char ppc_symbol_chars[] = "+-";
 
@@ -1156,7 +1156,8 @@ ppc_set_cpu ()
     }
 }
 
-/* Figure out the BFD architecture to use.  */
+/* Figure out the BFD architecture to use.  This function and ppc_mach
+   are called well before md_begin, when the output file is opened.  */
 
 enum bfd_architecture
 ppc_arch ()
@@ -1319,7 +1320,7 @@ md_begin ()
 
   ppc_setup_opcodes ();
 
-  /* Tell the main code what the endianness is if it is not overidden
+  /* Tell the main code what the endianness is if it is not overridden
      by the user.  */
   if (!set_target_endian)
     {
@@ -1457,14 +1458,7 @@ ppc_insert_operand (insn, operand, val, file, line)
        test = val;
 
       if (test < (offsetT) min || test > (offsetT) max)
-       {
-         const char *err =
-           _("operand out of range (%s not between %ld and %ld)");
-         char buf[100];
-
-         sprint_value (buf, test);
-         as_bad_where (file, line, err, buf, min, max);
-       }
+       as_bad_value_out_of_range (_("operand"), test, (offsetT) min, (offsetT) max, file, line);
     }
 
   if (operand->insert)
@@ -1493,8 +1487,10 @@ ppc_elf_suffix (str_p, exp_p)
 {
   struct map_bfd {
     char *string;
-    int length;
-    int reloc;
+    unsigned int length : 8;
+    unsigned int valid32 : 1;
+    unsigned int valid64 : 1;
+    unsigned int reloc;
   };
 
   char ident[20];
@@ -1504,97 +1500,97 @@ ppc_elf_suffix (str_p, exp_p)
   int len;
   const struct map_bfd *ptr;
 
-#define MAP(str,reloc) { str, sizeof (str)-1, reloc }
+#define MAP(str, reloc)   { str, sizeof (str) - 1, 1, 1, reloc }
+#define MAP32(str, reloc) { str, sizeof (str) - 1, 1, 0, reloc }
+#define MAP64(str, reloc) { str, sizeof (str) - 1, 0, 1, reloc }
 
   static const struct map_bfd mapping[] = {
-    MAP ("l",                  (int) BFD_RELOC_LO16),
-    MAP ("h",                  (int) BFD_RELOC_HI16),
-    MAP ("ha",                 (int) BFD_RELOC_HI16_S),
-    MAP ("brtaken",            (int) BFD_RELOC_PPC_B16_BRTAKEN),
-    MAP ("brntaken",           (int) BFD_RELOC_PPC_B16_BRNTAKEN),
-    MAP ("got",                        (int) BFD_RELOC_16_GOTOFF),
-    MAP ("got@l",              (int) BFD_RELOC_LO16_GOTOFF),
-    MAP ("got@h",              (int) BFD_RELOC_HI16_GOTOFF),
-    MAP ("got@ha",             (int) BFD_RELOC_HI16_S_GOTOFF),
-    MAP ("fixup",              (int) BFD_RELOC_CTOR),
-    MAP ("plt",                        (int) BFD_RELOC_24_PLT_PCREL),
-    MAP ("pltrel24",           (int) BFD_RELOC_24_PLT_PCREL),
-    MAP ("copy",               (int) BFD_RELOC_PPC_COPY),
-    MAP ("globdat",            (int) BFD_RELOC_PPC_GLOB_DAT),
-    MAP ("local24pc",          (int) BFD_RELOC_PPC_LOCAL24PC),
-    MAP ("local",              (int) BFD_RELOC_PPC_LOCAL24PC),
-    MAP ("pltrel",             (int) BFD_RELOC_32_PLT_PCREL),
-    MAP ("plt@l",              (int) BFD_RELOC_LO16_PLTOFF),
-    MAP ("plt@h",              (int) BFD_RELOC_HI16_PLTOFF),
-    MAP ("plt@ha",             (int) BFD_RELOC_HI16_S_PLTOFF),
-    MAP ("sdarel",             (int) BFD_RELOC_GPREL16),
-    MAP ("sectoff",            (int) BFD_RELOC_16_BASEREL),
-    MAP ("sectoff@l",          (int) BFD_RELOC_LO16_BASEREL),
-    MAP ("sectoff@h",          (int) BFD_RELOC_HI16_BASEREL),
-    MAP ("sectoff@ha",         (int) BFD_RELOC_HI16_S_BASEREL),
-    MAP ("naddr",              (int) BFD_RELOC_PPC_EMB_NADDR32),
-    MAP ("naddr16",            (int) BFD_RELOC_PPC_EMB_NADDR16),
-    MAP ("naddr@l",            (int) BFD_RELOC_PPC_EMB_NADDR16_LO),
-    MAP ("naddr@h",            (int) BFD_RELOC_PPC_EMB_NADDR16_HI),
-    MAP ("naddr@ha",           (int) BFD_RELOC_PPC_EMB_NADDR16_HA),
-    MAP ("sdai16",             (int) BFD_RELOC_PPC_EMB_SDAI16),
-    MAP ("sda2rel",            (int) BFD_RELOC_PPC_EMB_SDA2REL),
-    MAP ("sda2i16",            (int) BFD_RELOC_PPC_EMB_SDA2I16),
-    MAP ("sda21",              (int) BFD_RELOC_PPC_EMB_SDA21),
-    MAP ("mrkref",             (int) BFD_RELOC_PPC_EMB_MRKREF),
-    MAP ("relsect",            (int) BFD_RELOC_PPC_EMB_RELSEC16),
-    MAP ("relsect@l",          (int) BFD_RELOC_PPC_EMB_RELST_LO),
-    MAP ("relsect@h",          (int) BFD_RELOC_PPC_EMB_RELST_HI),
-    MAP ("relsect@ha",         (int) BFD_RELOC_PPC_EMB_RELST_HA),
-    MAP ("bitfld",             (int) BFD_RELOC_PPC_EMB_BIT_FLD),
-    MAP ("relsda",             (int) BFD_RELOC_PPC_EMB_RELSDA),
-    MAP ("xgot",               (int) BFD_RELOC_PPC_TOC16),
-    MAP ("tls",                        (int) BFD_RELOC_PPC_TLS),
-    MAP ("dtpmod",             (int) BFD_RELOC_PPC_DTPMOD),
-    MAP ("dtprel",             (int) BFD_RELOC_PPC_DTPREL),
-    MAP ("dtprel@l",           (int) BFD_RELOC_PPC_DTPREL16_LO),
-    MAP ("dtprel@h",           (int) BFD_RELOC_PPC_DTPREL16_HI),
-    MAP ("dtprel@ha",          (int) BFD_RELOC_PPC_DTPREL16_HA),
-    MAP ("tprel",              (int) BFD_RELOC_PPC_TPREL),
-    MAP ("tprel@l",            (int) BFD_RELOC_PPC_TPREL16_LO),
-    MAP ("tprel@h",            (int) BFD_RELOC_PPC_TPREL16_HI),
-    MAP ("tprel@ha",           (int) BFD_RELOC_PPC_TPREL16_HA),
-    MAP ("got@tlsgd",          (int) BFD_RELOC_PPC_GOT_TLSGD16),
-    MAP ("got@tlsgd@l",                (int) BFD_RELOC_PPC_GOT_TLSGD16_LO),
-    MAP ("got@tlsgd@h",                (int) BFD_RELOC_PPC_GOT_TLSGD16_HI),
-    MAP ("got@tlsgd@ha",       (int) BFD_RELOC_PPC_GOT_TLSGD16_HA),
-    MAP ("got@tlsld",          (int) BFD_RELOC_PPC_GOT_TLSLD16),
-    MAP ("got@tlsld@l",                (int) BFD_RELOC_PPC_GOT_TLSLD16_LO),
-    MAP ("got@tlsld@h",                (int) BFD_RELOC_PPC_GOT_TLSLD16_HI),
-    MAP ("got@tlsld@ha",       (int) BFD_RELOC_PPC_GOT_TLSLD16_HA),
-    MAP ("got@dtprel",         (int) BFD_RELOC_PPC_GOT_DTPREL16),
-    MAP ("got@dtprel@l",       (int) BFD_RELOC_PPC_GOT_DTPREL16_LO),
-    MAP ("got@dtprel@h",       (int) BFD_RELOC_PPC_GOT_DTPREL16_HI),
-    MAP ("got@dtprel@ha",      (int) BFD_RELOC_PPC_GOT_DTPREL16_HA),
-    MAP ("got@tprel",          (int) BFD_RELOC_PPC_GOT_TPREL16),
-    MAP ("got@tprel@l",                (int) BFD_RELOC_PPC_GOT_TPREL16_LO),
-    MAP ("got@tprel@h",                (int) BFD_RELOC_PPC_GOT_TPREL16_HI),
-    MAP ("got@tprel@ha",       (int) BFD_RELOC_PPC_GOT_TPREL16_HA),
-    /* The following are only valid for ppc64.  Negative values are
-       used instead of a flag.  */
-    MAP ("higher",             - (int) BFD_RELOC_PPC64_HIGHER),
-    MAP ("highera",            - (int) BFD_RELOC_PPC64_HIGHER_S),
-    MAP ("highest",            - (int) BFD_RELOC_PPC64_HIGHEST),
-    MAP ("highesta",           - (int) BFD_RELOC_PPC64_HIGHEST_S),
-    MAP ("tocbase",            - (int) BFD_RELOC_PPC64_TOC),
-    MAP ("toc",                        - (int) BFD_RELOC_PPC_TOC16),
-    MAP ("toc@l",              - (int) BFD_RELOC_PPC64_TOC16_LO),
-    MAP ("toc@h",              - (int) BFD_RELOC_PPC64_TOC16_HI),
-    MAP ("toc@ha",             - (int) BFD_RELOC_PPC64_TOC16_HA),
-    MAP ("dtprel@higher",      - (int) BFD_RELOC_PPC64_DTPREL16_HIGHER),
-    MAP ("dtprel@highera",     - (int) BFD_RELOC_PPC64_DTPREL16_HIGHERA),
-    MAP ("dtprel@highest",     - (int) BFD_RELOC_PPC64_DTPREL16_HIGHEST),
-    MAP ("dtprel@highesta",    - (int) BFD_RELOC_PPC64_DTPREL16_HIGHESTA),
-    MAP ("tprel@higher",       - (int) BFD_RELOC_PPC64_TPREL16_HIGHER),
-    MAP ("tprel@highera",      - (int) BFD_RELOC_PPC64_TPREL16_HIGHERA),
-    MAP ("tprel@highest",      - (int) BFD_RELOC_PPC64_TPREL16_HIGHEST),
-    MAP ("tprel@highesta",     - (int) BFD_RELOC_PPC64_TPREL16_HIGHESTA),
-    { (char *) 0, 0,           (int) BFD_RELOC_UNUSED }
+    MAP ("l",                  BFD_RELOC_LO16),
+    MAP ("h",                  BFD_RELOC_HI16),
+    MAP ("ha",                 BFD_RELOC_HI16_S),
+    MAP ("brtaken",            BFD_RELOC_PPC_B16_BRTAKEN),
+    MAP ("brntaken",           BFD_RELOC_PPC_B16_BRNTAKEN),
+    MAP ("got",                        BFD_RELOC_16_GOTOFF),
+    MAP ("got@l",              BFD_RELOC_LO16_GOTOFF),
+    MAP ("got@h",              BFD_RELOC_HI16_GOTOFF),
+    MAP ("got@ha",             BFD_RELOC_HI16_S_GOTOFF),
+    MAP ("plt@l",              BFD_RELOC_LO16_PLTOFF),
+    MAP ("plt@h",              BFD_RELOC_HI16_PLTOFF),
+    MAP ("plt@ha",             BFD_RELOC_HI16_S_PLTOFF),
+    MAP ("copy",               BFD_RELOC_PPC_COPY),
+    MAP ("globdat",            BFD_RELOC_PPC_GLOB_DAT),
+    MAP ("sectoff",            BFD_RELOC_16_BASEREL),
+    MAP ("sectoff@l",          BFD_RELOC_LO16_BASEREL),
+    MAP ("sectoff@h",          BFD_RELOC_HI16_BASEREL),
+    MAP ("sectoff@ha",         BFD_RELOC_HI16_S_BASEREL),
+    MAP ("tls",                        BFD_RELOC_PPC_TLS),
+    MAP ("dtpmod",             BFD_RELOC_PPC_DTPMOD),
+    MAP ("dtprel",             BFD_RELOC_PPC_DTPREL),
+    MAP ("dtprel@l",           BFD_RELOC_PPC_DTPREL16_LO),
+    MAP ("dtprel@h",           BFD_RELOC_PPC_DTPREL16_HI),
+    MAP ("dtprel@ha",          BFD_RELOC_PPC_DTPREL16_HA),
+    MAP ("tprel",              BFD_RELOC_PPC_TPREL),
+    MAP ("tprel@l",            BFD_RELOC_PPC_TPREL16_LO),
+    MAP ("tprel@h",            BFD_RELOC_PPC_TPREL16_HI),
+    MAP ("tprel@ha",           BFD_RELOC_PPC_TPREL16_HA),
+    MAP ("got@tlsgd",          BFD_RELOC_PPC_GOT_TLSGD16),
+    MAP ("got@tlsgd@l",                BFD_RELOC_PPC_GOT_TLSGD16_LO),
+    MAP ("got@tlsgd@h",                BFD_RELOC_PPC_GOT_TLSGD16_HI),
+    MAP ("got@tlsgd@ha",       BFD_RELOC_PPC_GOT_TLSGD16_HA),
+    MAP ("got@tlsld",          BFD_RELOC_PPC_GOT_TLSLD16),
+    MAP ("got@tlsld@l",                BFD_RELOC_PPC_GOT_TLSLD16_LO),
+    MAP ("got@tlsld@h",                BFD_RELOC_PPC_GOT_TLSLD16_HI),
+    MAP ("got@tlsld@ha",       BFD_RELOC_PPC_GOT_TLSLD16_HA),
+    MAP ("got@dtprel",         BFD_RELOC_PPC_GOT_DTPREL16),
+    MAP ("got@dtprel@l",       BFD_RELOC_PPC_GOT_DTPREL16_LO),
+    MAP ("got@dtprel@h",       BFD_RELOC_PPC_GOT_DTPREL16_HI),
+    MAP ("got@dtprel@ha",      BFD_RELOC_PPC_GOT_DTPREL16_HA),
+    MAP ("got@tprel",          BFD_RELOC_PPC_GOT_TPREL16),
+    MAP ("got@tprel@l",                BFD_RELOC_PPC_GOT_TPREL16_LO),
+    MAP ("got@tprel@h",                BFD_RELOC_PPC_GOT_TPREL16_HI),
+    MAP ("got@tprel@ha",       BFD_RELOC_PPC_GOT_TPREL16_HA),
+    MAP32 ("fixup",            BFD_RELOC_CTOR),
+    MAP32 ("plt",              BFD_RELOC_24_PLT_PCREL),
+    MAP32 ("pltrel24",         BFD_RELOC_24_PLT_PCREL),
+    MAP32 ("local24pc",                BFD_RELOC_PPC_LOCAL24PC),
+    MAP32 ("local",            BFD_RELOC_PPC_LOCAL24PC),
+    MAP32 ("pltrel",           BFD_RELOC_32_PLT_PCREL),
+    MAP32 ("sdarel",           BFD_RELOC_GPREL16),
+    MAP32 ("naddr",            BFD_RELOC_PPC_EMB_NADDR32),
+    MAP32 ("naddr16",          BFD_RELOC_PPC_EMB_NADDR16),
+    MAP32 ("naddr@l",          BFD_RELOC_PPC_EMB_NADDR16_LO),
+    MAP32 ("naddr@h",          BFD_RELOC_PPC_EMB_NADDR16_HI),
+    MAP32 ("naddr@ha",         BFD_RELOC_PPC_EMB_NADDR16_HA),
+    MAP32 ("sdai16",           BFD_RELOC_PPC_EMB_SDAI16),
+    MAP32 ("sda2rel",          BFD_RELOC_PPC_EMB_SDA2REL),
+    MAP32 ("sda2i16",          BFD_RELOC_PPC_EMB_SDA2I16),
+    MAP32 ("sda21",            BFD_RELOC_PPC_EMB_SDA21),
+    MAP32 ("mrkref",           BFD_RELOC_PPC_EMB_MRKREF),
+    MAP32 ("relsect",          BFD_RELOC_PPC_EMB_RELSEC16),
+    MAP32 ("relsect@l",                BFD_RELOC_PPC_EMB_RELST_LO),
+    MAP32 ("relsect@h",                BFD_RELOC_PPC_EMB_RELST_HI),
+    MAP32 ("relsect@ha",       BFD_RELOC_PPC_EMB_RELST_HA),
+    MAP32 ("bitfld",           BFD_RELOC_PPC_EMB_BIT_FLD),
+    MAP32 ("relsda",           BFD_RELOC_PPC_EMB_RELSDA),
+    MAP32 ("xgot",             BFD_RELOC_PPC_TOC16),
+    MAP64 ("higher",           BFD_RELOC_PPC64_HIGHER),
+    MAP64 ("highera",          BFD_RELOC_PPC64_HIGHER_S),
+    MAP64 ("highest",          BFD_RELOC_PPC64_HIGHEST),
+    MAP64 ("highesta",         BFD_RELOC_PPC64_HIGHEST_S),
+    MAP64 ("tocbase",          BFD_RELOC_PPC64_TOC),
+    MAP64 ("toc",              BFD_RELOC_PPC_TOC16),
+    MAP64 ("toc@l",            BFD_RELOC_PPC64_TOC16_LO),
+    MAP64 ("toc@h",            BFD_RELOC_PPC64_TOC16_HI),
+    MAP64 ("toc@ha",           BFD_RELOC_PPC64_TOC16_HA),
+    MAP64 ("dtprel@higher",    BFD_RELOC_PPC64_DTPREL16_HIGHER),
+    MAP64 ("dtprel@highera",   BFD_RELOC_PPC64_DTPREL16_HIGHERA),
+    MAP64 ("dtprel@highest",   BFD_RELOC_PPC64_DTPREL16_HIGHEST),
+    MAP64 ("dtprel@highesta",  BFD_RELOC_PPC64_DTPREL16_HIGHESTA),
+    MAP64 ("tprel@higher",     BFD_RELOC_PPC64_TPREL16_HIGHER),
+    MAP64 ("tprel@highera",    BFD_RELOC_PPC64_TPREL16_HIGHERA),
+    MAP64 ("tprel@highest",    BFD_RELOC_PPC64_TPREL16_HIGHEST),
+    MAP64 ("tprel@highesta",   BFD_RELOC_PPC64_TPREL16_HIGHESTA),
+    { (char *) 0, 0, 0, 0,     BFD_RELOC_UNUSED }
   };
 
   if (*str++ != '@')
@@ -1615,17 +1611,11 @@ ppc_elf_suffix (str_p, exp_p)
   for (ptr = &mapping[0]; ptr->length > 0; ptr++)
     if (ch == ptr->string[0]
        && len == ptr->length
-       && memcmp (ident, ptr->string, ptr->length) == 0)
+       && memcmp (ident, ptr->string, ptr->length) == 0
+       && (ppc_obj64 ? ptr->valid64 : ptr->valid32))
       {
        int reloc = ptr->reloc;
 
-       if (reloc < 0)
-         {
-           if (!ppc_obj64)
-             return BFD_RELOC_UNUSED;
-           reloc = -reloc;
-         }
-
        if (!ppc_obj64)
          if (exp_p->X_add_number != 0
              && (reloc == (int) BFD_RELOC_16_GOTOFF
@@ -1902,6 +1892,7 @@ void
 ppc_frob_file_before_adjust ()
 {
   symbolS *symp;
+  asection *toc;
 
   if (!ppc_obj64)
     return;
@@ -1929,11 +1920,15 @@ ppc_frob_file_before_adjust ()
       free (dotname);
       if (dotsym != NULL && (symbol_used_p (dotsym)
                             || symbol_used_in_reloc_p (dotsym)))
-       {
-         symbol_mark_used (symp);
-       }
+       symbol_mark_used (symp);
+
     }
 
+  toc = bfd_get_section_by_name (stdoutput, ".toc");
+  if (toc != NULL
+      && bfd_section_size (stdoutput, toc) > 0x10000)
+    as_warn (_("TOC section size exceeds 64k"));
+
   /* Don't emit .TOC. symbol.  */
   symp = symbol_find (".TOC.");
   if (symp != NULL)
@@ -2102,6 +2097,7 @@ md_assemble (str)
   struct ppc_fixup fixups[MAX_INSN_FIXUPS];
   int fc;
   char *f;
+  int addr_mod;
   int i;
 #ifdef OBJ_ELF
   bfd_reloc_code_real_type reloc;
@@ -2136,13 +2132,14 @@ md_assemble (str)
 
   /* PowerPC operands are just expressions.  The only real issue is
      that a few operand types are optional.  All cases which might use
-     an optional operand separate the operands only with commas (in
-     some cases parentheses are used, as in ``lwz 1,0(1)'' but such
-     cases never have optional operands).  There is never more than
-     one optional operand for an instruction.  So, before we start
-     seriously parsing the operands, we check to see if we have an
-     optional operand, and, if we do, we count the number of commas to
-     see whether the operand should be omitted.  */
+     an optional operand separate the operands only with commas (in some
+     cases parentheses are used, as in ``lwz 1,0(1)'' but such cases never
+     have optional operands).  Most instructions with optional operands
+     have only one.  Those that have more than one optional operand can
+     take either all their operands or none.  So, before we start seriously
+     parsing the operands, we check to see if we have optional operands,
+     and if we do, we count the number of commas to see which operands
+     have been omitted.  */
   skip_optional = 0;
   for (opindex_ptr = opcode->operands; *opindex_ptr != 0; opindex_ptr++)
     {
@@ -2178,7 +2175,7 @@ md_assemble (str)
 
          /* If there are fewer operands in the line then are called
             for by the instruction, we want to skip the optional
-            operand.  */
+            operands.  */
          if (opcount < num_operands_expected)
            skip_optional = 1;
 
@@ -2628,6 +2625,11 @@ md_assemble (str)
 
   /* Write out the instruction.  */
   f = frag_more (4);
+  addr_mod = frag_now_fix () & 3;
+  if (frag_now->has_code && frag_now->insn_addr != addr_mod)
+    as_bad (_("instruction address is not a multiple of 4"));
+  frag_now->insn_addr = addr_mod;
+  frag_now->has_code = 1;
   md_number_to_chars (f, insn, 4);
 
 #ifdef OBJ_ELF
@@ -2882,7 +2884,7 @@ static bfd_boolean ppc_stab_symbol;
 
 /* The .comm and .lcomm pseudo-ops for XCOFF.  XCOFF puts common
    symbols in the .bss segment as though they were local common
-   symbols, and uses a different smclas.  The native Aix 4.3.3 assember
+   symbols, and uses a different smclas.  The native Aix 4.3.3 assembler
    aligns .comm and .lcomm to 4 bytes.  */
 
 static void
@@ -3437,7 +3439,7 @@ ppc_stabx (ignore)
 
 /* The .function pseudo-op.  This takes several arguments.  The first
    argument seems to be the external name of the symbol.  The second
-   argment seems to be the label for the start of the function.  gcc
+   argument seems to be the label for the start of the function.  gcc
    uses the same name for both.  I have no idea what the third and
    fourth arguments are meant to be.  The optional fifth argument is
    an expression for the size of the function.  In COFF this symbol
@@ -4847,7 +4849,7 @@ ppc_frob_symbol (sym)
      table.  */
   if (! symbol_used_in_reloc_p (sym)
       && ((symbol_get_bfdsym (sym)->flags & BSF_SECTION_SYM) != 0
-         || (! S_IS_EXTERNAL (sym)
+         || (! (S_IS_EXTERNAL (sym) || S_IS_WEAK (sym))
              && ! symbol_get_tc (sym)->output
              && S_GET_STORAGE_CLASS (sym) != C_FILE)))
     return 1;
@@ -4913,7 +4915,7 @@ ppc_frob_symbol (sym)
        }
     }
 
-  if (! S_IS_EXTERNAL (sym)
+  if (! (S_IS_EXTERNAL (sym) || S_IS_WEAK (sym))
       && (symbol_get_bfdsym (sym)->flags & BSF_SECTION_SYM) == 0
       && S_GET_STORAGE_CLASS (sym) != C_FILE
       && S_GET_STORAGE_CLASS (sym) != C_FCN
@@ -5898,10 +5900,19 @@ md_apply_fix3 (fixP, valP, seg)
 
        case BFD_RELOC_8:
          if (fixP->fx_pcrel)
-           abort ();
-
-         md_number_to_chars (fixP->fx_frag->fr_literal + fixP->fx_where,
-                             value, 1);
+           {
+             /* This can occur if there is a bug in the input assembler, eg:
+                ".byte <undefined_symbol> - ."  */
+             if (fixP->fx_addsy)
+               as_bad (_("Unable to handle reference to symbol %s"),
+                       S_GET_NAME (fixP->fx_addsy));
+             else
+               as_bad (_("Unable to resolve expression"));
+             fixP->fx_done = 1;
+           }
+         else
+           md_number_to_chars (fixP->fx_frag->fr_literal + fixP->fx_where,
+                               value, 1);
          break;
 
        case BFD_RELOC_24_PLT_PCREL:
@@ -6042,15 +6053,15 @@ tc_ppc_regname_to_dw2regnum (const char *regname)
       if (p == q || *q || regnum >= 32)
        return -1;
       if (regname[0] == 'f')
-        regnum += 32;
+       regnum += 32;
       else if (regname[0] == 'v')
-        regnum += 77;
+       regnum += 77;
     }
   else if (regname[0] == 'c' && regname[1] == 'r')
     {
       p = regname + 2 + (regname[2] == '.');
       if (p[0] < '0' || p[0] > '7' || p[1])
-        return -1;
+       return -1;
       regnum = p[0] - '0' + 68;
     }
   return regnum;
This page took 0.028822 seconds and 4 git commands to generate.