public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
* .machine for Darwin, new cctools required
@ 2004-10-14 22:41 Geoffrey Keating
  2004-10-14 22:50 ` Stan Shebs
  0 siblings, 1 reply; 11+ messages in thread
From: Geoffrey Keating @ 2004-10-14 22:41 UTC (permalink / raw)
  To: gcc-patches


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);
     }
 }
+
 \f
 /* 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);
============================================================

^ permalink raw reply	[flat|nested] 11+ messages in thread

end of thread, other threads:[~2004-10-19 18:41 UTC | newest]

Thread overview: 11+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2004-10-14 22:41 .machine for Darwin, new cctools required Geoffrey Keating
2004-10-14 22:50 ` Stan Shebs
2004-10-14 23:02   ` Geoffrey Keating
2004-10-15  4:08     ` Stan Shebs
2004-10-15  4:52     ` Stan Shebs
2004-10-15 17:45       ` Geoffrey Keating
2004-10-19 17:55         ` Stan Shebs
2004-10-18 23:16       ` Kelley Cook
2004-10-18 23:20         ` Mike Stump
2004-10-19 18:09         ` Stan Shebs
2004-10-19 19:12           ` Kelley Cook

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).