diff mbox series

, Patch #6, revision 3, Create pc-relative addressing insns

Message ID 20190716061913.GA20513@ibm-toto.the-meissners.org
State New
Headers show
Series , Patch #6, revision 3, Create pc-relative addressing insns | expand

Commit Message

Michael Meissner July 16, 2019, 6:19 a.m. UTC
This is a re-think of patch #6.

I have changed the TARGET_TOC to be TARGET_HAS_TOC in the aix, darwin, system
V, and Linux 64-bit headers.  Then in rs6000.h, TARGET_TOC is defined in terms
of TARGET_HAS_TOC and not pc-relative referencing.

I discovered that TARGET_NO_TOC must not be set to be just !TARGET_TOC, since
TARGET_NO_TOC is used to create the elf_high, elf_low insns in 32-bit.

I added a gcc_assert in create_TOC_reference.

For pc-relative, I dropped setting an alias set, since it uses the constant
pool SYMBOL_REF created by force_const_mem (the TOC code needs to create the
alias set because it rewrites the memory address, and the constant pool stuff
is missing).  Note, there is some more code that will need to be done when
pc-relative support is completely supported, and that will be in a later patch.

I did rename the static variable 'set' that contained the alias set to
TOC_alias_set.  I did not move the initialization of the TOC_alias_set
elsewhere, because in order to call TOC_alias_set, the code has already called
force_const_mem, create_TOC_reference, and gen_const_mem, so I didn't see the
point of adding a micro-optimization for this.

For that future pc-relative change, I did add code to only allow pc-relative if
the memory model is medium.  This eliminates some of the checks you objected to
in the previous patch.

I did build the compiler on both big endian and little endian power8 system,
and ran the regression tests (both 64/32-bit on the big endian system, and just
64-bit on the little endian system) and there were no regressions.

In addition, I built spec 2017 and spec 2006 for both little endian power9 and
the future system using the branch that contains the full future pc-relative
changes that I'm submitting bits and pieces from.  I reworked that branch to
use the same patches that are being submitted.

Can I check this into the trunk?

2019-07-15  Michael Meissner  <meissner@linux.ibm.com>

	* config/rs6000/aix.h (TARGET_HAS_TOC): Rename TARGET_TOC to
	TARGET_HAS_TOC.
	(TARGET_TOC): Likewise.
	(TARGET_NO_TOC): Delete here, define in rs6000.h.
	* config/rs6000/darwin.h (TARGET_HAS_TOC): Rename TARGET_TOC to
	TARGET_HAS_TOC.
	(TARGET_TOC): Likewise.
	(TARGET_NO_TOC): Delete here, define in rs6000.h.
	* config/rs6000/linux64.h (TARGET_HAS_TOC): Rename TARGET_TOC to
	TARGET_HAS_TOC.
	(TARGET_TOC): Likewise.
	* config/rs6000/rs6000.c (rs6000_option_override_internal): Add
	check to require -mcmodel=medium for pc-relative addressing.
	(create_TOC_reference): Add assertion for TARGET_TOC.
	(TOC_alias_set): Rename TOC alias set static variable from 'set'
	to 'TOC_alias_set'.
	(get_TOC_alias_set): Likewise.
	* config/rs6000/rs6000.h (TARGET_TOC): Define in terms of
	TARGET_HAS_TOC and not pc-relative.
	(TARGET_NO_TOC): Likewise.
	* config/rs6000/sysv4.h (TARGET_HAS_TOC): Rename TARGET_TOC to
	TARGET_HAS_TOC.
	(TARGET_TOC): Likewise.
	(TARGET_NO_TOC): Delete here, define in rs6000.h.

Comments

Segher Boessenkool July 16, 2019, 8:58 p.m. UTC | #1
Hi Mike,

On Tue, Jul 16, 2019 at 02:19:14AM -0400, Michael Meissner wrote:
> I have changed the TARGET_TOC to be TARGET_HAS_TOC in the aix, darwin, system
> V, and Linux 64-bit headers.  Then in rs6000.h, TARGET_TOC is defined in terms
> of TARGET_HAS_TOC and not pc-relative referencing.

