]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
install.texi (--with-mips-plt): Document.
authorDaniel Jacobowitz <dan@codesourcery.com>
Sun, 17 Aug 2008 10:48:46 +0000 (10:48 +0000)
committerRichard Sandiford <rsandifo@gcc.gnu.org>
Sun, 17 Aug 2008 10:48:46 +0000 (10:48 +0000)
gcc/
2008-08-17  Daniel Jacobowitz  <dan@codesourcery.com>
    Richard Sandiford  <rdsandiford@googlemail.com>

* doc/install.texi (--with-mips-plt): Document.
* doc/invoke.texi (-mplt, -mno-plt): Document.
* config.gcc (mips*-*-*): Add mips-plt to supported_defaults
and handle ${with_mips_plt}.
* config/mips/mips.opt (mplt): New option.
* config/mips/mips.h (TARGET_ABICALLS_PIC0): New macro.
(TARGET_ABICALLS_PIC2): Likewise.
(TARGET_GPWORD): Return false for TARGET_ABSOLUTE_ABICALLS.
(OPTION_DEFAULT_SPECS): Add a mips-plt entry.
(ASM_SPEC): Use !mabi=* instead of !mabi*.
(MIPS_CALL): Use TARGET_ABICALLS_PIC2 instead of TARGET_ABICALLS
to decide whether to output ".option picX" directives.
* config/mips/linux.h (SUBTARGET_ASM_SPEC): Remove -mabi=64 handling.
Pass -call_nonpic rather than -KPIC for -mplt.
(BASE_DRIVER_SELF_SPECS): Remove -mplt if -mno-shared is not present
on the command line.  Also remove it when -mabi=64 is used without
-msym32.
* config/mips/linux64.h (SUBTARGET_ASM_SPEC): Delete.
* config/mips/mips.c (mips_use_pic_fn_addr_reg_p): Handle
TARGET_ABICALLS_PIC0.
(mips_classify_symbol): Use TARGET_ABICALLS_PIC2 instead of
TARGET_ABICALLS.
(mips16_build_function_stub): Only output ".option pic" directives
and PIC stubs if TARGET_ABICALLS_PIC2.  Call through $25 instead of $1.
(mips16_build_call_stub): Fix comment and remove redundant
".set at"/"set .noat" directives.
(mips_function_rodata_section): Use the default behaviour for
TARGET_ABSOLUTE_ABICALLS.
(mips_file_start): Emit ".option pic0" for TARGET_ABICALLS_PIC0.
(mips_global_pointer): Handle TARGET_ABICALLS_PIC0.
(mips_restore_gp): Do nothing if the current function doesn't use
a global pointer.
(mips_expand_prologue): Only save $gp if the current function uses it.
Use a normal move for TARGET_ABICALLS_PIC0.
(mips_override_options): Only set flag_pic if TARGET_ABICALLS_PIC2.

Co-Authored-By: Richard Sandiford <rdsandiford@googlemail.com>
From-SVN: r139170

gcc/ChangeLog
gcc/config.gcc
gcc/config/mips/linux.h
gcc/config/mips/linux64.h
gcc/config/mips/mips.c
gcc/config/mips/mips.h
gcc/config/mips/mips.opt
gcc/doc/install.texi
gcc/doc/invoke.texi

