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, §ion_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, §ion_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