This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

.machine for Darwin, new cctools required


This patch uses the new .machine directive in the Darwin assembler to
say which instruction set is to be used, which lets me get rid of the
workaround using -force_cpusubtype_ALL, and fixes a collection of bugs
of the form 'if I use this combination of flags, the assembler refuses
to assemble GCC's output', some of which were being worked around in
the testsuite.

This patch requires a further updated cctools to work properly.  You
can get it from
<ftp://gcc.gnu.org/pub/gcc/infrastructure/cctools-528.5.tar.bz2> in
source form, and an installable package at
<ftp://gcc.gnu.org/pub/gcc/infrastructure/cctools-528.5.dmg>.

Bootstrapped & tested on powerpc-darwin.  I also hand-checked that a
bunch of flag combinations were working properly using 'otool -vh'.

-- 
- Geoffrey Keating <geoffk@apple.com>

===File ~/patches/gcc-3751364-2.patch=======================
2004-10-14  Geoffrey Keating  <geoffk@apple.com>

	* config/rs6000/darwin.h (ASM_SPEC): Delete.
	(TARGET_ASM_FILE_START): Define.
	* config/darwin.h (ASM_SPEC): Define.
	* config/rs6000/t-darwin (TARGET_LIBGCC2_CFLAGS): Don't supply
	-mlong-double-128, it's the default.  Update comment about reason
	for force_cpusubtype_ALL.
	* config/rs6000/darwin-vecsave.asm: Supply .machine.
	* config/rs6000/darwin-world.asm: Likewise.
	* config/rs6000/rs6000.c (rs6000_darwin_file_start): New.
	(symbolic_operand): Delete #if 0ed code.

Index: testsuite/ChangeLog
2004-10-14  Geoffrey Keating  <geoffk@apple.com>

	* gcc.dg/darwin-misaligned.c: Don't supply -force_cpusubtype_ALL.
	* gcc.dg/macho-lo-sum.c: Likewise.

Index: config/darwin.h
===================================================================
RCS file: /cvs/gcc/gcc/gcc/config/darwin.h,v
retrieving revision 1.96
diff -u -p -u -p -r1.96 darwin.h
--- config/darwin.h	16 Sep 2004 06:49:58 -0000	1.96
+++ config/darwin.h	14 Oct 2004 22:18:57 -0000
@@ -330,6 +330,9 @@ extern const char *darwin_fix_and_contin
    to put anything in ENDFILE_SPEC.  */
 /* #define ENDFILE_SPEC "" */
 
+/* Default Darwin ASM_SPEC, very simple.  */
+#define ASM_SPEC "-arch %(darwin_arch)"
+
 /* We use Dbx symbol format.  */
 
 #define DBX_DEBUGGING_INFO 1
Index: config/rs6000/darwin-vecsave.asm
===================================================================
RCS file: /cvs/gcc/gcc/gcc/config/rs6000/darwin-vecsave.asm,v
retrieving revision 1.2
diff -u -p -u -p -r1.2 darwin-vecsave.asm
--- config/rs6000/darwin-vecsave.asm	31 Mar 2004 16:06:52 -0000	1.2
+++ config/rs6000/darwin-vecsave.asm	14 Oct 2004 22:18:58 -0000
@@ -41,6 +41,7 @@
    (4 bytes) to do the operation; for Vector regs, 2 instructions are
    required (8 bytes.).   */
 
+	.machine ppc7400
 .text
 	.align 2
 
Index: config/rs6000/darwin-world.asm
===================================================================
RCS file: /cvs/gcc/gcc/gcc/config/rs6000/darwin-world.asm,v
retrieving revision 1.2
diff -u -p -u -p -r1.2 darwin-world.asm
--- config/rs6000/darwin-world.asm	22 Sep 2004 01:06:29 -0000	1.2
+++ config/rs6000/darwin-world.asm	14 Oct 2004 22:18:58 -0000
@@ -34,6 +34,7 @@
  *  executable file might be covered by the GNU General Public License.
  */ 
 
+	.machine ppc7400
 .data
 	.align 2
 
