]> git.ipfire.org Git - thirdparty/gcc.git/blobdiff - gcc/config/rs6000/linux64.h
Update copyright years.
[thirdparty/gcc.git] / gcc / config / rs6000 / linux64.h
index 1dbb3d94a739c0752972e801dfb1e13227fd9e94..11911c4966a3e2ece1765e7159ed199824815820 100644 (file)
@@ -1,6 +1,6 @@
 /* Definitions of target machine for GNU compiler,
    for 64 bit PowerPC linux.
-   Copyright (C) 2000-2017 Free Software Foundation, Inc.
+   Copyright (C) 2000-2020 Free Software Foundation, Inc.
 
    This file is part of GCC.
 
@@ -112,7 +112,7 @@ extern int dot_symbols;
            {                                                   \
              rs6000_current_abi = ABI_ELFv2;                   \
              if (dot_symbols)                                  \
-               error ("-mcall-aixdesc incompatible with -mabi=elfv2"); \
+               error ("%<-mcall-aixdesc%> incompatible with %<-mabi=elfv2%>"); \
            }                                                   \
          if (rs6000_isa_flags & OPTION_MASK_RELOCATABLE)       \
            {                                                   \
@@ -132,14 +132,14 @@ extern int dot_symbols;
          if ((rs6000_isa_flags & OPTION_MASK_POWERPC64) == 0)  \
            {                                                   \
              rs6000_isa_flags |= OPTION_MASK_POWERPC64;        \
-             error ("-m64 requires a PowerPC64 cpu");          \
+             error ("%<-m64%> requires a PowerPC64 cpu");              \
            }                                                   \
          if ((rs6000_isa_flags_explicit                        \
               & OPTION_MASK_MINIMAL_TOC) != 0)                 \
            {                                                   \
              if (global_options_set.x_rs6000_current_cmodel    \
                  && rs6000_current_cmodel != CMODEL_SMALL)     \
-               error ("-mcmodel incompatible with other toc options"); \
+               error ("%<-mcmodel incompatible with other toc options%>"); \
              SET_CMODEL (CMODEL_SMALL);                        \
            }                                                   \
          else                                                  \
@@ -155,6 +155,13 @@ extern int dot_symbols;
                    TARGET_NO_SUM_IN_TOC = 0;                   \
                }                                               \
            }                                                   \
+         if (TARGET_PLTSEQ && DEFAULT_ABI != ABI_ELFv2)        \
+           {                                                   \
+             if (global_options_set.x_rs6000_pltseq)           \
+               warning (0, "%qs unsupported for this ABI",     \
+                        "-mpltseq");                           \
+             rs6000_pltseq = false;                            \
+           }                                                   \
        }                                                       \
       else                                                     \
        {                                                       \
@@ -174,24 +181,20 @@ extern int dot_symbols;
     }                                                          \
   while (0)
 
-#undef ASM_DEFAULT_SPEC
 #undef ASM_SPEC
 #undef LINK_OS_LINUX_SPEC
 #undef LINK_SECURE_PLT_SPEC
 
 #ifndef        RS6000_BI_ARCH
-#define        ASM_DEFAULT_SPEC "-mppc64"
 #define        ASM_SPEC         "%(asm_spec64) %(asm_spec_common)"
 #define        LINK_OS_LINUX_SPEC "%(link_os_linux_spec64)"
 #define        LINK_SECURE_PLT_SPEC ""
 #else
 #if DEFAULT_ARCH64_P
-#define        ASM_DEFAULT_SPEC "-mppc%{!m32:64}"
 #define        ASM_SPEC         "%{m32:%(asm_spec32)}%{!m32:%(asm_spec64)} %(asm_spec_common)"
 #define        LINK_OS_LINUX_SPEC "%{m32:%(link_os_linux_spec32)}%{!m32:%(link_os_linux_spec64)}"
 #define        LINK_SECURE_PLT_SPEC "%{m32: " LINK_SECURE_PLT_DEFAULT_SPEC "}"
 #else
-#define        ASM_DEFAULT_SPEC "-mppc%{m64:64}"
 #define        ASM_SPEC         "%{!m64:%(asm_spec32)}%{m64:%(asm_spec64)} %(asm_spec_common)"
 #define        LINK_OS_LINUX_SPEC "%{!m64:%(link_os_linux_spec32)}%{m64:%(link_os_linux_spec64)}"
 #define        LINK_SECURE_PLT_SPEC "%{!m64: " LINK_SECURE_PLT_DEFAULT_SPEC "}"
@@ -270,8 +273,8 @@ extern int dot_symbols;
 #ifndef RS6000_BI_ARCH
 
 /* 64-bit PowerPC Linux always has a TOC.  */