Cool, thanks.  Good name, too.

> I discovered that TARGET_NO_TOC must not be set to be just !TARGET_TOC, since
> TARGET_NO_TOC is used to create the elf_high, elf_low insns in 32-bit.

I don't know if your setting in sysv4.h works.  This file is used on so
very many platforms, it is hard to predict if it works everywhere :-/

> I did rename the static variable 'set' that contained the alias set to
> TOC_alias_set.

:-)

> I did not move the initialization of the TOC_alias_set
> elsewhere, because in order to call TOC_alias_set, the code has already called
> force_const_mem, create_TOC_reference, and gen_const_mem, so I didn't see the
> point of adding a micro-optimization for this.

It gets rid of a call, but also of the conditional, and that makes this
eminently inlinable.  You could remove the getter function completely
even, access the variable directly.

But, sure, that's existing code only now.

> Index: gcc/config/rs6000/linux64.h
> ===================================================================
> --- gcc/config/rs6000/linux64.h	(revision 273457)
> +++ gcc/config/rs6000/linux64.h	(working copy)
> @@ -277,8 +277,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

Fix the tab while your at it?  Not that it is consistent at all in this
file, but having the undef and the define in different style... :-)


So, what does TARGET_NO_TOC mean now?  Maybe a better name would help,
or some documentation if not?

Looks good otherwise, okay for trunk.  Thanks!

(And watch out if it works on AIX and Darwin, please).


Segher
Michael Meissner July 16, 2019, 11:31 p.m. UTC | #2
David, would it be possible to do a bootstrap on AIX to make sure I haven't
broken anything before I commit the patch to the trunk?

Ian, if you have time, could you also do the PowerPC Darwin port that would be
helpful also.

Now, the changes are pretty simple, and I expect them to be fine.  Basically
for the new 'future' machine, we have pc-relative addressing, and we want to
turn off the TOC suport.

The patch is on the SVN branch:
	svn+ssh://gcc.gnu.org/svn/gcc/branches/ibm/pcrel-trunk

And I just merged the branch up to trunk top earlier today.

The patch in question is in this post:
https://gcc.gnu.org/ml/gcc-patches/2019-07/msg01080.html

Thanks in advance.
Michael Meissner July 18, 2019, 6:20 p.m. UTC | #3
On Tue, Jul 16, 2019 at 03:58:18PM -0500, Segher Boessenkool wrote:
> Hi Mike,
> 
> On Tue, Jul 16, 2019 at 02:19:14AM -0400, Michael Meissner wrote:
> > I have changed the TARGET_TOC to be TARGET_HAS_TOC in the aix, darwin, system
> > V, and Linux 64-bit headers.  Then in rs6000.h, TARGET_TOC is defined in terms
> > of TARGET_HAS_TOC and not pc-relative referencing.
> 
> Cool, thanks.  Good name, too.
> 
> > I discovered that TARGET_NO_TOC must not be set to be just !TARGET_TOC, since
> > TARGET_NO_TOC is used to create the elf_high, elf_low insns in 32-bit.
> 
> I don't know if your setting in sysv4.h works.  This file is used on so
> very many platforms, it is hard to predict if it works everywhere :-/

Well it is a mechanical change.

> > I did rename the static variable 'set' that contained the alias set to
> > TOC_alias_set.
> 
> :-)
> 
> > I did not move the initialization of the TOC_alias_set
> > elsewhere, because in order to call TOC_alias_set, the code has already called
> > force_const_mem, create_TOC_reference, and gen_const_mem, so I didn't see the
> > point of adding a micro-optimization for this.
> 
> It gets rid of a call, but also of the conditional, and that makes this
> eminently inlinable.  You could remove the getter function completely
> even, access the variable directly.
> 
> But, sure, that's existing code only now.

We can fix this later.

