gcc-multiarch.patch 10.1 KB
Newer Older
Priscila Manhaes's avatar
Priscila Manhaes committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309
# DP: Add multiarch support to GCC.
# DP:
# DP: Convert the multilib option to a target triplet,
# DP: add multiarch include directories and libraries path:
# DP:	/usr/local/include/<arch>-linux-gnu
# DP:	/usr/include/<arch>-linux-gnu
# DP:	/usr/lib/<arch>-linux-gnu
# DP: to the system paths.
# DP:
# DP: Original patch:
# DP: http://anonscm.debian.org/viewvc/gcccvs/branches/sid/gcc-4.5/debian/patches/gcc-multiarch.diff?revision=5086&view=co

2011-08-05 Arnaud Fontaine <arnaud.fontaine@nexedi.com>
	* Enable multiarch unconditionally.

2011-03-08  Steve Langasek <steve.langasek@linaro.org>
	* Canonicalize x86 to i386 everywhere, not i486/i686

2009-03-24  Arthur Loiret  <aloiret@debian.org>

	* configure.ac: Handle --enable-multiarch and --with-multiarch-defaults.
	* config.gcc: Define MULTIARCH_DEFAULTS if multiarch is enabled.
	* config.in [!USED_FOR_TARGET]: Undef ENABLE_MULTIARCH.
	* gcc.c: include multiarch.h.
	(set_multiarch_dir): New function. Adds the multiarch directories to
	the library path.
	[ENABLE_MULTIARCH]: Use it.
	* cppdefault.c [LOCAL_INCLUDE_DIR, STANDARD_INCLUDE_DIR] Add an include
	directory for multiarch directories.
	* incpath.c: include multiarch.h
	[ENABLE_MULTIARCH]: Add the multiarch directory to include directories.
	* Makefile.in (MULTIARCH_H): New. Use it for incpath.o and gcc.o.
	* multiarch.h: New file.
---
 gcc/Makefile.in  |    7 ++--
 gcc/config.gcc   |    9 +++++
 gcc/config.in    |    4 ++
 gcc/configure.ac |   13 ++++++++
 gcc/cppdefault.c |    6 +++
 gcc/gcc.c        |   41 ++++++++++++++++++++++++
 gcc/incpath.c    |   28 ++++++++++++++++
 gcc/multiarch.h  |   91 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
 8 files changed, 196 insertions(+), 3 deletions(-)

--- a/src/gcc/gcc.c.orig	2009-12-20
+++ b/src/gcc/gcc.c	2009-12-20
@@ -71,6 +71,7 @@
 #include "system.h"
 #include "coretypes.h"
 #include "multilib.h" /* before tm.h */
+#include "multiarch.h"
 #include "tm.h"
 #include <signal.h>
 #if ! defined( SIGCHLD ) && defined( SIGCLD )
@@ -375,6 +376,7 @@
 static int used_arg (const char *, int);
 static int default_arg (const char *, int);
 static void set_multilib_dir (void);
+static void set_multiarch_dir (void);
 static void print_multilib_info (void);
 static void perror_with_name (const char *);
 static void fatal_ice (const char *, ...) ATTRIBUTE_PRINTF_1 ATTRIBUTE_NORETURN;
@@ -7354,6 +7358,9 @@
       xputenv (XOBFINISH (&collect_obstack, char *));
     }
 
+  /* Add the multiarch directories to libraries path.  */
+  set_multiarch_dir ();
+
   /* Warn about any switches that no pass was interested in.  */
 
   for (i = 0; (int) i < n_switches; i++)
@@ -8515,6 +8524,25 @@
     multilib_os_dir = multilib_dir;
 }
 