Index: config/rs6000/darwin.h
===================================================================
RCS file: /cvs/gcc/gcc/gcc/config/rs6000/darwin.h,v
retrieving revision 1.64
diff -u -p -u -p -r1.64 darwin.h
--- config/rs6000/darwin.h	13 Sep 2004 17:30:56 -0000	1.64
+++ config/rs6000/darwin.h	14 Oct 2004 22:18:58 -0000
@@ -132,19 +132,14 @@ do {									\
 %{static: %{Zdynamic: %e conflicting code gen style switches are used}}\
 %{!static:%{!mdynamic-no-pic:-fPIC}}"
 
-/* It's virtually impossible to predict all the possible combinations
-   of -mcpu and -maltivec and whatnot, so just supply
-   -force_cpusubtype_ALL if any are seen.  Radar 3492132 against the
-   assembler is asking for a .machine directive so we could get this
-   really right.  */
-#define ASM_SPEC "-arch ppc \
-  %{Zforce_cpusubtype_ALL:-force_cpusubtype_ALL} \
-  %{!Zforce_cpusubtype_ALL:%{maltivec|mcpu=*|mpowerpc64:-force_cpusubtype_ALL}}"
-
 #undef SUBTARGET_EXTRA_SPECS
 #define SUBTARGET_EXTRA_SPECS			\
   { "darwin_arch", "ppc" },
 
+/* Output a .machine directive.  */
+#undef TARGET_ASM_FILE_START
+#define TARGET_ASM_FILE_START rs6000_darwin_file_start
+
 /* The "-faltivec" option should have been called "-maltivec" all
    along.  -ffix-and-continue and -findirect-data is for compatibility
    for old compilers.  */
Index: config/rs6000/rs6000.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/config/rs6000/rs6000.c,v
retrieving revision 1.723
diff -u -p -u -p -r1.723 rs6000.c
--- config/rs6000/rs6000.c	13 Oct 2004 11:04:24 -0000	1.723
+++ config/rs6000/rs6000.c	14 Oct 2004 22:18:58 -0000
@@ -754,6 +754,7 @@ static void macho_branch_islands (void);
 static void add_compiler_branch_island (tree, tree, int);
 static int no_previous_def (tree function_name);
 static tree get_prev_label (tree function_name);
+static void rs6000_darwin_file_start (void);
 #endif
 
 static tree rs6000_build_builtin_va_list (void);
@@ -1713,6 +1714,7 @@ rs6000_file_start (void)
 	putc ('\n', file);
     }
 }
+
 
 /* Return nonzero if this function is known to have a null epilogue.  */
 
@@ -16859,32 +16861,6 @@ rs6000_fatal_bad_address (rtx op)
 
 #if TARGET_MACHO
 
-#if 0
-/* Returns 1 if OP is either a symbol reference or a sum of a symbol
-   reference and a constant.  */
-
-int
-symbolic_operand (rtx op)
-{
-  switch (GET_CODE (op))
-    {
-    case SYMBOL_REF:
-    case LABEL_REF:
-      return 1;
-    case CONST:
-      op = XEXP (op, 0);
-      return (GET_CODE (op) == SYMBOL_REF ||
-	      (GET_CODE (XEXP (op, 0)) == SYMBOL_REF
-	       || GET_CODE (XEXP (op, 0)) == LABEL_REF)
-	      && GET_CODE (XEXP (op, 1)) == CONST_INT);
-    default:
-      return 0;
-    }
-}
-#endif
-
-#if TARGET_MACHO
-
 static tree branch_island_list = 0;
 
 /* Remember to generate a branch island for far calls to the given
@@ -17060,8 +17036,6 @@ output_call (rtx insn, rtx *operands, in
   return buf;
 }
 
-#endif /* TARGET_MACHO */
-
 /* Generate PIC and indirect symbol stubs.  */
 
 void
@@ -17197,6 +17171,57 @@ toc_section (void)
 {
 }
 
