[PATCH] Convert XCOFF ASM_DECLARE_FUNCTION_NAME to function

David Edelsohn dje.gcc@gmail.com
Tue Jun 24 18:45:00 GMT 2014


In preparation to fix the alias issues on AIX, this patch changes
ASM_DECLARE_FUNCTION_NAME from a macro to a function.

Bootstrap on powerpc-ibm-aix7.1.0.0 in progress.

        * config/rs6000/xcoff.h (ASM_DECLARE_FUNCTION_NAME): Remove definition
        and call...
        * config/rs6000/rs6000.c (rs6000_xcoff_declare_function_name): New
        function.
        * config/rs6000/rs6000-protos.h (rs6000_xcoff_declare_function_name):
        Declare.


Thanks, David
-------------- next part --------------
	* config/rs6000/xcoff.h (ASM_DECLARE_FUNCTION_NAME): Remove definition
	and call...
	* config/rs6000/rs6000.c (rs6000_xcoff_declare_function_name): New
	function.
	* config/rs6000/rs6000-protos.h (rs6000_xcoff_declare_function_name):
	Declare.

Index: rs6000-protos.h
===================================================================
--- rs6000-protos.h	(revision 211938)
+++ rs6000-protos.h	(working copy)
@@ -164,6 +164,7 @@
 extern rtx rs6000_va_arg (tree, tree);
 extern int function_ok_for_sibcall (tree);
 extern int rs6000_reg_parm_stack_space (tree, bool);
+extern void rs6000_xcoff_declare_function_name (FILE *, const char *, tree);
 extern void rs6000_elf_declare_function_name (FILE *, const char *, tree);
 extern bool rs6000_elf_in_small_data_p (const_tree);
 #ifdef ARGS_SIZE_RTX
Index: rs6000.c
===================================================================
--- rs6000.c	(revision 211938)
+++ rs6000.c	(working copy)
@@ -29452,6 +29452,71 @@
 	 asm_out_file);
 }
 
+/* This macro produces the initial definition of a function name.
+   On the RS/6000, we need to place an extra '.' in the function name and
+   output the function descriptor.
+   Dollar signs are converted to underscores.
+
+   The csect for the function will have already been created when
+   text_section was selected.  We do have to go back to that csect, however.
+
+   The third and fourth parameters to the .function pseudo-op (16 and 044)
+   are placeholders which no longer have any use.  */
+
+void
+rs6000_xcoff_declare_function_name (FILE *file, const char *name, tree decl)
+{
+  char *buffer = (char *) alloca (strlen (name) + 1);
+  char *p;
+  int dollar_inside = 0;
+  strcpy (buffer, name);
+  p = strchr (buffer, '$');
+  while (p) {
+    *p = '_';
+    dollar_inside++;
+    p = strchr (p + 1, '$');
+  }
+  if (TREE_PUBLIC (decl))
+    {
+      if (!RS6000_WEAK || !DECL_WEAK (decl))
+	{
+          if (dollar_inside) {
+              fprintf(file, "\t.rename .%s,\".%s\"\n", buffer, name);
+              fprintf(file, "\t.rename %s,\"%s\"\n", buffer, name);
+	    }
+	  fputs ("\t.globl .", file);
+	  RS6000_OUTPUT_BASENAME (file, buffer);
+	  putc ('\n', file);
+	}
+    }
+  else
+    {
+      if (dollar_inside) {
+          fprintf(file, "\t.rename .%s,\".%s\"\n", buffer, name);
+          fprintf(file, "\t.rename %s,\"%s\"\n", buffer, name);
+	}
+      fputs ("\t.lglobl .", file);
+      RS6000_OUTPUT_BASENAME (file, buffer);
+      putc ('\n', file);
+    }
+  fputs ("\t.csect ", file);
+  RS6000_OUTPUT_BASENAME (file, buffer);
+  fputs (TARGET_32BIT ? "[DS]\n" : "[DS],3\n", file);
+  RS6000_OUTPUT_BASENAME (file, buffer);
+  fputs (":\n", file);
+  fputs (TARGET_32BIT ? "\t.long ." : "\t.llong .", file);
+  RS6000_OUTPUT_BASENAME (file, buffer);
+  fputs (", TOC[tc0], 0\n", file);
+  in_section = NULL;
+  switch_to_section (function_section (decl));
+  putc ('.', file);
+  RS6000_OUTPUT_BASENAME (file, buffer);
+  fputs (":\n", file);
+  if (write_symbols != NO_DEBUG && !DECL_IGNORED_P (decl))
+    xcoffout_declare_function (file, decl, buffer);
+  return;
+}
+
 #ifdef HAVE_AS_TLS
 static void
 rs6000_xcoff_encode_section_info (tree decl, rtx rtl, int first)