> > Index: gcc/config/rs6000/linux64.h
> > ===================================================================
> > --- gcc/config/rs6000/linux64.h	(revision 273457)
> > +++ gcc/config/rs6000/linux64.h	(working copy)
> > @@ -277,8 +277,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
> 
> Fix the tab while your at it?  Not that it is consistent at all in this
> file, but having the undef and the define in different style... :-)
> 
> 
> So, what does TARGET_NO_TOC mean now?  Maybe a better name would help,
> or some documentation if not?
> 
> Looks good otherwise, okay for trunk.  Thanks!
> 
> (And watch out if it works on AIX and Darwin, please).

David has said the earlier patch works on AIX, and Ian has said he will test it
when he is able to.

I did rename the TARGET_NO_TOC macro to TARGET_NO_TOC_OR_PCREL which hopefully
makes it more obvious when it should be true.

Here is the patch I committed:

2019-07-18  Michael Meissner  <meissner@linux.ibm.com>

	* config/rs6000/aix.h (TARGET_HAS_TOC): Rename TARGET_TOC to
	TARGET_HAS_TOC.
	(TARGET_TOC): Likewise.
	(TARGET_NO_TOC): Delete here, define TARGET_NO_TOC_OR_PCREL in
	rs6000.h.
	* config/rs6000/darwin.h (TARGET_HAS_TOC): Rename TARGET_TOC to
	TARGET_HAS_TOC.
	(TARGET_TOC): Likewise.
	(TARGET_NO_TOC): Delete here, define TARGET_NO_TOC_OR_PCREL in
	rs6000.h.
	* config/rs6000/linux64.h (TARGET_HAS_TOC): Rename TARGET_TOC to
	TARGET_HAS_TOC.
	(TARGET_TOC): Likewise.
	* config/rs6000/rs6000.c (rs6000_option_override_internal): Add
	check to require -mcmodel=medium for pc-relative addressing.
	(create_TOC_reference): Add assertion for TARGET_TOC.
	(rs6000_legitimize_address): Use TARGET_NO_TOC_OR_PCREL instead of
	TARGET_NO_TOC.
	(rs6000_emit_move): Likewise.
	(TOC_alias_set): Rename TOC alias set static variable from 'set'
	to 'TOC_alias_set'.
	(get_TOC_alias_set): Likewise.
	(output_toc): Use TARGET_NO_TOC_OR_PCREL instead of
	TARGET_NO_TOC.
	(rs6000_can_eliminate): Likewise.
	* config/rs6000/rs6000.h (TARGET_TOC): Define in terms of
	TARGET_HAS_TOC and not pc-relative.
	(TARGET_NO_TOC_OR_PCREL): New macro to replace TARGET_NO_TOC.
	* config/rs6000/sysv4.h (TARGET_HAS_TOC): Rename TARGET_TOC to
	TARGET_HAS_TOC.
	(TARGET_TOC): Likewise.
	(TARGET_NO_TOC): Delete here, define TARGET_NO_TOC_OR_PCREL in
	rs6000.h.

Index: gcc/config/rs6000/aix.h
===================================================================
--- gcc/config/rs6000/aix.h	(revision 273578)
+++ gcc/config/rs6000/aix.h	(working copy)
@@ -32,8 +32,7 @@
 #define TARGET_AIX_OS 1
 
 /* AIX always has a TOC.  */
-#define TARGET_NO_TOC 0
-#define TARGET_TOC 1
+#define TARGET_HAS_TOC 1
 #define FIXED_R2 1
 
 /* AIX allows r13 to be used in 32-bit mode.  */
Index: gcc/config/rs6000/darwin.h
===================================================================
--- gcc/config/rs6000/darwin.h	(revision 273578)
+++ gcc/config/rs6000/darwin.h	(working copy)
@@ -43,8 +43,7 @@
 
 /* We're not ever going to do TOCs.  */
 
-#define TARGET_TOC 0
-#define TARGET_NO_TOC 1
+#define TARGET_HAS_TOC 0
 
 /* Override the default rs6000 definition.  */
 #undef  PTRDIFF_TYPE