index 9b3fc6ef69ada769be6ba8e6e77225833cf268c8..9ca20ac74c07c5742579a51decaf212105055bd6 100644 (file)
@@ -1,3 +1,42 @@
+2008-08-17  Daniel Jacobowitz  <dan@codesourcery.com>
+           Richard Sandiford  <rdsandiford@googlemail.com>
+
+       * doc/install.texi (--with-mips-plt): Document.
+       * doc/invoke.texi (-mplt, -mno-plt): Document.
+       * config.gcc (mips*-*-*): Add mips-plt to supported_defaults
+       and handle ${with_mips_plt}.
+       * config/mips/mips.opt (mplt): New option.
+       * config/mips/mips.h (TARGET_ABICALLS_PIC0): New macro.
+       (TARGET_ABICALLS_PIC2): Likewise.
+       (TARGET_GPWORD): Return false for TARGET_ABSOLUTE_ABICALLS.
+       (OPTION_DEFAULT_SPECS): Add a mips-plt entry.
+       (ASM_SPEC): Use !mabi=* instead of !mabi*.
+       (MIPS_CALL): Use TARGET_ABICALLS_PIC2 instead of TARGET_ABICALLS
+       to decide whether to output ".option picX" directives.
+       * config/mips/linux.h (SUBTARGET_ASM_SPEC): Remove -mabi=64 handling.
+       Pass -call_nonpic rather than -KPIC for -mplt.
+       (BASE_DRIVER_SELF_SPECS): Remove -mplt if -mno-shared is not present
+       on the command line.  Also remove it when -mabi=64 is used without
+       -msym32.
+       * config/mips/linux64.h (SUBTARGET_ASM_SPEC): Delete.
+       * config/mips/mips.c (mips_use_pic_fn_addr_reg_p): Handle
+       TARGET_ABICALLS_PIC0.
+       (mips_classify_symbol): Use TARGET_ABICALLS_PIC2 instead of
+       TARGET_ABICALLS.
+       (mips16_build_function_stub): Only output ".option pic" directives
+       and PIC stubs if TARGET_ABICALLS_PIC2.  Call through $25 instead of $1.
+       (mips16_build_call_stub): Fix comment and remove redundant
+       ".set at"/"set .noat" directives.
+       (mips_function_rodata_section): Use the default behaviour for
+       TARGET_ABSOLUTE_ABICALLS.
+       (mips_file_start): Emit ".option pic0" for TARGET_ABICALLS_PIC0.
+       (mips_global_pointer): Handle TARGET_ABICALLS_PIC0.
+       (mips_restore_gp): Do nothing if the current function doesn't use
+       a global pointer.
+       (mips_expand_prologue): Only save $gp if the current function uses it.
+       Use a normal move for TARGET_ABICALLS_PIC0.
+       (mips_override_options): Only set flag_pic if TARGET_ABICALLS_PIC2.
+
 2008-08-17  Richard Sandiford  <rdsandiford@googlemail.com>
 
        * config/mips/mips.c (mips_save_reg_p): Don't short-circuit rest
index 30339e233d482f044f41dd86f688a33b9ef8c22d..7078b0bda9246343546ec18a6c598aae9548bea0 100644 (file)
@@ -2779,7 +2779,7 @@ case "${target}" in
                ;;
 
        mips*-*-*)
-               supported_defaults="abi arch float tune divide llsc"
+               supported_defaults="abi arch float tune divide llsc mips-plt"
 
                case ${with_float} in
                "" | soft | hard)
@@ -2826,6 +2826,21 @@ case "${target}" in
                        exit 1
                        ;;
                esac
+
+               case ${with_mips_plt} in
+               yes)
+                       with_mips_plt=plt
+                       ;;
+               no)
+                       with_mips_plt=no-plt
+                       ;;
+               "")
+                       ;;
+               *)
+                       echo "Unknown --with-mips-plt argument: $with_mips_plt" 1>&2
+                       exit 1
+                       ;;
+               esac
                ;;
 
        powerpc*-*-* | rs6000-*-*)
@@ -3078,10 +3093,10 @@ case ${target} in
 esac
 
 t=
-all_defaults="abi cpu cpu_32 cpu_64 arch arch_32 arch_64 tune tune_32 tune_64 schedule float mode fpu divide llsc"
+all_defaults="abi cpu cpu_32 cpu_64 arch arch_32 arch_64 tune tune_32 tune_64 schedule float mode fpu divide llsc mips-plt"
 for option in $all_defaults
 do
-       eval "val=\$with_$option"
+       eval "val=\$with_"`echo $option | sed s/-/_/g`
        if test -n "$val"; then
                case " $supported_defaults " in
                *" $option "*)
index 90cf63df23c18521990100255dd58a01dfe24d35..b30289741fe136e1d99243f789f720a8d31c1a1f 100644 (file)
@@ -79,7 +79,8 @@ along with GCC; see the file COPYING3.  If not see
         %{static:-static}}}"
 
 #undef SUBTARGET_ASM_SPEC
