x86: fold both instances of lex_got()
authorJan Beulich <jbeulich@suse.com>
Mon, 3 May 2021 11:26:41 +0000 (13:26 +0200)
committerJan Beulich <jbeulich@suse.com>
Mon, 3 May 2021 11:26:41 +0000 (13:26 +0200)
I see no reason at all for us to carry two copies of almost identical
code. The differences, apart from the table entries, are benign. And
the #ifdef-ary doesn't really get any worse.

gas/ChangeLog
gas/config/tc-i386.c

index 94104040eff4844cd969a5df23e1aaee7dcd285a..2743889493f45c17ecb6aa03e3aeade7b061ed79 100644 (file)
@@ -1,3 +1,8 @@
+2021-05-03  Jan Beulich  <jbeulich@suse.com>
+
+       * config/tc-i386.c (lex_got): Adjust surrounding #if. Fold TE_PE
+       variant into ELF one.
+
 2021-05-03  Alan Modra  <amodra@gmail.com>
 
        * testsuite/gas/elf/section25.s: Don't start directives in first
index 8bd725ab5883bfde56db2416d818691e63da4bae..5d5897fdb2b434363a2f6a9abac106a70a845b61 100644 (file)
@@ -10226,8 +10226,8 @@ x86_address_bytes (void)
   return stdoutput->arch_info->bits_per_address / 8;
 }
 
-#if !(defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF) || defined (OBJ_MACH_O)) \
-    || defined (LEX_AT)
+#if (!(defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF) || defined (OBJ_MACH_O)) \
+     || defined (LEX_AT)) && !defined (TE_PE)
 # define lex_got(reloc, adjust, types) NULL
 #else
 /* Parse operands of the form
@@ -10256,6 +10256,7 @@ lex_got (enum bfd_reloc_code_real *rel,
     const i386_operand_type types64;
     bool need_GOT_symbol;
   } gotrel[] = {
+#ifndef TE_PE
 #if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
     { STRING_COMMA_LEN ("SIZE"),      { BFD_RELOC_SIZE32,
                                        BFD_RELOC_SIZE32 },
@@ -10312,11 +10313,16 @@ lex_got (enum bfd_reloc_code_real *rel,
     { STRING_COMMA_LEN ("TLSCALL"),  { BFD_RELOC_386_TLS_DESC_CALL,
                                       BFD_RELOC_X86_64_TLSDESC_CALL },
       OPERAND_TYPE_IMM32_32S_DISP32, true },
+#else /* TE_PE */
+    { STRING_COMMA_LEN ("SECREL32"), { BFD_RELOC_32_SECREL,
+                                      BFD_RELOC_32_SECREL },
+      OPERAND_TYPE_IMM32_32S_64_DISP32_64, false },
+#endif
   };
   char *cp;
   unsigned int j;
 
-#if defined (OBJ_MAYBE_ELF)
+#if defined (OBJ_MAYBE_ELF) && !defined (TE_PE)
   if (!IS_ELF)
     return NULL;
 #endif
@@ -10392,109 +10398,6 @@ lex_got (enum bfd_reloc_code_real *rel,
 }
 #endif
 
-#ifdef TE_PE
-#ifdef lex_got
-#undef lex_got
-#endif
-/* Parse operands of the form
-   <symbol>@SECREL32+<nnn>
-
-   If we find one, set up the correct relocation in RELOC and copy the
-   input string, minus the `@SECREL32' into a malloc'd buffer for
-   parsing by the calling routine.  Return this buffer, and if ADJUST
-   is non-null set it to the length of the string we removed from the
-   input line.  Otherwise return NULL.
-
-   This function is copied from the ELF version above adjusted for PE targets.  */
-
-static char *
-lex_got (enum bfd_reloc_code_real *rel ATTRIBUTE_UNUSED,
-        int *adjust ATTRIBUTE_UNUSED,
-        i386_operand_type *types)
-{
-  static const struct
-  {
-    const char *str;
-    int len;
-    const enum bfd_reloc_code_real rel[2];
-    const i386_operand_type types64;
-  }
-  gotrel[] =
-  {
-    { STRING_COMMA_LEN ("SECREL32"),    { BFD_RELOC_32_SECREL,
-                                         BFD_RELOC_32_SECREL },
-      OPERAND_TYPE_IMM32_32S_64_DISP32_64 },
-  };
-
-  char *cp;
-  unsigned j;
-
-  for (cp = input_line_pointer; *cp != '@'; cp++)
-    if (is_end_of_line[(unsigned char) *cp] || *cp == ',')
-      return NULL;
-
-  for (j = 0; j < ARRAY_SIZE (gotrel); j++)
-    {
-      int len = gotrel[j].len;
-
-      if (strncasecmp (cp + 1, gotrel[j].str, len) == 0)
-       {
-         if (gotrel[j].rel[object_64bit] != 0)
-           {
-             int first, second;
-             char *tmpbuf, *past_reloc;
-
-             *rel = gotrel[j].rel[object_64bit];
-             if (adjust)
-               *adjust = len;
-
-             if (types)
-               {
-                 if (flag_code != CODE_64BIT)
-                   {
-                     types->bitfield.imm32 = 1;
-                     types->bitfield.disp32 = 1;
-                   }
-                 else
-                   *types = gotrel[j].types64;
-               }
-
-             /* The length of the first part of our input line.  */
-             first = cp - input_line_pointer;
-
-             /* The second part goes from after the reloc token until
-                (and including) an end_of_line char or comma.  */
-             past_reloc = cp + 1 + len;
-             cp = past_reloc;
-             while (!is_end_of_line[(unsigned char) *cp] && *cp != ',')
-               ++cp;
-             second = cp + 1 - past_reloc;
-
-             /* Allocate and copy string.  The trailing NUL shouldn't
-                be necessary, but be safe.  */
-             tmpbuf = XNEWVEC (char, first + second + 2);
-             memcpy (tmpbuf, input_line_pointer, first);
-             if (second != 0 && *past_reloc != ' ')
-               /* Replace the relocation token with ' ', so that
-                  errors like foo@SECLREL321 will be detected.  */
-               tmpbuf[first++] = ' ';
-             memcpy (tmpbuf + first, past_reloc, second);
-             tmpbuf[first + second] = '\0';
-             return tmpbuf;
-           }
-
-         as_bad (_("@%s reloc is not supported with %d-bit output format"),
-                 gotrel[j].str, 1 << (5 + object_64bit));
-         return NULL;
-       }
-    }
-
-  /* Might be a symbol version string.  Don't as_bad here.  */
-  return NULL;
-}
-
-#endif /* TE_PE */
-
 bfd_reloc_code_real_type
 x86_cons (expressionS *exp, int size)
 {