PATCH: Enable comdat group

H. J. Lu hjl@lucon.org
Tue Aug 17 15:38:00 GMT 2004


This patch enables comdat group if the assembler supports it.



H.J.
-------------- next part --------------
2004-08-12  H.J. Lu  <hongjiu.lu@intel.com>

	* configure.ac: Check if assembler supports COMDAT group. 
	* configure: Regenerated.
	* config.in: Likewise.

	* output.h (elf_comdat_group): New.

	* varasm.c (elf_comdat_group): New.
	(default_elf_asm_named_section): Use COMDAT group if
	HAVE_GAS_COMDAT_GROUP is defined.
	* config/arm/arm.c (arm_elf_asm_named_section): Likewise.

	* config/sparc/sysv4.h (TARGET_ASM_NAMED_SECTION): Define only
	if HAVE_GAS_COMDAT_GROUP is not defined.

--- gcc/config.in.comdat	2004-07-28 12:13:17.000000000 -0700
+++ gcc/config.in	2004-08-12 08:33:58.212918815 -0700
@@ -284,6 +284,9 @@
 /* Define if your assembler supports .balign and .p2align. */
 #undef HAVE_GAS_BALIGN_AND_P2ALIGN
 
+/* Define 0/1 if your assembler supports COMDAT group. */
+#undef HAVE_GAS_COMDAT_GROUP
+
 /* Define if your assembler uses the new HImode fild and fist notation. */
 #undef HAVE_GAS_FILDS_FISTS
 