Index: xcoff.h
===================================================================
--- xcoff.h	(revision 211938)
+++ xcoff.h	(working copy)
@@ -134,68 +134,12 @@
 #undef TARGET_ASM_FILE_START_FILE_DIRECTIVE
 #define TARGET_ASM_FILE_START_FILE_DIRECTIVE false
 
-/* This macro produces the initial definition of a function name.
-   On the RS/6000, we need to place an extra '.' in the function name and
-   output the function descriptor.
-   Dollar signs are converted to underscores.
+/* This macro produces the initial definition of a function name.  */
 
-   The csect for the function will have already been created when
-   text_section was selected.  We do have to go back to that csect, however.
+#undef ASM_DECLARE_FUNCTION_NAME
+#define ASM_DECLARE_FUNCTION_NAME(FILE, NAME, DECL)			\
+  rs6000_xcoff_declare_function_name ((FILE), (NAME), (DECL))
 
-   The third and fourth parameters to the .function pseudo-op (16 and 044)
-   are placeholders which no longer have any use.  */
-
-#define ASM_DECLARE_FUNCTION_NAME(FILE,NAME,DECL)		\
-{ char *buffer = (char *) alloca (strlen (NAME) + 1);		\
-  char *p;							\
-  int dollar_inside = 0;					\
-  strcpy (buffer, NAME);					\
-  p = strchr (buffer, '$');					\
-  while (p) {							\
-    *p = '_';							\
-    dollar_inside++;						\
-    p = strchr (p + 1, '$');					\
-  }								\
-  if (TREE_PUBLIC (DECL))					\
-    {								\
-      if (!RS6000_WEAK || !DECL_WEAK (decl))			\
-	{							\
-          if (dollar_inside) {					\
-              fprintf(FILE, "\t.rename .%s,\".%s\"\n", buffer, NAME);	\
-              fprintf(FILE, "\t.rename %s,\"%s\"\n", buffer, NAME);	\
-	    }							\
-	  fputs ("\t.globl .", FILE);				\
-	  RS6000_OUTPUT_BASENAME (FILE, buffer);		\
-	  putc ('\n', FILE);					\
-	}							\
-    }								\
-  else								\
-    {								\
-      if (dollar_inside) {					\
-          fprintf(FILE, "\t.rename .%s,\".%s\"\n", buffer, NAME);	\
-          fprintf(FILE, "\t.rename %s,\"%s\"\n", buffer, NAME);	\
-	}							\
-      fputs ("\t.lglobl .", FILE);				\
-      RS6000_OUTPUT_BASENAME (FILE, buffer);			\
-      putc ('\n', FILE);					\
-    }								\
-  fputs ("\t.csect ", FILE);					\
-  RS6000_OUTPUT_BASENAME (FILE, buffer);			\
-  fputs (TARGET_32BIT ? "[DS]\n" : "[DS],3\n", FILE);		\
-  RS6000_OUTPUT_BASENAME (FILE, buffer);			\
-  fputs (":\n", FILE);						\
-  fputs (TARGET_32BIT ? "\t.long ." : "\t.llong .", FILE);	\
-  RS6000_OUTPUT_BASENAME (FILE, buffer);			\
-  fputs (", TOC[tc0], 0\n", FILE);				\
-  in_section = NULL;						\
-  switch_to_section (function_section (DECL));			\
-  putc ('.', FILE);						\
-  RS6000_OUTPUT_BASENAME (FILE, buffer);			\
-  fputs (":\n", FILE);						\
-  if (write_symbols != NO_DEBUG && !DECL_IGNORED_P (DECL))	\
-    xcoffout_declare_function (FILE, DECL, buffer);		\
-}
-
 /* Output a reference to SYM on FILE.  */
 
 #define ASM_OUTPUT_SYMBOL_REF(FILE, SYM) \


More information about the Gcc-patches mailing list