-#undef  TARGET_TOC
-#define        TARGET_TOC              1
+#undef  TARGET_HAS_TOC
+#define TARGET_HAS_TOC         1
 
 /* Some things from sysv4.h we don't do when 64 bit.  */
 #undef OPTION_RELOCATABLE
@@ -369,6 +372,9 @@ extern int dot_symbols;
 #define TARGET_OS_CPP_BUILTINS()                       \
   do                                                   \
     {                                                  \
+      if (strcmp (rs6000_abi_name, "linux") == 0       \
+         || strcmp (rs6000_abi_name, "aixdesc") == 0)  \
+       GNU_USER_TARGET_OS_CPP_BUILTINS();              \
       if (TARGET_64BIT)                                        \
        {                                               \
          builtin_define ("__PPC__");                   \
@@ -395,7 +401,8 @@ extern int dot_symbols;
 #define CPP_OS_DEFAULT_SPEC "%(cpp_os_linux) %(include_extra)"
 
 #undef  LINK_SHLIB_SPEC
-#define LINK_SHLIB_SPEC "%{shared:-shared} %{!shared: %{static:-static}}"
+#define LINK_SHLIB_SPEC "%{shared:-shared} %{!shared: %{static:-static}} \
+  %{static-pie:-static -pie --no-dynamic-linker -z text}"
 
 #undef  LIB_DEFAULT_SPEC
 #define LIB_DEFAULT_SPEC "%(lib_linux)"
@@ -424,32 +431,13 @@ extern int dot_symbols;
 ":%(dynamic_linker_prefix)/lib64/ld64.so.1}"
 #endif
 
+#undef MUSL_DYNAMIC_LINKER32
 #define MUSL_DYNAMIC_LINKER32 \
   "/lib/ld-musl-powerpc" MUSL_DYNAMIC_LINKER_E "%{msoft-float:-sf}.so.1"
+#undef MUSL_DYNAMIC_LINKER64
 #define MUSL_DYNAMIC_LINKER64 \
   "/lib/ld-musl-powerpc64" MUSL_DYNAMIC_LINKER_E "%{msoft-float:-sf}.so.1"
 
-#define UCLIBC_DYNAMIC_LINKER32 "/lib/ld-uClibc.so.0"
-#define UCLIBC_DYNAMIC_LINKER64 "/lib/ld64-uClibc.so.0"
-#if DEFAULT_LIBC == LIBC_UCLIBC
-#define CHOOSE_DYNAMIC_LINKER(G, U, M) \
-  "%{mglibc:" G ";:%{mmusl:" M ";:" U "}}"
-#elif DEFAULT_LIBC == LIBC_GLIBC
-#define CHOOSE_DYNAMIC_LINKER(G, U, M) \
-  "%{muclibc:" U ";:%{mmusl:" M ";:" G "}}"
-#elif DEFAULT_LIBC == LIBC_MUSL
-#define CHOOSE_DYNAMIC_LINKER(G, U, M) \
-  "%{mglibc:" G ";:%{muclibc:" U ";:" M "}}"
-#else
-#error "Unsupported DEFAULT_LIBC"
-#endif
-#define GNU_USER_DYNAMIC_LINKER32 \
-  CHOOSE_DYNAMIC_LINKER (GLIBC_DYNAMIC_LINKER32, UCLIBC_DYNAMIC_LINKER32, \
-                        MUSL_DYNAMIC_LINKER32)
-#define GNU_USER_DYNAMIC_LINKER64 \
-  CHOOSE_DYNAMIC_LINKER (GLIBC_DYNAMIC_LINKER64, UCLIBC_DYNAMIC_LINKER64, \
-                        MUSL_DYNAMIC_LINKER64)
-
 #undef  DEFAULT_ASM_ENDIAN
 #if (TARGET_DEFAULT & MASK_LITTLE_ENDIAN)
 #define DEFAULT_ASM_ENDIAN " -mlittle"
@@ -470,15 +458,24 @@ extern int dot_symbols;
 #endif
 
 #define LINK_OS_LINUX_SPEC32 LINK_OS_LINUX_EMUL32 " %{!shared: %{!static: \
-  %{rdynamic:-export-dynamic} \
-  -dynamic-linker " GNU_USER_DYNAMIC_LINKER32 "}} \
+  %{!static-pie: \
+    %{rdynamic:-export-dynamic} \
+    -dynamic-linker " GNU_USER_DYNAMIC_LINKER32 "}}} \
   %(link_os_extra_spec32)"
 
 #define LINK_OS_LINUX_SPEC64 LINK_OS_LINUX_EMUL64 " %{!shared: %{!static: \