+/* Output a .machine directive for the Darwin assembler, and call
+   the generic start_file routine.  */
+
+static void
+rs6000_darwin_file_start (void)
+{
+  static const struct 
+  {
+    const char *arg;
+    const char *name;
+    int if_set;
+  } mapping[] = {
+    { "970", "ppc970", MASK_PPC_GPOPT | MASK_MFCRF | MASK_POWERPC64 },
+    { "power4", "ppc970", 0 },
+    { "G5", "ppc970", 0 },
+    { "7450", "ppc7450", 0 },
+    { "7400", "ppc7400", MASK_ALTIVEC },
+    { "G4", "ppc7400", 0 },
+    { "750", "ppc750", 0 },
+    { "740", "ppc750", 0 },
+    { "G3", "ppc750", 0 },
+    { "604e", "ppc604e", 0 },
+    { "604", "ppc604", 0 },
+    { "603e", "ppc603", 0 },
+    { "603", "ppc603", 0 },
+    { "601", "ppc601", 0 },
+    { NULL, "ppc", 0 } };
+  const char *cpu_id = "";
+  size_t i;
+  
+  rs6000_file_start();
+
+  /* Determine the argument to -mcpu=.  Default to G3 if not specified.  */
+  for (i = 0; i < ARRAY_SIZE (rs6000_select); i++)
+    if (rs6000_select[i].set_arch_p && rs6000_select[i].string
+	&& rs6000_select[i].string[0] != '\0')
+      cpu_id = rs6000_select[i].string;
+
+  /* Look through the mapping array.  Pick the first name that either
+     matches the argument, has a bit set in IF_SET that is also set
+     in the target flags, or has a NULL name.  */
+
+  i = 0;
+  while (mapping[i].arg != NULL
+	 && strcmp (mapping[i].arg, cpu_id) != 0
+	 && (mapping[i].if_set & target_flags) == 0)
+    i++;
+
+  fprintf (asm_out_file, "\t.machine %s\n", mapping[i].name);
+}
+
 #endif /* TARGET_MACHO */
 
 #if TARGET_ELF
Index: config/rs6000/t-darwin
===================================================================
RCS file: /cvs/gcc/gcc/gcc/config/rs6000/t-darwin,v
retrieving revision 1.13
diff -u -p -u -p -r1.13 t-darwin
--- config/rs6000/t-darwin	1 Jul 2004 04:09:05 -0000	1.13
+++ config/rs6000/t-darwin	14 Oct 2004 22:18:58 -0000
@@ -7,7 +7,7 @@ LIB2FUNCS_STATIC_EXTRA = \
 	$(srcdir)/config/rs6000/darwin-vecsave.asm  \
 	$(srcdir)/config/rs6000/darwin-world.asm
 
-# Enable AltiVec instructions when assembling the aforementioned .asm files.
-# For libgcc, we always want 128-bit long double, since a libgcc built with
-# that will work without it.
-TARGET_LIBGCC2_CFLAGS = -mlong-double-128 -Wa,-force_cpusubtype_ALL
+# The .asm files above are designed to run on all processors,
+# even though they use AltiVec instructions.  -Wa is used because
+# -force_cpusubtype_ALL doesn't work with -dynamiclib.
+TARGET_LIBGCC2_CFLAGS = -Wa,-force_cpusubtype_ALL
Index: testsuite/gcc.dg/darwin-misaligned.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/testsuite/gcc.dg/darwin-misaligned.c,v
retrieving revision 1.1
diff -u -p -u -p -r1.1 darwin-misaligned.c
--- testsuite/gcc.dg/darwin-misaligned.c	22 Dec 2003 18:37:24 -0000	1.1
+++ testsuite/gcc.dg/darwin-misaligned.c	14 Oct 2004 22:19:02 -0000
@@ -1,5 +1,5 @@
 /* { dg-do compile { target powerpc*-*-darwin* } } */
-/* { dg-options "-O2 -force_cpusubtype_ALL -mpowerpc64" } */
+/* { dg-options "-O2 -mpowerpc64" } */
 
 typedef struct Nlm_rect {
   short sh1;
Index: testsuite/gcc.dg/macho-lo-sum.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/testsuite/gcc.dg/macho-lo-sum.c,v
retrieving revision 1.1
diff -u -p -u -p -r1.1 macho-lo-sum.c
--- testsuite/gcc.dg/macho-lo-sum.c	19 Dec 2003 23:35:40 -0000	1.1
+++ testsuite/gcc.dg/macho-lo-sum.c	14 Oct 2004 22:19:02 -0000
@@ -1,5 +1,5 @@
 /* { dg-do compile { target powerpc*-*-darwin* } } */
-/* { dg-options "-O2 -force_cpusubtype_ALL -mpowerpc64 -mdynamic-no-pic" } */
+/* { dg-options "-O2 -mpowerpc64 -mdynamic-no-pic" } */
 
 long long knight_attacks[64];
 long long InitializeAttackBoards(void);
============================================================


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]