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]

Re: 3.4 PATCH: Provide target hook for ASM_OUTPUT_EXTERNAL_LIBCALL


Richard Henderson writes:

> On Wed, Sep 17, 2003 at 09:25:52PM +0200, Rainer Orth wrote:
> > * ASM_OUTPUT_EXTERNAL_LIBCALL is only called once in varasm.c with
> >   asm_out_file as first arg.  Since this is fixed, it might be useful to
> >   remove the FILE * arg from the target function and always provide it in
> >   targhooks.c (default_external_libcall)?
> 
> Please.  I much prefer that the target hooks don't pass FILE*,
> but always output to asm_output_file.

Done.

> > * This new target function still needs to be documented.  How should this
> >   be done while both ASM_OUTPUT_EXTERNAL_LIBCALL and
> >   TARGET_ASM_EXTERNAL_LIBCALL exist?  At least the former should be marked
> >   as deprecated.
> 
> Don't know.

I've followed DJ's lead when he introduced the original targhooks patch and
completely replaced the old description with the new one.

> Patch is ok.  You don't actually have a tm.texi fragment.

I know: it was actually a placeholder to remind me to write one when the
other questions were resolved.

Here's that patch I've checked in, after two other bootstraps on
mips-sgi-irix6.5 (both with and without gas), together with my other O32
integration patches.

	Rainer

-----------------------------------------------------------------------------
Rainer Orth, Faculty of Technology, Bielefeld University


2003-09-23  Rainer Orth  <ro@TechFak.Uni-Bielefeld.DE>

	* target.h (struct gcc_target): New member external_libcall.
	* target-def.h (TARGET_ASM_EXTERNAL_LIBCALL): Provide default.
	(TARGET_ASM_OUT): Use it.
	* doc/tm.texi (TARGET_ASM_EXTERNAL_LIBCALL): Document.
	* targhooks.c: Convert to ISO C 90.
	(default_external_libcall): New function.
	* targhooks.h (default_external_libcall): Declare.
	* varasm.c (assemble_external_libcall): Use
	targetm.asm_out.external_libcall instead of
	ASM_OUTPUT_EXTERNAL_LIBCALL.
	* config/mips/mips-protos.h [TARGET_IRIX5 || TARGET_IRIX 6]
	(mips_output_external_libcall): Declare.
	* config/mips/mips.c (mips_output_external_libcall): Change
	definition guard.
	Change to match TARGET_ASM_EXTERNAL_LIBCALL.
	Only operate for O32 ABI.
	* config/mips/iris5.h (TARGET_ASM_EXTERNAL_LIBCALL): Define
	instead of ASM_OUTPUT_EXTERNAL_LIBCALL.
	* config/mips/iris6.h (ASM_OUTPUT_EXTERNAL_LIBCALL): Don't undef,
	superceded by TARGET_ASM_EXTERNAL_LIBCALL.

Index: target-def.h
===================================================================
RCS file: /cvs/gcc/gcc/gcc/target-def.h,v
retrieving revision 1.55
diff -u -p -r1.55 target-def.h
--- target-def.h	4 Sep 2003 03:17:51 -0000	1.55
+++ target-def.h	23 Sep 2003 19:16:08 -0000
@@ -166,6 +166,10 @@ Foundation, 59 Temple Place - Suite 330,
 #define TARGET_ASM_FILE_START_FILE_DIRECTIVE false
 #endif
 
+#ifndef TARGET_ASM_EXTERNAL_LIBCALL
+#define TARGET_ASM_EXTERNAL_LIBCALL default_external_libcall
+#endif
+
 #define TARGET_ASM_ALIGNED_INT_OP				\
 		       {TARGET_ASM_ALIGNED_HI_OP,		\
 			TARGET_ASM_ALIGNED_SI_OP,		\
@@ -202,7 +206,8 @@ Foundation, 59 Temple Place - Suite 330,
                         TARGET_ASM_OUTPUT_MI_THUNK,             \
                         TARGET_ASM_CAN_OUTPUT_MI_THUNK,         \
                         TARGET_ASM_FILE_START,                  \
-                        TARGET_ASM_FILE_END}
+                        TARGET_ASM_FILE_END,			\
+			TARGET_ASM_EXTERNAL_LIBCALL}
 
 /* Scheduler hooks.  All of these default to null pointers, which
    haifa-sched.c looks for and handles.  */
Index: target.h
===================================================================
RCS file: /cvs/gcc/gcc/gcc/target.h,v
retrieving revision 1.62
diff -u -p -r1.62 target.h
--- target.h	4 Sep 2003 03:17:51 -0000	1.62
+++ target.h	23 Sep 2003 19:16:08 -0000
@@ -148,6 +148,10 @@ struct gcc_target
     /* Output any boilerplate text needed at the end of a
        translation unit.  */
     void (*file_end) (void);