Index: gcc/config/rs6000/linux64.h
===================================================================
--- gcc/config/rs6000/linux64.h	(revision 273578)
+++ gcc/config/rs6000/linux64.h	(working copy)
@@ -277,8 +277,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
Index: gcc/config/rs6000/rs6000.c
===================================================================
--- gcc/config/rs6000/rs6000.c	(revision 273578)
+++ gcc/config/rs6000/rs6000.c	(working copy)
@@ -4333,6 +4333,16 @@ rs6000_option_override_internal (bool gl
   SUB3TARGET_OVERRIDE_OPTIONS;
 #endif
 
+  /* -mpcrel requires -mcmodel=medium, but we can't check TARGET_CMODEL until
+      after the subtarget override options are done.  */
+  if (TARGET_PCREL && TARGET_CMODEL != CMODEL_MEDIUM)
+    {
+      if ((rs6000_isa_flags_explicit & OPTION_MASK_PCREL) != 0)
+	error ("%qs requires %qs", "-mpcrel", "-mcmodel=medium");
+
+      rs6000_isa_flags &= ~OPTION_MASK_PCREL;
+    }
+
   if (TARGET_DEBUG_REG || TARGET_DEBUG_TARGET)
     rs6000_print_isa_options (stderr, 0, "after subtarget", rs6000_isa_flags);
 
@@ -7742,6 +7752,8 @@ create_TOC_reference (rtx symbol, rtx la
 {
   rtx tocrel, tocreg, hi;
 
+  gcc_assert (TARGET_TOC);
+
   if (TARGET_DEBUG_ADDR)
     {
       if (SYMBOL_REF_P (symbol))
@@ -8121,7 +8133,7 @@ rs6000_legitimize_address (rtx x, rtx ol
 #endif
 	    )
 	   && TARGET_32BIT
-	   && TARGET_NO_TOC
+	   && TARGET_NO_TOC_OR_PCREL
 	   && !flag_pic
 	   && !CONST_INT_P (x)
 	   && !CONST_WIDE_INT_P (x)
@@ -9811,7 +9823,7 @@ rs6000_emit_move (rtx dest, rtx source,
 	}
 
       if ((TARGET_ELF || DEFAULT_ABI == ABI_DARWIN)
-	  && TARGET_NO_TOC
+	  && TARGET_NO_TOC_OR_PCREL
 	  && ! flag_pic
 	  && mode == Pmode
 	  && CONSTANT_P (operands[1])
@@ -23725,14 +23737,14 @@ rs6000_split_multireg_move (rtx dst, rtx
     }
 }
 
-static GTY(()) alias_set_type set = -1;
+static GTY(()) alias_set_type TOC_alias_set = -1;
 
 alias_set_type
 get_TOC_alias_set (void)
 {
-  if (set == -1)
-    set = new_alias_set ();
-  return set;
+  if (TOC_alias_set == -1)
+    TOC_alias_set = new_alias_set ();
+  return TOC_alias_set;
 }
 
 /* Return the internal arg pointer used for function incoming
@@ -24103,7 +24115,7 @@ output_toc (FILE *file, rtx x, int label
   rtx base = x;
   HOST_WIDE_INT offset = 0;
 
-  gcc_assert (!TARGET_NO_TOC);
+  gcc_assert (!TARGET_NO_TOC_OR_PCREL);
 
   /* When the linker won't eliminate them, don't output duplicate
      TOC entries (this happens on AIX if there is any kind of TOC,
@@ -30469,7 +30481,7 @@ rs6000_can_eliminate (const int from, co
   return (from == ARG_POINTER_REGNUM && to == STACK_POINTER_REGNUM
 	  ? ! frame_pointer_needed
 	  : from == RS6000_PIC_OFFSET_TABLE_REGNUM
-	    ? ! TARGET_MINIMAL_TOC || TARGET_NO_TOC
+	    ? ! TARGET_MINIMAL_TOC || TARGET_NO_TOC_OR_PCREL
 		|| constant_pool_empty_p ()
 	    : true);
 }
Index: gcc/config/rs6000/rs6000.h
===================================================================
--- gcc/config/rs6000/rs6000.h	(revision 273578)
+++ gcc/config/rs6000/rs6000.h	(working copy)
@@ -54,6 +54,13 @@
 #define TARGET_AIX_OS 0
 #endif
 
+/* Turn off TOC support if pc-relative addressing is used.  */
+#define TARGET_TOC             (TARGET_HAS_TOC && !TARGET_PCREL)
+
+/* On 32-bit systems without a TOC or pc-relative addressing, we need to use
+   ADDIS/ADDI to load up the address of a symbol.  */
+#define TARGET_NO_TOC_OR_PCREL (!TARGET_HAS_TOC && !TARGET_PCREL)
+
 /* Control whether function entry points use a "dot" symbol when
    ABI_AIX.  */
 #define DOT_SYMBOLS 1
Index: gcc/config/rs6000/sysv4.h
===================================================================
--- gcc/config/rs6000/sysv4.h	(revision 273578)
+++ gcc/config/rs6000/sysv4.h	(working copy)
@@ -41,7 +41,7 @@
 #undef	ASM_DEFAULT_SPEC
 #define	ASM_DEFAULT_SPEC "-mppc"
 
-#define	TARGET_TOC		(TARGET_64BIT				\
+#define	TARGET_HAS_TOC		(TARGET_64BIT				\
 				 || (TARGET_MINIMAL_TOC			\
 				     && flag_pic > 1)			\
 				 || DEFAULT_ABI != ABI_V4)
@@ -50,7 +50,6 @@
 #define	TARGET_BIG_ENDIAN	(! TARGET_LITTLE_ENDIAN)
 #define	TARGET_PROTOTYPE	target_prototype
 #define	TARGET_NO_PROTOTYPE	(! TARGET_PROTOTYPE)
-#define	TARGET_NO_TOC		(! TARGET_TOC)
 #define	TARGET_NO_EABI		(! TARGET_EABI)
 #define	TARGET_REGNAMES		rs6000_regnames
Segher Boessenkool July 18, 2019, 7:34 p.m. UTC | #4
On Thu, Jul 18, 2019 at 02:20:43PM -0400, Michael Meissner wrote:
> On Tue, Jul 16, 2019 at 03:58:18PM -0500, Segher Boessenkool wrote:
> > > I did not move the initialization of the TOC_alias_set
> > > elsewhere, because in order to call TOC_alias_set, the code has already called
> > > force_const_mem, create_TOC_reference, and gen_const_mem, so I didn't see the
> > > point of adding a micro-optimization for this.
> > 
> > It gets rid of a call, but also of the conditional, and that makes this
> > eminently inlinable.  You could remove the getter function completely
> > even, access the variable directly.
> > 
> > But, sure, that's existing code only now.
> 
> We can fix this later.

Yup :-)

> I did rename the TARGET_NO_TOC macro to TARGET_NO_TOC_OR_PCREL which hopefully
> makes it more obvious when it should be true.

It does, thanks!


Segher
diff mbox series

Patch

Index: gcc/config/rs6000/aix.h
===================================================================
--- gcc/config/rs6000/aix.h	(revision 273457)
+++ gcc/config/rs6000/aix.h	(working copy)
@@ -32,8 +32,7 @@ 
 #define TARGET_AIX_OS 1
 
 /* AIX always has a TOC.  */
-#define TARGET_NO_TOC 0
-#define TARGET_TOC 1
+#define TARGET_HAS_TOC 1
 #define FIXED_R2 1
 
 /* AIX allows r13 to be used in 32-bit mode.  */
Index: gcc/config/rs6000/darwin.h
===================================================================
--- gcc/config/rs6000/darwin.h	(revision 273457)
+++ gcc/config/rs6000/darwin.h	(working copy)
@@ -43,8 +43,7 @@ 
 
 /* We're not ever going to do TOCs.  */
 
-#define TARGET_TOC 0
-#define TARGET_NO_TOC 1
+#define TARGET_HAS_TOC 0
 
 /* Override the default rs6000 definition.  */
 #undef  PTRDIFF_TYPE
Index: gcc/config/rs6000/linux64.h
===================================================================
--- gcc/config/rs6000/linux64.h	(revision 273457)
+++ gcc/config/rs6000/linux64.h	(working copy)
@@ -277,8 +277,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
Index: gcc/config/rs6000/rs6000.c
===================================================================
--- gcc/config/rs6000/rs6000.c	(revision 273457)
+++ gcc/config/rs6000/rs6000.c	(working copy)
@@ -4333,6 +4333,16 @@  rs6000_option_override_internal (bool gl
   SUB3TARGET_OVERRIDE_OPTIONS;
 #endif
 
+  /* -mpcrel requires -mcmodel=medium, but we can't check TARGET_CMODEL until
+      after the subtarget override options are done.  */
+  if (TARGET_PCREL && TARGET_CMODEL != CMODEL_MEDIUM)
+    {
+      if ((rs6000_isa_flags_explicit & OPTION_MASK_PCREL) != 0)
+	error ("%qs requires %qs", "-mpcrel", "-mcmodel=medium");
+
+      rs6000_isa_flags &= ~OPTION_MASK_PCREL;
+    }
+
   if (TARGET_DEBUG_REG || TARGET_DEBUG_TARGET)
     rs6000_print_isa_options (stderr, 0, "after subtarget", rs6000_isa_flags);
 
@@ -7744,6 +7754,8 @@  create_TOC_reference (rtx symbol, rtx la
 {
   rtx tocrel, tocreg, hi;
 
+  gcc_assert (TARGET_TOC);
+
   if (TARGET_DEBUG_ADDR)
     {
       if (SYMBOL_REF_P (symbol))
@@ -23736,14 +23748,14 @@  rs6000_split_multireg_move (rtx dst, rtx
     }
 }
 
-static GTY(()) alias_set_type set = -1;
+static GTY(()) alias_set_type TOC_alias_set = -1;
 
 alias_set_type
 get_TOC_alias_set (void)
 {
-  if (set == -1)
-    set = new_alias_set ();
-  return set;
+  if (TOC_alias_set == -1)
+    TOC_alias_set = new_alias_set ();
+  return TOC_alias_set;
 }
 
 /* Return the internal arg pointer used for function incoming
Index: gcc/config/rs6000/rs6000.h
===================================================================
--- gcc/config/rs6000/rs6000.h	(revision 273457)
+++ gcc/config/rs6000/rs6000.h	(working copy)
@@ -54,6 +54,14 @@ 
 #define TARGET_AIX_OS 0
 #endif
 
+/* Turn off TOC support if pc-relative addressing is used.  However, do not
+   turn on TARGET_NO_TOC if we have pc-relative addressing.  The places that
+   check TARGET_NO_TOC are mostly for 32-bit ELF systems using elf_high and
+   elf_low, and we do not want to generate those instructions if we have
+   pc-relative support.  */
+#define TARGET_TOC    (TARGET_HAS_TOC && !TARGET_PCREL)
+#define TARGET_NO_TOC (!TARGET_HAS_TOC && !TARGET_PCREL)
+
 /* Control whether function entry points use a "dot" symbol when
    ABI_AIX.  */
 #define DOT_SYMBOLS 1
Index: gcc/config/rs6000/sysv4.h
===================================================================
--- gcc/config/rs6000/sysv4.h	(revision 273457)
+++ gcc/config/rs6000/sysv4.h	(working copy)
@@ -41,7 +41,7 @@ 
 #undef	ASM_DEFAULT_SPEC
 #define	ASM_DEFAULT_SPEC "-mppc"
 
-#define	TARGET_TOC		(TARGET_64BIT				\
+#define	TARGET_HAS_TOC		(TARGET_64BIT				\
 				 || (TARGET_MINIMAL_TOC			\
 				     && flag_pic > 1)			\
 				 || DEFAULT_ABI != ABI_V4)
@@ -50,7 +50,6 @@ 
 #define	TARGET_BIG_ENDIAN	(! TARGET_LITTLE_ENDIAN)
 #define	TARGET_PROTOTYPE	target_prototype
 #define	TARGET_NO_PROTOTYPE	(! TARGET_PROTOTYPE)
-#define	TARGET_NO_TOC		(! TARGET_TOC)
 #define	TARGET_NO_EABI		(! TARGET_EABI)
 #define	TARGET_REGNAMES		rs6000_regnames