-  %{rdynamic:-export-dynamic} \
-  -dynamic-linker " GNU_USER_DYNAMIC_LINKER64 "}} \
+  %{!static-pie: \
+    %{rdynamic:-export-dynamic} \
+    -dynamic-linker " GNU_USER_DYNAMIC_LINKER64 "}}} \
   %(link_os_extra_spec64)"
 
+/* Use gnu-user.h LINK_GCC_SEQUENCE_SPEC for linux.  */
+#undef LINK_GCC_C_SEQUENCE_SPEC
+#define        LINK_GCC_C_SEQUENCE_SPEC \
+  "%{mads|myellowknife|mmvme|msim:%G %L %G;" \
+  "!mcall-*|mcall-linux:" GNU_USER_TARGET_LINK_GCC_C_SEQUENCE_SPEC ";" \
+  ":%G %L %G}"
+
 #undef  TOC_SECTION_ASM_OP
 #define TOC_SECTION_ASM_OP \
   (TARGET_64BIT                                                \
@@ -566,19 +563,22 @@ extern int dot_symbols;
    we also do this for floating-point constants.  We actually can only
    do this if the FP formats of the target and host machines are the
    same, but we can't check that since not every file that uses
-   the macros includes real.h.  We also do this when we can write the
-   entry into the TOC and the entry is not larger than a TOC entry.  */
+   the macros includes real.h.  We also do this when we can write an
+   integer into the TOC and the entry is not larger than a TOC entry,
+   but not for -mcmodel=medium where we'll use a toc-relative load for
+   constants outside the TOC.  */
 
 #undef  ASM_OUTPUT_SPECIAL_POOL_ENTRY_P
 #define ASM_OUTPUT_SPECIAL_POOL_ENTRY_P(X, MODE)                       \
   (TARGET_TOC                                                          \
-   && (GET_CODE (X) == SYMBOL_REF                                      \
+   && (SYMBOL_REF_P (X)                                                        \
        || (GET_CODE (X) == CONST && GET_CODE (XEXP (X, 0)) == PLUS     \
-          && GET_CODE (XEXP (XEXP (X, 0), 0)) == SYMBOL_REF)           \
+          && SYMBOL_REF_P (XEXP (XEXP (X, 0), 0)))                     \
        || GET_CODE (X) == LABEL_REF                                    \
-       || (GET_CODE (X) == CONST_INT                                   \
+       || (CONST_INT_P (X)                                             \
+          && TARGET_CMODEL != CMODEL_MEDIUM                            \
           && GET_MODE_BITSIZE (MODE) <= GET_MODE_BITSIZE (Pmode))      \
-       || (GET_CODE (X) == CONST_DOUBLE                                        \
+       || (CONST_DOUBLE_P (X)                                          \
           && ((TARGET_64BIT                                            \
                && (TARGET_MINIMAL_TOC                                  \
                    || (SCALAR_FLOAT_MODE_P (GET_MODE (X))              \