--- gcc/config/arm/arm.c.comdat	2004-08-11 14:20:22.000000000 -0700
+++ gcc/config/arm/arm.c	2004-08-12 08:33:58.248914154 -0700
@@ -14283,12 +14283,15 @@ static void
 arm_elf_asm_named_section (const char *name, unsigned int flags)
 {
   char flagchars[10], *f = flagchars;
+  const char *section_name = NULL, *group_name = NULL;
 
+#ifndef HAVE_GAS_COMDAT_GROUP
   if (! named_section_first_declaration (name))
     {
       fprintf (asm_out_file, "\t.section\t%s\n", name);
       return;
     }
+#endif
 
   if (!(flags & SECTION_DEBUG))
     *f++ = 'a';
@@ -14304,9 +14307,17 @@ arm_elf_asm_named_section (const char *n
     *f++ = 'S';
   if (flags & SECTION_TLS)
     *f++ = 'T';
+#ifdef HAVE_GAS_COMDAT_GROUP
+  if (elf_comdat_group (name, &section_name, &group_name))
+    *f++ = 'G';
+#endif
   *f = '\0';
 
-  fprintf (asm_out_file, "\t.section\t%s,\"%s\"", name, flagchars);
+  if (section_name)
+    fprintf (asm_out_file, "\t.section\t%s,\"%s\"", section_name,
+	     flagchars);
+  else
+    fprintf (asm_out_file, "\t.section\t%s,\"%s\"", name, flagchars);
 
   if (!(flags & SECTION_NOTYPE))
     {
@@ -14323,6 +14334,9 @@ arm_elf_asm_named_section (const char *n
 	fprintf (asm_out_file, ",%d", flags & SECTION_ENTSIZE);
     }
 
+  if (group_name)
+    fprintf (asm_out_file, ",%s,comdat", group_name);
+
   putc ('\n', asm_out_file);
 }
 #endif
--- gcc/config/sparc/sysv4.h.comdat	2003-06-17 17:03:32.000000000 -0700
+++ gcc/config/sparc/sysv4.h	2004-08-12 08:33:58.264912083 -0700
@@ -150,9 +150,13 @@ do { ASM_OUTPUT_ALIGN ((FILE), Pmode == 
 #undef DTORS_SECTION_ASM_OP
 #define DTORS_SECTION_ASM_OP    "\t.section\t\".dtors\",#alloc,#write"
 
+/* COMDAT group cannot be expressed in SPARC's section attributes
+   encoding style.  */
+#ifndef HAVE_GAS_COMDAT_GROUP
 /* Switch into a generic section.  */
 #undef TARGET_ASM_NAMED_SECTION
 #define TARGET_ASM_NAMED_SECTION  sparc_elf_asm_named_section
+#endif
 
 #undef ASM_OUTPUT_ALIGNED_BSS
 #define ASM_OUTPUT_ALIGNED_BSS(FILE, DECL, NAME, SIZE, ALIGN) \
--- gcc/configure.ac.comdat	2004-08-12 08:33:57.765976682 -0700
+++ gcc/configure.ac	2004-08-12 08:33:58.268911565 -0700
@@ -2220,6 +2220,13 @@ AC_DEFINE_UNQUOTED(HAVE_GAS_SHF_MERGE,
   [`if test $gcc_cv_as_shf_merge = yes; then echo 1; else echo 0; fi`],
 [Define 0/1 if your assembler supports marking sections with SHF_MERGE flag.])
 
+gcc_GAS_CHECK_FEATURE(COMDAT group support, gcc_cv_as_comdat_group,
+ [elf,2,15,91], [--fatal-warnings],
+ [.section .text,"axG",@progbits,.foo,comdat])
+AC_DEFINE_UNQUOTED(HAVE_GAS_COMDAT_GROUP,
+  [`if test $gcc_cv_as_comdat_group = yes; then echo 1; else echo 0; fi`],
+[Define 0/1 if your assembler supports COMDAT group.])
+
 # Thread-local storage - the check is heavily parametrized.
 conftest_s=
 tls_first_major=
--- gcc/output.h.comdat	2004-08-12 08:30:35.000000000 -0700
+++ gcc/output.h	2004-08-12 08:38:24.381457030 -0700
@@ -476,6 +476,8 @@ extern void no_asm_to_stream (FILE *);
 #define SECTION_NOTYPE	 0x80000	/* don't output @progbits */
 #define SECTION_MACH_DEP 0x100000	/* subsequent bits reserved for target */
 
+extern const char *elf_comdat_group (const char *, const char **,
+				     const char **);
 extern unsigned int get_named_section_flags (const char *);
 extern bool set_named_section_flags (const char *, unsigned int);
 extern void named_section_flags (const char *, unsigned int);
--- gcc/varasm.c.comdat	2004-08-12 08:30:36.000000000 -0700
+++ gcc/varasm.c	2004-08-12 08:38:13.029926753 -0700
@@ -4535,16 +4535,97 @@ default_no_named_section (const char *na
   abort ();
 }
 
+/* Extract section name and group name from the linkonce section
+   name.  */
+
+const char *
+elf_comdat_group (const char *name, const char **section,
+		  const char **group)
+{
+  const char *p;
+  const char *sec = NULL;
+  static const char *one [] = 
+    {
+      ".bss",		/* 'b'  */
+      NULL,		/* 'c'  */
+      ".data",		/* 'd'  */
+      NULL,		/* 'e'  */
+      NULL,		/* 'f'  */
+      NULL,		/* 'q'  */
+      NULL,		/* 'h'  */
+      NULL,		/* 'i'  */
+      NULL,		/* 'j'  */
+      NULL,		/* 'k'  */
+      NULL,		/* 'l'  */
+      NULL,		/* 'm'  */
+      NULL,		/* 'n'  */
+      NULL,		/* 'o'  */
+      NULL,		/* 'p'  */
+      NULL,		/* 'q'  */
+      ".rodata",	/* 'r'  */
+      ".sdata",		/* 's'  */
+      ".text"		/* 't'  */
+    };
+  
+  if (strncmp (name, ".gnu.linkonce.", 14) != 0)
+    return sec;
+
+  p = name + 14;
+  if (p [1] == '.')
+    {
+      if (p [0] > 'a' && p [0] < 'u')
+	sec = one [p [0] - 'b'];
+
+      if (sec)
+	*group = p + 1;
+    }
+  else if (p [2] == '.')
+    {
+      if (p [0] == 's')
+	{
+	  if (p [1] == '2')
+	    sec = ".sdata2";
+	  else if (p [1] == 'b')
+	    sec = ".sbss";
+	}
+      else if (p [0] == 't')
+	{
+	  if (p [1] == 'b')
+	    sec = ".tbss";
+	  else if (p [1] == 'd')
+	    sec = ".tdata";
+	}
+      else if (p [0] == 'w' && p [1] == 'i')
+	sec = ".debug_info";
+
+      if (sec)
+	*group = p + 2;
+    }
+  else if (strncmp (p, "sb2.", 4) == 0)
+    {
+      sec = ".sbss2";
+      *group = p + 3;
+    }
+
+  if (sec)
+    *section = sec;
+
+  return sec;
+}
+
 void
 default_elf_asm_named_section (const char *name, unsigned int flags)
 {
   char flagchars[10], *f = flagchars;
+  const char *section_name = NULL, *group_name = NULL;
 
+#ifndef HAVE_GAS_COMDAT_GROUP
   if (! named_section_first_declaration (name))
     {
       fprintf (asm_out_file, "\t.section\t%s\n", name);
       return;
     }
+#endif
 
   if (!(flags & SECTION_DEBUG))
     *f++ = 'a';
@@ -4560,9 +4641,17 @@ default_elf_asm_named_section (const cha
     *f++ = 'S';
   if (flags & SECTION_TLS)
     *f++ = 'T';
+#ifdef HAVE_GAS_COMDAT_GROUP
+  if (elf_comdat_group (name, &section_name, &group_name))
+    *f++ = 'G';
+#endif
   *f = '\0';
 
-  fprintf (asm_out_file, "\t.section\t%s,\"%s\"", name, flagchars);
+  if (section_name)
+    fprintf (asm_out_file, "\t.section\t%s,\"%s\"", section_name,
+	     flagchars);
+  else
+    fprintf (asm_out_file, "\t.section\t%s,\"%s\"", name, flagchars);
 
   if (!(flags & SECTION_NOTYPE))
     {
@@ -4579,6 +4668,9 @@ default_elf_asm_named_section (const cha
 	fprintf (asm_out_file, ",%d", flags & SECTION_ENTSIZE);
     }
 
+  if (group_name)
+    fprintf (asm_out_file, ",%s,comdat", group_name);
+
   putc ('\n', asm_out_file);
 }
 


More information about the Gcc-patches mailing list