+/* Add the multiarch directories to libraries path. This uses the converted
+   multiarch triplet from the multilib value.
+   For example, if the target supports -m32/-m64 as multilib option and
+   defaults to 64, it will add /usr/lib/$triplet_target64/lib to library
+   path if either -m64 or no multilib option at all is set. And it will
+   add /usr/lib/$triplet_target32 if -m32 is set. Triplets are defined in
+   multiarch.def.  */
+
+static void
+set_multiarch_dir (void)
+{
+  const char *path;
+
+  path = concat (STANDARD_STARTFILE_PREFIX_2, MULTIARCH_DEFAULTS,
+    dir_separator_str, NULL);
+  add_prefix (&startfile_prefixes, path, NULL,
+    PREFIX_PRIORITY_LAST, 0, 1);
+}
+
 /* Print out the multiple library subdirectory selection
    information.  This prints out a series of lines.  Each line looks
    like SUBDIRECTORY;@OPTION@OPTION, with as many options as is
--- a/src/gcc/config.gcc.orig	2009-12-20
+++ b/src/gcc/config.gcc	2009-12-20
@@ -3371,3 +3371,10 @@
 		target_cpu_default=$target_cpu_default2
 	fi
 fi
+
+multiarch_defaults=`echo ${target_noncanonical} | sed -e 's/unknown-//'`
+multiarch_define="__`echo ${multiarch_defaults} | tr '-' '_'`__"
+if test x${with_multiarch_defaults} != x; then
+	multiarch_defaults=${with_multiarch_defaults}
+fi
+tm_defines="${tm_defines} ${multiarch_define}=1 MULTIARCH_DEFAULTS=\\\"${multiarch_defaults}\\\""
--- a/src/gcc/Makefile.in.orig	2009-12-20
+++ b/src/gcc/Makefile.in	2009-12-20
@@ -949,6 +949,7 @@
 		$(HASHTAB_H)
 PLUGIN_H = plugin.h $(GCC_PLUGIN_H)
 PLUGIN_VERSION_H = plugin-version.h configargs.h
+MULTIARCH_H = multiarch.h
 
 #
 # Now figure out from those variables how to compile and link.
@@ -1955,8 +1956,8 @@
 	-cp -p $^ $(srcdir)
 
 incpath.o: incpath.c incpath.h $(CONFIG_H) $(SYSTEM_H) $(CPPLIB_H) \
-		intl.h prefix.h coretypes.h $(TM_H) cppdefault.h $(TARGET_H) \
-		$(MACHMODE_H)
+		intl.h prefix.h coretypes.h $(TM_H) cppdefault.h $(MULTIARCH_H) \
+		$(TARGET_H) $(MACHMODE_H)
 
 c-decl.o : c-decl.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(TREE_H) \
     $(RTL_H) $(C_TREE_H) $(GGC_H) $(TARGET_H) $(FLAGS_H) $(FUNCTION_H) output.h \
@@ -2107,7 +2108,7 @@
 
 gcc.o: gcc.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) intl.h multilib.h \
     Makefile $(lang_specs_files) specs.h prefix.h $(GCC_H) $(FLAGS_H) \
-    configargs.h $(OBSTACK_H) opts.h
+    configargs.h $(OBSTACK_H) opts.h $(MULTIARCH_H)
 	(SHLIB_LINK='$(SHLIB_LINK)'; \
 	$(COMPILER) $(ALL_COMPILERFLAGS) $(ALL_CPPFLAGS) \
   $(DRIVER_DEFINES) \
--- a/src/gcc/incpath.c.orig	2009-11-30
+++ b/src/gcc/incpath.c	2009-12-20
@@ -30,6 +30,7 @@
 #include "intl.h"
 #include "incpath.h"
 #include "cppdefault.h"
+#include "multiarch.h"
 
 /* Microsoft Windows does not natively support inodes.
    VMS has non-numeric inodes.  */
@@ -132,6 +133,7 @@
   const struct default_include *p;
   int relocated = cpp_relocated();
   size_t len;
+  const char *multiarch;
 
   if (iprefix && (len = cpp_GCC_INCLUDE_DIR_len) != 0)
     {
@@ -150,8 +154,15 @@
 	      if (!strncmp (p->fname, cpp_GCC_INCLUDE_DIR, len))
 		{
 		  char *str = concat (iprefix, p->fname + len, NULL);
+		  if (p->multilib == 1 && imultilib)
+		    str = concat (str, dir_separator_str, imultilib, NULL);
+		  else if (p->multilib == 2)
+		    {
+		      multiarch = multilib_to_multiarch (imultilib);
+		      if (!multiarch)
+			continue;
+		      str = concat (str, dir_separator_str, multiarch, NULL);
+		    }
-		  if (p->multilib && imultilib)
-		    str = concat (str, dir_separator_str, imultilib, NULL);
 		  add_path (str, SYSTEM, p->cxx_aware, false);
 		}
 	    }
@@ -195,8 +211,15 @@
 	  else
 	    str = update_path (p->fname, p->component);
 
+	  if (p->multilib == 1 && imultilib)
+	    str = concat (str, dir_separator_str, imultilib, NULL);
+	  else if (p->multilib == 2)
+	    {
+	      multiarch = multilib_to_multiarch (imultilib);
+	      if (!multiarch)
+		continue;
+	      str = concat (str, dir_separator_str, multiarch, NULL);
+	    }
-	  if (p->multilib && imultilib)
-	    str = concat (str, dir_separator_str, imultilib, NULL);
 
 	  add_path (str, SYSTEM, p->cxx_aware, false);
 	}