-#define SUBTARGET_ASM_SPEC "%{mabi=64: -64} %{!mno-abicalls:-KPIC}"
+#define SUBTARGET_ASM_SPEC \
+  "%{!mno-abicalls:%{mplt:-call_nonpic;:-KPIC}}"
 
 /* The MIPS assembler has different syntax for .set. We set it to
    .dummy to trap any errors.  */
@@ -134,6 +135,11 @@ extern const char *host_detect_local_cpu (int argc, const char **argv);
 #endif
 
 #define BASE_DRIVER_SELF_SPECS \
-  NO_SHARED_SPECS \
-  MARCH_MTUNE_NATIVE_SPECS
+  NO_SHARED_SPECS                                                      \
+  MARCH_MTUNE_NATIVE_SPECS,                                            \
+  /* -mplt has no effect without -mno-shared.  Simplify later          \
+     specs handling by removing a redundant option.  */                        \
+  "%{!mno-shared:%<mplt}",                                             \
+  /* -mplt likewise has no effect for -mabi=64 without -msym32.  */    \
+  "%{mabi=64:%{!msym32:%<mplt}}"
 #define DRIVER_SELF_SPECS BASE_DRIVER_SELF_SPECS
index 5a2c6cefe7cb5e3954f9b904f477badf76f4f879..3d37aeba24f8045cc3f9ce7045465b0817644f5e 100644 (file)
@@ -26,11 +26,6 @@ BASE_DRIVER_SELF_SPECS \
 " %{!EB:%{!EL:%(endian_spec)}}" \
 " %{!mabi=*: -mabi=n32}"
 
-#undef SUBTARGET_ASM_SPEC
-#define SUBTARGET_ASM_SPEC "\
-%{!fno-PIC:%{!fno-pic:-KPIC}} \
-%{fno-PIC:-non_shared} %{fno-pic:-non_shared}"
-
 #undef LIB_SPEC
 #define LIB_SPEC "\
 %{pthread:-lpthread} \
index 51af59b2f1c3fc4d3b14b8fb5644f7ab6ba07d90..e9eb20cc0eec58bb7ef5440ef53775fff17c20b7 100644 (file)
@@ -1454,13 +1454,20 @@ mips_use_pic_fn_addr_reg_p (const_rtx x)
   if (mips16_stub_function_p (x))
     return false;
 
-  /* When TARGET_ABSOLUTE_ABICALLS is true, locally-defined functions
-     use absolute accesses to set up the global pointer.  */
-  if (TARGET_ABSOLUTE_ABICALLS
-      && GET_CODE (x) == SYMBOL_REF
-      && mips_symbol_binds_local_p (x)
-      && !SYMBOL_REF_EXTERNAL_P (x))
-    return false;
+  if (GET_CODE (x) == SYMBOL_REF)
+    {
+      /* If PLTs and copy relocations are available, the static linker
+        will make sure that $25 is valid on entry to the target function.  */
+      if (TARGET_ABICALLS_PIC0)
+       return false;
+
+      /* Locally-defined functions use absolute accesses to set up
+        the global pointer.  */
+      if (TARGET_ABSOLUTE_ABICALLS
+         && mips_symbol_binds_local_p (x)
+         && !SYMBOL_REF_EXTERNAL_P (x))
+       return false;
+    }
 
   return true;
 }
@@ -1512,7 +1519,7 @@ mips_classify_symbol (const_rtx x, enum mips_symbol_context context)
 
   /* Don't use GOT accesses for locally-binding symbols when -mno-shared
      is in effect.  */