+
+    /* Output an assembler pseudo-op to declare a library function name
+       external.  */
+    void (*external_libcall) (rtx);
   } asm_out;
 
   /* Functions relating to instruction scheduling.  */
Index: targhooks.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/targhooks.c,v
retrieving revision 2.5
diff -u -p -r2.5 targhooks.c
--- targhooks.c	5 Sep 2003 02:12:29 -0000	2.5
+++ targhooks.c	23 Sep 2003 19:16:08 -0000
@@ -61,9 +61,16 @@ Software Foundation, 59 Temple Place - S
 #include "tm_p.h"
 #include "target-def.h"
 
+void
+default_external_libcall (rtx fun ATTRIBUTE_UNUSED)
+{
+#ifdef ASM_OUTPUT_EXTERNAL_LIBCALL
+  ASM_OUTPUT_EXTERNAL_LIBCALL(asm_out_file, fun);
+#endif
+}
+
 bool
-default_promote_function_args (fntype)
-     tree fntype ATTRIBUTE_UNUSED;
+default_promote_function_args (tree fntype ATTRIBUTE_UNUSED)
 {
 #ifdef PROMOTE_FUNCTION_ARGS
   return true;
@@ -73,8 +80,7 @@ default_promote_function_args (fntype)
 }
 
 bool
-default_promote_function_return (fntype)
-     tree fntype ATTRIBUTE_UNUSED;
+default_promote_function_return (tree fntype ATTRIBUTE_UNUSED)
 {
 #ifdef PROMOTE_FUNCTION_RETURN
   return true;
@@ -84,8 +90,7 @@ default_promote_function_return (fntype)
 }
 
 bool