--- a/src/gcc/multiarch.h.orig	2009-12-20
+++ b/src/gcc/multiarch.h	2009-12-20
@@ -0,0 +1,93 @@
+/* Header for multiarch handling (include directories, libraries path).
+   Copyright (C) 2009 Free Software Foundation, Inc.
+   Contributed by Arthur Loiret <aloiret@debian.org>
+
+This file is part of GCC.
+
+GCC is free software; you can redistribute it and/or modify it under
+the terms of the GNU General Public License as published by the Free
+Software Foundation; either version 3, or (at your option) any later
+version.
+
+GCC is distributed in the hope that it will be useful, but WITHOUT ANY
+WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with GCC; see the file COPYING3.  If not see
+<http://www.gnu.org/licenses/>.  */
+
+#ifndef GCC_MULTIARCH_H
+#define GCC_MULTIARCH_H
+
+#include "tm.h"
+
+struct multiarch_mapping
+{
+  const char *const multilib;
+  const char *const multiarch;
+};
+
+const struct multiarch_mapping multiarch_mappings[] = {
+  { "", MULTIARCH_DEFAULTS },
+# if defined(__x86_64_linux_gnu__)
+  { "32",  "i386-linux-gnu" },
+# endif
+# if defined(__i486_linux_gnu__) || defined(__i686_linux_gnu__)
+  { "64",  "x86_64-linux-gnu" },
+# endif
+# if defined(__powerpc64_linux_gnu__)
+  { "32",  "powerpc-linux-gnu" },
+# endif
+# if defined(__powerpc_linux_gnu__)
+  { "64",  "powerpc64-linux-gnu" },
+# endif
+# if defined(__sparc64_linux_gnu__)
+  { "32",  "sparc-linux-gnu" },
+# endif
+# if defined(__sparc_linux_gnu__)
+  { "64",  "sparc64-linux-gnu" },
+# endif
+# if defined(__s390x_linux_gnu__)
+  { "31",  "s390-linux-gnu" },
+# endif
+# if defined(__s390_linux_gnu__)
+  { "64",  "s390x-linux-gnu" },
+# endif
+# if defined(__mips_linux_gnu__)
+  { "n32",  "mips64-linux-gnuabin32" },
+  { "64",  "mips64-linux-gnuabi64" },
+# endif
+# if defined(__mipsel_linux_gnu__)
+  { "n32",  "mips64el-linux-gnuabin32" },
+  { "64",  "mips64el-linux-gnuabi64" },
+# endif
+# if defined(__x86_64_kfreebsd_gnu__)
+  { "32",  "i386-kfreebsd-gnu" },
+# endif
+# if defined(__sh4_linux_gnu__)
+  { "m4",  "sh4-linux-gnu" },
+  { "m4-nofpu",  "sh4_nofpu-linux-gnu" },
+# endif
+  { 0, 0 }
+};
+
+/* Convert the multilib option to the corresponding target triplet.
+   See multiarch.def and config.gcc for multilib/multiarch pairs.
+   When the default multilib is used, the corresponding multilib/multiarch
+   pair is { "", $target_tripplet }.  */
+static inline const char*
+multilib_to_multiarch (const char *imultilib)
+{
+  const struct multiarch_mapping *p;
+
+  for (p = multiarch_mappings; p->multiarch; p++)
+    {
+      if (!strcmp(p->multilib, imultilib ? imultilib : ""))
+	return p->multiarch;
+    }
+  return NULL;
+}
+
+#endif /* GCC_MULTIARCH_H */
--- a/src/gcc/cppdefault.c.orig	2008-07-21
+++ b/src/gcc/cppdefault.c	2009-12-20
@@ -60,6 +60,7 @@
 #endif
 #ifdef LOCAL_INCLUDE_DIR
     /* /usr/local/include comes before the fixincluded header files.  */
+    { LOCAL_INCLUDE_DIR, 0, 0, 1, 1, 2 },
     { LOCAL_INCLUDE_DIR, 0, 0, 1, 1, 0 },
 #endif
 #ifdef PREFIX_INCLUDE_DIR
@@ -95,6 +98,7 @@
 #endif
 #ifdef STANDARD_INCLUDE_DIR
     /* /usr/include comes dead last.  */
+    { STANDARD_INCLUDE_DIR, STANDARD_INCLUDE_COMPONENT, 0, 0, 1, 2 },
     { STANDARD_INCLUDE_DIR, STANDARD_INCLUDE_COMPONENT, 0, 0, 1, 0 },
 #endif
     { 0, 0, 0, 0, 0, 0 }