-  if (TARGET_ABICALLS
+  if (TARGET_ABICALLS_PIC2
       && !(TARGET_ABSOLUTE_ABICALLS && mips_symbol_binds_local_p (x)))
     {
       /* There are three cases to consider:
@@ -5657,35 +5664,36 @@ mips16_build_function_stub (void)
   assemble_start_function (stubdecl, stubname);
   mips_start_function_definition (stubname, false);
 
-  /* If generating abicalls code, either set up the global pointer or
-     switch to absolute mode.  */
-  if (TARGET_ABSOLUTE_ABICALLS)
-    fprintf (asm_out_file, "\t.option\tpic0\n");
-  else if (TARGET_ABICALLS)
+  /* If generating pic2 code, either set up the global pointer or
+     switch to pic0.  */
+  if (TARGET_ABICALLS_PIC2)
     {
-      output_asm_insn ("%(.cpload\t%^%)", NULL);
-      /* Emit an R_MIPS_NONE relocation to tell the linker what the
-        target function is.  Use a local GOT access when loading the
-        symbol, to cut down on the number of unnecessary GOT entries
-        for stubs that aren't needed.  */
-      output_asm_insn (".reloc\t0,R_MIPS_NONE,%0", &symbol);
-      symbol = alias;
+      if (TARGET_ABSOLUTE_ABICALLS)
+       fprintf (asm_out_file, "\t.option\tpic0\n");
+      else
+       {
+         output_asm_insn ("%(.cpload\t%^%)", NULL);
+         /* Emit an R_MIPS_NONE relocation to tell the linker what the
+            target function is.  Use a local GOT access when loading the
+            symbol, to cut down on the number of unnecessary GOT entries
+            for stubs that aren't needed.  */
+         output_asm_insn (".reloc\t0,R_MIPS_NONE,%0", &symbol);
+         symbol = alias;
+       }
     }
 
-  /* Load the address of the MIPS16 function into $at.  Do this first so
+  /* Load the address of the MIPS16 function into $25.  Do this first so
      that targets with coprocessor interlocks can use an MFC1 to fill the
      delay slot.  */
-  fprintf (asm_out_file, "\t.set\tnoat\n");
-  output_asm_insn ("la\t%@,%0", &symbol);
+  output_asm_insn ("la\t%^,%0", &symbol);
 
   /* Move the arguments from floating-point registers to general registers.  */
   mips_output_args_xfer (crtl->args.info.fp_code, 'f');
 
   /* Jump to the MIPS16 function.  */
-  output_asm_insn ("jr\t%@", NULL);
-  fprintf (asm_out_file, "\t.set\tat\n");
+  output_asm_insn ("jr\t%^", NULL);
 
-  if (TARGET_ABSOLUTE_ABICALLS)
+  if (TARGET_ABICALLS_PIC2 && TARGET_ABSOLUTE_ABICALLS)
     fprintf (asm_out_file, "\t.option\tpic2\n");
 
   mips_end_function_definition (stubname);
@@ -5906,10 +5914,9 @@ mips16_build_call_stub (rtx retval, rtx *fn_ptr, rtx args_size, int fp_code)
 
       if (!fp_ret_p)
        {
-         /* Load the address of the MIPS16 function into $at.  Do this
+         /* Load the address of the MIPS16 function into $25.  Do this
             first so that targets with coprocessor interlocks can use
             an MFC1 to fill the delay slot.  */
-         fprintf (asm_out_file, "\t.set\tnoat\n");
          if (TARGET_EXPLICIT_RELOCS)
            {
              output_asm_insn ("lui\t%^,%%hi(%0)", &fn);
@@ -5927,7 +5934,6 @@ mips16_build_call_stub (rtx retval, rtx *fn_ptr, rtx args_size, int fp_code)
        {
          /* Jump to the previously-loaded address.  */
          output_asm_insn ("jr\t%^", NULL);
-         fprintf (asm_out_file, "\t.set\tat\n");
        }
       else
        {
@@ -7222,15 +7228,16 @@ mips_select_rtx_section (enum machine_mode mode, rtx x,
 /* Implement TARGET_ASM_FUNCTION_RODATA_SECTION.
 
    The complication here is that, with the combination TARGET_ABICALLS
-   && !TARGET_GPWORD, jump tables will use absolute addresses, and should
-   therefore not be included in the read-only part of a DSO.  Handle such
-   cases by selecting a normal data section instead of a read-only one.
-   The logic apes that in default_function_rodata_section.  */
+   && !TARGET_ABSOLUTE_ABICALLS && !TARGET_GPWORD, jump tables will use
+   absolute addresses, and should therefore not be included in the
+   read-only part of a DSO.  Handle such cases by selecting a normal
+   data section instead of a read-only one.  The logic apes that in
+   default_function_rodata_section.  */
 
 static section *
 mips_function_rodata_section (tree decl)
 {
-  if (!TARGET_ABICALLS || TARGET_GPWORD)
+  if (!TARGET_ABICALLS || TARGET_ABSOLUTE_ABICALLS || TARGET_GPWORD)
     return default_function_rodata_section (decl);
 
   if (decl && DECL_SECTION_NAME (decl))
@@ -7729,7 +7736,11 @@ mips_file_start (void)
 
   /* If TARGET_ABICALLS, tell GAS to generate -KPIC code.  */
   if (TARGET_ABICALLS)
-    fprintf (asm_out_file, "\t.abicalls\n");
+    {
+      fprintf (asm_out_file, "\t.abicalls\n");
+      if (TARGET_ABICALLS_PIC0)
+       fprintf (asm_out_file, "\t.option\tpic0\n");
+    }
 
   if (flag_verbose_asm)
     fprintf (asm_out_file, "\n%s -G value = %d, Arch = %s, ISA = %d\n",
@@ -8285,24 +8296,40 @@ mips_global_pointer (void)
   if (crtl->has_nonlocal_goto)
     return GLOBAL_POINTER_REGNUM;
 
-  /* If the gp is never referenced, there's no need to initialize it.
-     Note that reload can sometimes introduce constant pool references
-     into a function that otherwise didn't need them.  For example,
-     suppose we have an instruction like:
+  /* There's no need to initialize $gp if it isn't referenced now,
+     and if we can be sure that no new references will be added during
+     or after reload.  */
+  if (!df_regs_ever_live_p (GLOBAL_POINTER_REGNUM)
+      && !mips_function_has_gp_insn ())
+    {
+      /* The function doesn't use $gp at the moment.  If we're generating
+        -call_nonpic code, no new uses will be introduced during or after
+        reload.  */
+      if (TARGET_ABICALLS_PIC0)
+       return 0;
 
-         (set (reg:DF R1) (float:DF (reg:SI R2)))
+      /* We need to handle the following implicit gp references:
 
-     If R2 turns out to be constant such as 1, the instruction may have a
-     REG_EQUAL note saying that R1 == 1.0.  Reload then has the option of
-     using this constant if R2 doesn't get allocated to a register.
+        - Reload can sometimes introduce constant pool references
+          into a function that otherwise didn't need them.  For example,
+          suppose we have an instruction like:
 
-     In cases like these, reload will have added the constant to the pool
-     but no instruction will yet refer to it.  */
-  if (!df_regs_ever_live_p (GLOBAL_POINTER_REGNUM)
-      && !crtl->uses_const_pool
-      && !mips16_cfun_returns_in_fpr_p ()
-      && !mips_function_has_gp_insn ())
-    return 0;
+              (set (reg:DF R1) (float:DF (reg:SI R2)))
+
+          If R2 turns out to be constant such as 1, the instruction may
+          have a REG_EQUAL note saying that R1 == 1.0.  Reload then has
+          the option of using this constant if R2 doesn't get allocated
+          to a register.
+
+          In cases like these, reload will have added the constant to the
+          pool but no instruction will yet refer to it.
+
+        - MIPS16 functions that return in FPRs need to call an
+          external libgcc routine.  */
+      if (!crtl->uses_const_pool
+         && !mips16_cfun_returns_in_fpr_p ())
+       return 0;
+    }
 
   /* We need a global pointer, but perhaps we can use a call-clobbered
      register instead of $gp.  */
@@ -8694,6 +8721,9 @@ mips_restore_gp (rtx temp)
 {
   gcc_assert (TARGET_ABICALLS && TARGET_OLDABI);
 
+  if (cfun->machine->global_pointer == 0)
+    return;
+
   if (TARGET_MIPS16)
     {
       mips_emit_move (temp, mips_cprestore_slot (temp));
@@ -9121,13 +9151,17 @@ mips_expand_prologue (void)
   mips_emit_loadgp ();
 
   /* Initialize the $gp save slot.  */
-  if (frame->cprestore_size > 0)
+  if (frame->cprestore_size > 0
+      && cfun->machine->global_pointer != 0)
     {
       if (TARGET_MIPS16)
        mips_emit_move (mips_cprestore_slot (MIPS_PROLOGUE_TEMP (Pmode)),
                        MIPS16_PIC_TEMP);
-      else
+      else if (TARGET_ABICALLS_PIC2)
        emit_insn (gen_cprestore (GEN_INT (frame->args_size)));
+      else
+       emit_move_insn (mips_cprestore_slot (MIPS_PROLOGUE_TEMP (Pmode)),
+                       pic_offset_table_rtx);
     }
 
   /* If we are profiling, make sure no instructions are scheduled before
@@ -13196,14 +13230,16 @@ mips_override_options (void)
       target_flags &= ~MASK_ABICALLS;
     }
 
-  if (TARGET_ABICALLS)
+  if (TARGET_ABICALLS_PIC2)
     /* We need to set flag_pic for executables as well as DSOs
        because we may reference symbols that are not defined in
        the final executable.  (MIPS does not use things like
        copy relocs, for example.)
 
-       Also, there is a body of code that uses __PIC__ to distinguish
-       between -mabicalls and -mno-abicalls code.  */
+       There is a body of code that uses __PIC__ to distinguish
+       between -mabicalls and -mno-abicalls code.  The non-__PIC__
+       variant is usually appropriate for TARGET_ABICALLS_PIC0, as
+       long as any indirect jumps use $25.  */
     flag_pic = 1;
 
   /* -mvr4130-align is a "speed over size" optimization: it usually produces
index ffeef0a16d4810684e396e4be4dcde37dc18796f..30d77eb5cc3263dc53ebeac022da17526e030601 100644 (file)
@@ -148,6 +148,15 @@ enum mips_code_readable_setting {
 /* True if we are generating position-independent VxWorks RTP code.  */
 #define TARGET_RTP_PIC (TARGET_VXWORKS_RTP && flag_pic)
 
+/* True if the output file is marked as ".abicalls; .option pic0"
+   (-call_nonpic).  */
+#define TARGET_ABICALLS_PIC0 \
+  (TARGET_ABSOLUTE_ABICALLS && TARGET_PLT)
+
+/* True if the output file is marked as ".abicalls; .option pic2" (-KPIC).  */
+#define TARGET_ABICALLS_PIC2 \
+  (TARGET_ABICALLS && !TARGET_ABICALLS_PIC0)
+
 /* True if the call patterns should be split into a jalr followed by
    an instruction to restore $gp.  It is only safe to split the load
    from the call when every use of $gp is explicit.  */
@@ -200,7 +209,10 @@ enum mips_code_readable_setting {
    Although GAS does understand .gpdword, the SGI linker mishandles
    the relocations GAS generates (R_MIPS_GPREL32 followed by R_MIPS_64).
    We therefore disable GP-relative switch tables for n64 on IRIX targets.  */
-#define TARGET_GPWORD (TARGET_ABICALLS && !(mips_abi == ABI_64 && TARGET_IRIX))
+#define TARGET_GPWORD                          \
+  (TARGET_ABICALLS                             \
+   && !TARGET_ABSOLUTE_ABICALLS                        \
+   && !(mips_abi == ABI_64 && TARGET_IRIX))
 
 /* Generate mips16 code */
 #define TARGET_MIPS16          ((target_flags & MASK_MIPS16) != 0)
@@ -715,7 +727,8 @@ enum mips_code_readable_setting {
   {"abi", "%{!mabi=*:-mabi=%(VALUE)}" }, \
   {"float", "%{!msoft-float:%{!mhard-float:-m%(VALUE)-float}}" }, \
   {"divide", "%{!mdivide-traps:%{!mdivide-breaks:-mdivide-%(VALUE)}}" }, \
-  {"llsc", "%{!mllsc:%{!mno-llsc:-m%(VALUE)}}" }
+  {"llsc", "%{!mllsc:%{!mno-llsc:-m%(VALUE)}}" }, \
+  {"mips-plt", "%{!mplt:%{!mno-plt:-m%(VALUE)}}" }
 
 
 #define GENERATE_DIVIDE_TRAPS (TARGET_DIVIDE_TRAPS \
@@ -1074,7 +1087,7 @@ enum mips_code_readable_setting {
 %{mfix-vr4120} %{mfix-vr4130} \
 %(subtarget_asm_optimizing_spec) \
 %(subtarget_asm_debugging_spec) \
-%{mabi=*} %{!mabi*: %(asm_abi_default_spec)} \
+%{mabi=*} %{!mabi=*: %(asm_abi_default_spec)} \
 %{mgp32} %{mgp64} %{march=*} %{mxgot:-xgot} \
 %{mfp32} %{mfp64} \
 %{mshared} %{mno-shared} \
@@ -2559,7 +2572,7 @@ typedef struct mips_args {
    ? "%*" INSN "\t%" #OPNO "%/"                                        \
    : REG_P (OPERANDS[OPNO])                                    \
    ? "%*" INSN "r\t%" #OPNO "%/"                               \
-   : TARGET_ABICALLS                                           \
+   : TARGET_ABICALLS_PIC2                                      \
    ? (".option\tpic0\n\t"                                      \
       "%*" INSN "\t%" #OPNO "%/\n\t"                           \
       ".option\tpic2")                                         \
index 3a19d0af160e928ae6a8fc52d1e29c7e6b0c2c44..4e69e29a7e5a5bd642f05f3283cf271f1e912d4a 100644 (file)
@@ -160,6 +160,10 @@ mgpopt
 Target Report Var(TARGET_GPOPT) Init(1)
 Use GP-relative addressing to access small data
 
+mplt
+Target Report Var(TARGET_PLT)
+When generating -mabicalls code, allow executables to use PLTs and copy relocations
+
 mhard-float
 Target Report RejectNegative InverseMask(SOFT_FLOAT_ABI, HARD_FLOAT_ABI)
 Allow the use of hardware floating-point ABI and instructions
index a69a0859ce03d13b651a9d9e2ce6714a9bf1a884..e3560c80138be76626f65064040e82eda38e1ad0 100644 (file)
@@ -1076,6 +1076,12 @@ not provide them.
 On MIPS targets, make @option{-mno-llsc} the default when no
 @option{-mllsc} option is passed.
 
+@item --with-mips-plt
+On MIPS targets, make use of copy relocations and PLTs.
+These features are extensions to the traditional
+SVR4-based MIPS ABIs and require support from GNU binutils
+and the runtime C library.
+
 @item --enable-__cxa_atexit
 Define if you want to use __cxa_atexit, rather than atexit, to
 register C++ destructors for local statics and global objects.
index 40c3df16594ea50715997416f6167559632673d7..3d034536a2894cb80a06799ffeae766a1b77279c 100644 (file)
@@ -634,8 +634,8 @@ Objective-C and Objective-C++ Dialects}.
 -mips16  -mno-mips16  -mflip-mips16 @gol
 -minterlink-mips16  -mno-interlink-mips16 @gol
 -mabi=@var{abi}  -mabicalls  -mno-abicalls @gol
--mshared  -mno-shared  -mxgot  -mno-xgot  -mgp32  -mgp64 @gol
--mfp32  -mfp64  -mhard-float  -msoft-float @gol
+-mshared  -mno-shared  -mplt  -mno-plt  -mxgot  -mno-xgot @gol
+-mgp32  -mgp64  -mfp32  -mfp64  -mhard-float  -msoft-float @gol
 -msingle-float  -mdouble-float  -mdsp  -mno-dsp  -mdspr2  -mno-dspr2 @gol
 -msmartmips  -mno-smartmips @gol
 -mpaired-single  -mno-paired-single  -mdmx  -mno-mdmx @gol
@@ -12162,6 +12162,19 @@ executables both smaller and quicker.
 
 @option{-mshared} is the default.
 
+@item -mplt
+@itemx -mno-plt
+@opindex mplt
+@opindex mno-plt
+Assume (do not assume) that the static and dynamic linkers
+support PLTs and copy relocations.  This option only affects
+@samp{-mno-shared -mabicalls}.  For the n64 ABI, this option
+has no effect without @samp{-msym32}.
+
+You can make @option{-mplt} the default by configuring
+GCC with @option{--with-mips-plt}.  The default is
+@option{-mno-plt} otherwise.
+
 @item -mxgot
 @itemx -mno-xgot
 @opindex mxgot