-default_promote_prototypes (fntype)
-     tree fntype ATTRIBUTE_UNUSED;
+default_promote_prototypes (tree fntype ATTRIBUTE_UNUSED)
 {
   if (PROMOTE_PROTOTYPES)
     return true;
Index: targhooks.h
===================================================================
RCS file: /cvs/gcc/gcc/gcc/targhooks.h,v
retrieving revision 2.1
diff -u -p -r2.1 targhooks.h
--- targhooks.h	4 Sep 2003 03:17:51 -0000	2.1
+++ targhooks.h	23 Sep 2003 19:16:08 -0000
@@ -18,6 +18,8 @@ along with GCC; see the file COPYING.  I
 Software Foundation, 59 Temple Place - Suite 330, Boston, MA
 02111-1307, USA.  */
 
+extern void default_external_libcall (rtx);
+
 extern bool default_promote_function_args (tree);
 extern bool default_promote_function_return (tree);
 extern bool default_promote_prototypes (tree);
Index: varasm.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/varasm.c,v
retrieving revision 1.384
diff -u -p -r1.384 varasm.c
--- varasm.c	21 Sep 2003 05:07:10 -0000	1.384
+++ varasm.c	23 Sep 2003 19:16:09 -0000
@@ -1621,16 +1621,14 @@ assemble_external (tree decl ATTRIBUTE_U
 /* Similar, for calling a library function FUN.  */
 
 void
-assemble_external_libcall (rtx fun ATTRIBUTE_UNUSED)
+assemble_external_libcall (rtx fun)
 {
-#ifdef ASM_OUTPUT_EXTERNAL_LIBCALL
   /* Declare library function name external when first used, if nec.  */
   if (! SYMBOL_REF_USED (fun))
     {
       SYMBOL_REF_USED (fun) = 1;
-      ASM_OUTPUT_EXTERNAL_LIBCALL (asm_out_file, fun);
+      (*targetm.asm_out.external_libcall) (fun);
     }
-#endif
 }
 
 /* Assemble a label named NAME.  */
Index: config/mips/iris5.h
===================================================================
RCS file: /cvs/gcc/gcc/gcc/config/mips/iris5.h,v
retrieving revision 1.21
diff -u -p -r1.21 iris5.h
--- config/mips/iris5.h	17 Sep 2003 17:40:05 -0000	1.21
+++ config/mips/iris5.h	23 Sep 2003 19:16:09 -0000
@@ -215,8 +215,8 @@ do {						\
 } while (0)
 
 /* Also do this for libcalls.  */
-#define ASM_OUTPUT_EXTERNAL_LIBCALL(FILE, FUN)	\
-  mips_output_external_libcall (FILE, XSTR (FUN, 0))
+#undef TARGET_ASM_EXTERNAL_LIBCALL
+#define TARGET_ASM_EXTERNAL_LIBCALL mips_output_external_libcall
 
 /* This does for functions what ASM_DECLARE_OBJECT_NAME does for variables.
    This is used indirectly by ASM_OUTPUT_EXTERNAL.  */
Index: config/mips/iris6.h
===================================================================
RCS file: /cvs/gcc/gcc/gcc/config/mips/iris6.h,v
retrieving revision 1.67
diff -u -p -r1.67 iris6.h
--- config/mips/iris6.h	12 Aug 2003 20:50:29 -0000	1.67
+++ config/mips/iris6.h	23 Sep 2003 19:16:09 -0000
@@ -178,7 +178,6 @@ Boston, MA 02111-1307, USA.  */
 /* IRIX 5 stuff that we don't need for IRIX 6.  */
 /* ??? We do need this for the -mabi=32 switch though.  */
 #undef ASM_OUTPUT_UNDEF_FUNCTION
-#undef ASM_OUTPUT_EXTERNAL_LIBCALL
 #undef ASM_DECLARE_FUNCTION_SIZE
 
 /* Stuff we need for IRIX 6 that isn't in IRIX 5.  */
Index: config/mips/mips-protos.h
===================================================================
RCS file: /cvs/gcc/gcc/gcc/config/mips/mips-protos.h,v
retrieving revision 1.49
diff -u -p -r1.49 mips-protos.h
--- config/mips/mips-protos.h	27 Aug 2003 07:05:17 -0000	1.49
+++ config/mips/mips-protos.h	23 Sep 2003 19:16:09 -0000
@@ -1,6 +1,6 @@
 /* Prototypes of target machine for GNU compiler.  MIPS version.
    Copyright (C) 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
-   1999, 2001, 2002 Free Software Foundation, Inc.
+   1999, 2001, 2002, 2003 Free Software Foundation, Inc.
    Contributed by A. Lichnewsky (lich@inria.inria.fr).
    Changed by Michael Meissner	(meissner@osf.org).
    64 bit r4000 support by Ian Lance Taylor (ian@cygnus.com) and
@@ -98,8 +98,8 @@ extern HOST_WIDE_INT mips_debugger_offse
 extern void print_operand (FILE *, rtx, int);
 extern void print_operand_address (FILE *, rtx);
 extern int mips_output_external (FILE *, tree, const char *);
-#ifdef ASM_OUTPUT_UNDEF_FUNCTION
-extern int mips_output_external_libcall (FILE *, const char *);
+#if TARGET_IRIX5 || TARGET_IRIX6
+extern void mips_output_external_libcall (rtx);
 #endif
 extern void mips_output_filename (FILE *, const char *);
 extern void mips_output_lineno (FILE *, int);
Index: config/mips/mips.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/config/mips/mips.c,v
retrieving revision 1.311
diff -u -p -r1.311 mips.c
--- config/mips/mips.c	22 Sep 2003 05:09:21 -0000	1.311
+++ config/mips/mips.c	23 Sep 2003 19:16:10 -0000
@@ -5517,19 +5517,20 @@ mips_output_external (FILE *file ATTRIBU
   return 0;
 }
 
-#ifdef ASM_OUTPUT_UNDEF_FUNCTION
-int
-mips_output_external_libcall (FILE *file ATTRIBUTE_UNUSED, const char *name)
+#if TARGET_IRIX5 || TARGET_IRIX6
+void
+mips_output_external_libcall (rtx fun)
 {
   register struct extern_list *p;
 
-  p = (struct extern_list *) ggc_alloc (sizeof (struct extern_list));
-  p->next = extern_head;
-  p->name = name;
-  p->size = -1;
-  extern_head = p;
-
-  return 0;
+  if (mips_abi == ABI_32)
+    {
+      p = (struct extern_list *) ggc_alloc (sizeof (struct extern_list));
+      p->next = extern_head;
+      p->name = XSTR (fun, 0);
+      p->size = -1;
+      extern_head = p;
+    }
 }
 #endif
 
Index: doc/tm.texi
===================================================================
RCS file: /cvs/gcc/gcc/gcc/doc/tm.texi,v
retrieving revision 1.255
diff -u -p -r1.255 tm.texi
--- doc/tm.texi	4 Sep 2003 03:18:03 -0000	1.255
+++ doc/tm.texi	23 Sep 2003 19:16:11 -0000
@@ -6729,15 +6729,11 @@ This macro need not be defined if it doe
 The GNU assembler and most Unix assemblers don't require anything.
 @end defmac
 
-@defmac ASM_OUTPUT_EXTERNAL_LIBCALL (@var{stream}, @var{symref})
-A C statement (sans semicolon) to output on @var{stream} an assembler
+@deftypefn {Target Hook} void TARGET_ASM_EXTERNAL_LIBCALL (rtx @var{symref})
+This target hook is a function to output to @var{asm_out_file} an assembler
 pseudo-op to declare a library function name external.  The name of the
-library function is given by @var{symref}, which has type @code{rtx} and
-is a @code{symbol_ref}.
-
-This macro need not be defined if it does not need to output anything.
-The GNU assembler and most Unix assemblers don't require anything.
-@end defmac
+library function is given by @var{symref}, which is a @code{symbol_ref}.
+@end deftypefn
 
 @defmac ASM_OUTPUT_LABELREF (@var{stream}, @var{name})
 A C statement (sans semicolon) to output to the stdio stream


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