From: Jan Hubicka <jh@suse.cz>
To: Jan Hubicka <jh@suse.cz>
Cc: Lubos Lunak <l.lunak@sh.cvut.cz>,
rth@cygnus.com, Jakub Jelinek <jakub@redhat.com>,
gcc-patches@gcc.gnu.org, patches@x86-64.org
Subject: Re: [patches] Re: KDE a gcc
Date: Fri, 02 Nov 2001 12:23:00 -0000 [thread overview]
Message-ID: <20011112155951.K8833@atrey.karlin.mff.cuni.cz> (raw)
In-Reply-To: <20011112155258.H8833@atrey.karlin.mff.cuni.cz>
> Hi,
> this patch implements idea described in:
> > http://dforce.sh.cvut.cz/~seli/en/linking2/#data_segment
>
> basically in KDE/QT applications there is lots of pregenerated data that is
> read only, but in PIC compilation it isn't because of dynamic linking. This
> code is intermixed with other readwrite data then. With prelinking this is a
> waste, as the pregenereated data is really readonly so it should be put
> together and without it is waste too, as dynamic linker needs to COW much more
> pages.
>
> This patch adds two new sections. .data.rel is used for read/write data that
> contains relocations (so it will be COWed on startup in case no prelinking is
> done) and .data.rel.ro contains read/only data with relocations that are
> read-only for prelinking and COWed on startup.
>
> Lubos measured about 60Kb saving on simple QT application requiring about 500Kb
> resources with the prelinking. He estimates savings for KDE application to
> about 200Kb. I made simple test with sartup time on the c++ library from
> crystal space w/o prelinking and got about 6% savings in startup time too.
>
> Note that I am not quite sure whether .data.rel / .data.rel.ro are handled as
> .data subsections on all systems. The patch uses the named sections by
> default, but allows to define new opcodes for that too, hope it is flexible
> enought and will not bring considerable compatibility issues.
>
> Honza
Oops, forgot the patch :)
Bootstrapped/regtested i686
Wed Oct 31 17:44:53 CET 2001 Jan Hubicka <jh@susue.cz>
* output.h (data_rel_section, data_rel_ro_section): Declare.
* varasm.c (in_section): Add in_data_rel and in_data_rel_ro.
(default_exception_section): Use data_rel_ro_section.
(output_constant_def_components): Likewise.
* elfos.h (SELECT_SECTION): Use data_rel_section
and data_rel_ro_section for relocatable insns.
* tm.texi (DATA_REL_SECTION_OP, DATA_REL_RO_SECTION_OP):
document.
Index: output.h
===================================================================
RCS file: /cvs/gcc/egcs/gcc/output.h,v
retrieving revision 1.87
diff -c -3 -p -r1.87 output.h
*** output.h 2001/11/04 02:47:36 1.87
--- output.h 2001/11/12 14:42:05
*************** extern void text_section PARAMS ((void)
*** 156,161 ****
--- 156,174 ----
/* Tell assembler to switch to data section. */
extern void data_section PARAMS ((void));
+ /* Tell assembler to switch to data_rel section.
+ This section contains data that needs dynamic linking.
+ If there is no dedicated section for this purpose, data
+ section is used. */
+
+ extern void data_rel_section PARAMS ((void));
+
+ /* Like data_rel_section, but data_rel_ro section is used
+ for data needing dynamic linking but read only otherwise.
+ These data are read only with prelinking. */
+
+ extern void data_rel_ro_section PARAMS ((void));
+
/* Tell assembler to make sure its in the data section. */
extern void force_data_section PARAMS ((void));
Index: varasm.c
===================================================================
RCS file: /cvs/gcc/egcs/gcc/varasm.c,v
retrieving revision 1.226
diff -c -3 -p -r1.226 varasm.c
*** varasm.c 2001/11/11 05:56:36 1.226
--- varasm.c 2001/11/12 14:42:06
*************** static void const_str_htab_del PARAMS (
*** 193,199 ****
static void asm_emit_uninitialised PARAMS ((tree, const char*, int, int));
static void resolve_unique_section PARAMS ((tree, int));
\f
! static enum in_section { no_section, in_text, in_data, in_named
#ifdef BSS_SECTION_ASM_OP
, in_bss
#endif
--- 193,200 ----
static void asm_emit_uninitialised PARAMS ((tree, const char*, int, int));
static void resolve_unique_section PARAMS ((tree, int));
\f
! static enum in_section { no_section, in_text, in_data, in_named, in_data_rel,
! in_data_rel_ro
#ifdef BSS_SECTION_ASM_OP
, in_bss
#endif
*************** data_section ()
*** 271,276 ****
--- 272,334 ----
in_section = in_data;
}
}
+
+ /* Tell assembler to switch to data_rel section.
+ This section contains data that needs dynamic linking.
+ If there is no dedicated section for this purpose, data
+ section is used. */
+
+ void
+ data_rel_section ()
+ {
+ if (in_section == in_data_rel)
+ ;
+ else if (flag_shared_data || !flag_pic)
+ data_section ();
+ #ifdef DATA_REL_SECTION_ASM_OP
+ else
+ {
+ fprintf (asm_out_file, "%s\n", DATA_REL_SECTION_ASM_OP);
+ in_section = in_data_rel;
+ }
+ #else
+ else if (targetm.have_named_sections)
+ {
+ named_section (NULL_TREE, ".data.rel", 0);
+ in_section = in_data_rel;
+ }
+ else
+ data_section ();
+ #endif
+ }
+
+ /* Like data_rel_section, but data_rel_ro section is used
+ for data needing dynamic linking but read only otherwise.
+ These data are read only with prelinking. */
+
+ void
+ data_rel_ro_section ()
+ {
+ if (in_section == in_data_rel_ro)
+ ;
+ else if (!flag_pic)
+ readonly_data_section ();
+ #ifdef DATA_REL_RO_SECTION_ASM_OP
+ else
+ {
+ fprintf (asm_out_file, "%s\n", DATA_REL_RO_SECTION_ASM_OP);
+ in_section = in_data_rel_ro;
+ }
+ #else
+ else if (targetm.have_named_sections)
+ {
+ named_section (NULL_TREE, ".data.rel.ro", 0);
+ in_section = in_data_rel_ro;
+ }
+ else
+ data_rel_section ();
+ #endif
+ }
/* Tell assembler to ALWAYS switch to data section, in case
it's not sure where it is. */
*************** default_exception_section ()
*** 614,620 ****
if (targetm.have_named_sections)
named_section (NULL_TREE, ".gcc_except_table", 0);
else if (flag_pic)
! data_section ();
else
readonly_data_section ();
}
--- 672,678 ----
if (targetm.have_named_sections)
named_section (NULL_TREE, ".gcc_except_table", 0);
else if (flag_pic)
! data_rel_ro_section ();
else
readonly_data_section ();
}
*************** output_constant_def_contents (exp, reloc
*** 3454,3462 ****
#ifdef SELECT_SECTION
SELECT_SECTION (exp, reloc, align);
#else
! if (((TREE_CODE (exp) == STRING_CST) && flag_writable_strings)
! || (flag_pic && reloc))
data_section ();
else
readonly_data_section ();
#endif
--- 3512,3521 ----
#ifdef SELECT_SECTION
SELECT_SECTION (exp, reloc, align);
#else
! if ((TREE_CODE (exp) == STRING_CST) && flag_writable_strings)
data_section ();
+ else if (flag_pic && reloc)
+ data_rel_ro_section ();
else
readonly_data_section ();
#endif
Index: config/elfos.h
===================================================================
RCS file: /cvs/gcc/egcs/gcc/config/elfos.h,v
retrieving revision 1.36
diff -c -3 -p -r1.36 elfos.h
*** elfos.h 2001/11/11 05:56:38 1.36
--- elfos.h 2001/11/12 14:42:07
*************** const_section () \
*** 377,388 ****
} \
else if (TREE_CODE (DECL) == VAR_DECL) \
{ \
! if ((flag_pic && RELOC) \
! || !TREE_READONLY (DECL) || TREE_SIDE_EFFECTS (DECL) \
|| !DECL_INITIAL (DECL) \
|| (DECL_INITIAL (DECL) != error_mark_node \
&& !TREE_CONSTANT (DECL_INITIAL (DECL)))) \
! data_section (); \
else if (flag_merge_constants < 2) \
/* C and C++ don't allow different variables to share \
the same location. -fmerge-all-constants allows \
--- 377,394 ----
} \
else if (TREE_CODE (DECL) == VAR_DECL) \
{ \
! if (!TREE_READONLY (DECL) || TREE_SIDE_EFFECTS (DECL) \
|| !DECL_INITIAL (DECL) \
|| (DECL_INITIAL (DECL) != error_mark_node \
&& !TREE_CONSTANT (DECL_INITIAL (DECL)))) \
! { \
! if (flag_pic && RELOC) \
! data_rel_section (); \
! else \
! data_section (); \
! } \
! else if (flag_pic && RELOC) \
! data_rel_ro_section (); \
else if (flag_merge_constants < 2) \
/* C and C++ don't allow different variables to share \
the same location. -fmerge-all-constants allows \
Index: doc/tm.texi
===================================================================
RCS file: /cvs/gcc/egcs/gcc/doc/tm.texi,v
retrieving revision 1.69
diff -c -3 -p -r1.69 tm.texi
*** tm.texi 2001/11/10 21:44:52 1.69
--- tm.texi 2001/11/12 14:42:09
*************** A C expression whose value is a string,
*** 5579,5584 ****
--- 5579,5600 ----
assembler operation to identify the following data as writable initialized
data. Normally @code{"\t.data"} is right.
+ @findex DATA_REL_SECTION_ASM_OP
+ @item DATA_REL_SECTION_ASM_OP
+ A C expression whose value is a string, including spacing, containing the
+ assembler operation to identify the following data as writable initialized
+ data that do need dynamic linking.
+ Used only in PIC compilation and if not present, data section is used
+ instead.
+
+ @findex DATA_REL_RO_SECTION_ASM_OP
+ @item DATA_REL_RO_SECTION_ASM_OP
+ A C expression whose value is a string, including spacing, containing the
+ assembler operation to identify the following data as read only initialized
+ data that do need dynamic linking.
+ Used only in PIC compilation and if not present, data section is used
+ instead.
+
@findex SHARED_SECTION_ASM_OP
@item SHARED_SECTION_ASM_OP
If defined, a C expression whose value is a string, including spacing,
WARNING: multiple messages have this Message-ID
From: Jan Hubicka <jh@suse.cz>
To: Jan Hubicka <jh@suse.cz>
Cc: Lubos Lunak <l.lunak@sh.cvut.cz>,
rth@cygnus.com, Jakub Jelinek <jakub@redhat.com>,
gcc-patches@gcc.gnu.org, patches@x86-64.org
Subject: Re: [patches] Re: KDE a gcc
Date: Mon, 12 Nov 2001 12:11:00 -0000 [thread overview]
Message-ID: <20011112155951.K8833@atrey.karlin.mff.cuni.cz> (raw)
Message-ID: <20011112121100.MyIoUnloI4kC2oc1S6MN31H_BufrStq3xDk2d_GOiSc@z> (raw)
In-Reply-To: <20011112155258.H8833@atrey.karlin.mff.cuni.cz>
> Hi,
> this patch implements idea described in:
> > http://dforce.sh.cvut.cz/~seli/en/linking2/#data_segment
>
> basically in KDE/QT applications there is lots of pregenerated data that is
> read only, but in PIC compilation it isn't because of dynamic linking. This
> code is intermixed with other readwrite data then. With prelinking this is a
> waste, as the pregenereated data is really readonly so it should be put
> together and without it is waste too, as dynamic linker needs to COW much more
> pages.
>
> This patch adds two new sections. .data.rel is used for read/write data that
> contains relocations (so it will be COWed on startup in case no prelinking is
> done) and .data.rel.ro contains read/only data with relocations that are
> read-only for prelinking and COWed on startup.
>
> Lubos measured about 60Kb saving on simple QT application requiring about 500Kb
> resources with the prelinking. He estimates savings for KDE application to
> about 200Kb. I made simple test with sartup time on the c++ library from
> crystal space w/o prelinking and got about 6% savings in startup time too.
>
> Note that I am not quite sure whether .data.rel / .data.rel.ro are handled as
> .data subsections on all systems. The patch uses the named sections by
> default, but allows to define new opcodes for that too, hope it is flexible
> enought and will not bring considerable compatibility issues.
>
> Honza
Oops, forgot the patch :)
Bootstrapped/regtested i686
Wed Oct 31 17:44:53 CET 2001 Jan Hubicka <jh@susue.cz>
* output.h (data_rel_section, data_rel_ro_section): Declare.
* varasm.c (in_section): Add in_data_rel and in_data_rel_ro.
(default_exception_section): Use data_rel_ro_section.
(output_constant_def_components): Likewise.
* elfos.h (SELECT_SECTION): Use data_rel_section
and data_rel_ro_section for relocatable insns.
* tm.texi (DATA_REL_SECTION_OP, DATA_REL_RO_SECTION_OP):
document.
Index: output.h
===================================================================
RCS file: /cvs/gcc/egcs/gcc/output.h,v
retrieving revision 1.87
diff -c -3 -p -r1.87 output.h
*** output.h 2001/11/04 02:47:36 1.87
--- output.h 2001/11/12 14:42:05
*************** extern void text_section PARAMS ((void)
*** 156,161 ****
--- 156,174 ----
/* Tell assembler to switch to data section. */
extern void data_section PARAMS ((void));
+ /* Tell assembler to switch to data_rel section.
+ This section contains data that needs dynamic linking.
+ If there is no dedicated section for this purpose, data
+ section is used. */
+
+ extern void data_rel_section PARAMS ((void));
+
+ /* Like data_rel_section, but data_rel_ro section is used
+ for data needing dynamic linking but read only otherwise.
+ These data are read only with prelinking. */
+
+ extern void data_rel_ro_section PARAMS ((void));
+
/* Tell assembler to make sure its in the data section. */
extern void force_data_section PARAMS ((void));
Index: varasm.c
===================================================================
RCS file: /cvs/gcc/egcs/gcc/varasm.c,v
retrieving revision 1.226
diff -c -3 -p -r1.226 varasm.c
*** varasm.c 2001/11/11 05:56:36 1.226
--- varasm.c 2001/11/12 14:42:06
*************** static void const_str_htab_del PARAMS (
*** 193,199 ****
static void asm_emit_uninitialised PARAMS ((tree, const char*, int, int));
static void resolve_unique_section PARAMS ((tree, int));
\f
! static enum in_section { no_section, in_text, in_data, in_named
#ifdef BSS_SECTION_ASM_OP
, in_bss
#endif
--- 193,200 ----
static void asm_emit_uninitialised PARAMS ((tree, const char*, int, int));
static void resolve_unique_section PARAMS ((tree, int));
\f
! static enum in_section { no_section, in_text, in_data, in_named, in_data_rel,
! in_data_rel_ro
#ifdef BSS_SECTION_ASM_OP
, in_bss
#endif
*************** data_section ()
*** 271,276 ****
--- 272,334 ----
in_section = in_data;
}
}
+
+ /* Tell assembler to switch to data_rel section.
+ This section contains data that needs dynamic linking.
+ If there is no dedicated section for this purpose, data
+ section is used. */
+
+ void
+ data_rel_section ()
+ {
+ if (in_section == in_data_rel)
+ ;
+ else if (flag_shared_data || !flag_pic)
+ data_section ();
+ #ifdef DATA_REL_SECTION_ASM_OP
+ else
+ {
+ fprintf (asm_out_file, "%s\n", DATA_REL_SECTION_ASM_OP);
+ in_section = in_data_rel;
+ }
+ #else
+ else if (targetm.have_named_sections)
+ {
+ named_section (NULL_TREE, ".data.rel", 0);
+ in_section = in_data_rel;
+ }
+ else
+ data_section ();
+ #endif
+ }
+
+ /* Like data_rel_section, but data_rel_ro section is used
+ for data needing dynamic linking but read only otherwise.
+ These data are read only with prelinking. */
+
+ void
+ data_rel_ro_section ()
+ {
+ if (in_section == in_data_rel_ro)
+ ;
+ else if (!flag_pic)
+ readonly_data_section ();
+ #ifdef DATA_REL_RO_SECTION_ASM_OP
+ else
+ {
+ fprintf (asm_out_file, "%s\n", DATA_REL_RO_SECTION_ASM_OP);
+ in_section = in_data_rel_ro;
+ }
+ #else
+ else if (targetm.have_named_sections)
+ {
+ named_section (NULL_TREE, ".data.rel.ro", 0);
+ in_section = in_data_rel_ro;
+ }
+ else
+ data_rel_section ();
+ #endif
+ }
/* Tell assembler to ALWAYS switch to data section, in case
it's not sure where it is. */
*************** default_exception_section ()
*** 614,620 ****
if (targetm.have_named_sections)
named_section (NULL_TREE, ".gcc_except_table", 0);
else if (flag_pic)
! data_section ();
else
readonly_data_section ();
}
--- 672,678 ----
if (targetm.have_named_sections)
named_section (NULL_TREE, ".gcc_except_table", 0);
else if (flag_pic)
! data_rel_ro_section ();
else
readonly_data_section ();
}
*************** output_constant_def_contents (exp, reloc
*** 3454,3462 ****
#ifdef SELECT_SECTION
SELECT_SECTION (exp, reloc, align);
#else
! if (((TREE_CODE (exp) == STRING_CST) && flag_writable_strings)
! || (flag_pic && reloc))
data_section ();
else
readonly_data_section ();
#endif
--- 3512,3521 ----
#ifdef SELECT_SECTION
SELECT_SECTION (exp, reloc, align);
#else
! if ((TREE_CODE (exp) == STRING_CST) && flag_writable_strings)
data_section ();
+ else if (flag_pic && reloc)
+ data_rel_ro_section ();
else
readonly_data_section ();
#endif
Index: config/elfos.h
===================================================================
RCS file: /cvs/gcc/egcs/gcc/config/elfos.h,v
retrieving revision 1.36
diff -c -3 -p -r1.36 elfos.h
*** elfos.h 2001/11/11 05:56:38 1.36
--- elfos.h 2001/11/12 14:42:07
*************** const_section () \
*** 377,388 ****
} \
else if (TREE_CODE (DECL) == VAR_DECL) \
{ \
! if ((flag_pic && RELOC) \
! || !TREE_READONLY (DECL) || TREE_SIDE_EFFECTS (DECL) \
|| !DECL_INITIAL (DECL) \
|| (DECL_INITIAL (DECL) != error_mark_node \
&& !TREE_CONSTANT (DECL_INITIAL (DECL)))) \
! data_section (); \
else if (flag_merge_constants < 2) \
/* C and C++ don't allow different variables to share \
the same location. -fmerge-all-constants allows \
--- 377,394 ----
} \
else if (TREE_CODE (DECL) == VAR_DECL) \
{ \
! if (!TREE_READONLY (DECL) || TREE_SIDE_EFFECTS (DECL) \
|| !DECL_INITIAL (DECL) \
|| (DECL_INITIAL (DECL) != error_mark_node \
&& !TREE_CONSTANT (DECL_INITIAL (DECL)))) \
! { \
! if (flag_pic && RELOC) \
! data_rel_section (); \
! else \
! data_section (); \
! } \
! else if (flag_pic && RELOC) \
! data_rel_ro_section (); \
else if (flag_merge_constants < 2) \
/* C and C++ don't allow different variables to share \
the same location. -fmerge-all-constants allows \
Index: doc/tm.texi
===================================================================
RCS file: /cvs/gcc/egcs/gcc/doc/tm.texi,v
retrieving revision 1.69
diff -c -3 -p -r1.69 tm.texi
*** tm.texi 2001/11/10 21:44:52 1.69
--- tm.texi 2001/11/12 14:42:09
*************** A C expression whose value is a string,
*** 5579,5584 ****
--- 5579,5600 ----
assembler operation to identify the following data as writable initialized
data. Normally @code{"\t.data"} is right.
+ @findex DATA_REL_SECTION_ASM_OP
+ @item DATA_REL_SECTION_ASM_OP
+ A C expression whose value is a string, including spacing, containing the
+ assembler operation to identify the following data as writable initialized
+ data that do need dynamic linking.
+ Used only in PIC compilation and if not present, data section is used
+ instead.
+
+ @findex DATA_REL_RO_SECTION_ASM_OP
+ @item DATA_REL_RO_SECTION_ASM_OP
+ A C expression whose value is a string, including spacing, containing the
+ assembler operation to identify the following data as read only initialized
+ data that do need dynamic linking.
+ Used only in PIC compilation and if not present, data section is used
+ instead.
+
@findex SHARED_SECTION_ASM_OP
@item SHARED_SECTION_ASM_OP
If defined, a C expression whose value is a string, including spacing,
WARNING: multiple messages have this Message-ID
From: Jan Hubicka <jh@suse.cz>
To: Jan Hubicka <jh@suse.cz>
Cc: Lubos Lunak <l.lunak@sh.cvut.cz>,
rth@cygnus.com, Jakub Jelinek <jakub@redhat.com>,
gcc-patches@gcc.gnu.org, patches@x86-64.org
Subject: Re: [patches] Re: KDE a gcc
Date: Tue, 13 Nov 2001 04:26:00 -0000 [thread overview]
Message-ID: <20011112155951.K8833@atrey.karlin.mff.cuni.cz> (raw)
Message-ID: <20011113042600.8Rnre0bui1cpGlHfhnF0au9ePbzF4R8Emj94QF6DRVk@z> (raw)
In-Reply-To: <20011112155258.H8833@atrey.karlin.mff.cuni.cz>
> Hi,
> this patch implements idea described in:
> > http://dforce.sh.cvut.cz/~seli/en/linking2/#data_segment
>
> basically in KDE/QT applications there is lots of pregenerated data that is
> read only, but in PIC compilation it isn't because of dynamic linking. This
> code is intermixed with other readwrite data then. With prelinking this is a
> waste, as the pregenereated data is really readonly so it should be put
> together and without it is waste too, as dynamic linker needs to COW much more
> pages.
>
> This patch adds two new sections. .data.rel is used for read/write data that
> contains relocations (so it will be COWed on startup in case no prelinking is
> done) and .data.rel.ro contains read/only data with relocations that are
> read-only for prelinking and COWed on startup.
>
> Lubos measured about 60Kb saving on simple QT application requiring about 500Kb
> resources with the prelinking. He estimates savings for KDE application to
> about 200Kb. I made simple test with sartup time on the c++ library from
> crystal space w/o prelinking and got about 6% savings in startup time too.
>
> Note that I am not quite sure whether .data.rel / .data.rel.ro are handled as
> .data subsections on all systems. The patch uses the named sections by
> default, but allows to define new opcodes for that too, hope it is flexible
> enought and will not bring considerable compatibility issues.
>
> Honza
Oops, forgot the patch :)
Bootstrapped/regtested i686
Wed Oct 31 17:44:53 CET 2001 Jan Hubicka <jh@susue.cz>
* output.h (data_rel_section, data_rel_ro_section): Declare.
* varasm.c (in_section): Add in_data_rel and in_data_rel_ro.
(default_exception_section): Use data_rel_ro_section.
(output_constant_def_components): Likewise.
* elfos.h (SELECT_SECTION): Use data_rel_section
and data_rel_ro_section for relocatable insns.
* tm.texi (DATA_REL_SECTION_OP, DATA_REL_RO_SECTION_OP):
document.
Index: output.h
===================================================================
RCS file: /cvs/gcc/egcs/gcc/output.h,v
retrieving revision 1.87
diff -c -3 -p -r1.87 output.h
*** output.h 2001/11/04 02:47:36 1.87
--- output.h 2001/11/12 14:42:05
*************** extern void text_section PARAMS ((void)
*** 156,161 ****
--- 156,174 ----
/* Tell assembler to switch to data section. */
extern void data_section PARAMS ((void));
+ /* Tell assembler to switch to data_rel section.
+ This section contains data that needs dynamic linking.
+ If there is no dedicated section for this purpose, data
+ section is used. */
+
+ extern void data_rel_section PARAMS ((void));
+
+ /* Like data_rel_section, but data_rel_ro section is used
+ for data needing dynamic linking but read only otherwise.
+ These data are read only with prelinking. */
+
+ extern void data_rel_ro_section PARAMS ((void));
+
/* Tell assembler to make sure its in the data section. */
extern void force_data_section PARAMS ((void));
Index: varasm.c
===================================================================
RCS file: /cvs/gcc/egcs/gcc/varasm.c,v
retrieving revision 1.226
diff -c -3 -p -r1.226 varasm.c
*** varasm.c 2001/11/11 05:56:36 1.226
--- varasm.c 2001/11/12 14:42:06
*************** static void const_str_htab_del PARAMS (
*** 193,199 ****
static void asm_emit_uninitialised PARAMS ((tree, const char*, int, int));
static void resolve_unique_section PARAMS ((tree, int));
\f
! static enum in_section { no_section, in_text, in_data, in_named
#ifdef BSS_SECTION_ASM_OP
, in_bss
#endif
--- 193,200 ----
static void asm_emit_uninitialised PARAMS ((tree, const char*, int, int));
static void resolve_unique_section PARAMS ((tree, int));
\f
! static enum in_section { no_section, in_text, in_data, in_named, in_data_rel,
! in_data_rel_ro
#ifdef BSS_SECTION_ASM_OP
, in_bss
#endif
*************** data_section ()
*** 271,276 ****
--- 272,334 ----
in_section = in_data;
}
}
+
+ /* Tell assembler to switch to data_rel section.
+ This section contains data that needs dynamic linking.
+ If there is no dedicated section for this purpose, data
+ section is used. */
+
+ void
+ data_rel_section ()
+ {
+ if (in_section == in_data_rel)
+ ;
+ else if (flag_shared_data || !flag_pic)
+ data_section ();
+ #ifdef DATA_REL_SECTION_ASM_OP
+ else
+ {
+ fprintf (asm_out_file, "%s\n", DATA_REL_SECTION_ASM_OP);
+ in_section = in_data_rel;
+ }
+ #else
+ else if (targetm.have_named_sections)
+ {
+ named_section (NULL_TREE, ".data.rel", 0);
+ in_section = in_data_rel;
+ }
+ else
+ data_section ();
+ #endif
+ }
+
+ /* Like data_rel_section, but data_rel_ro section is used
+ for data needing dynamic linking but read only otherwise.
+ These data are read only with prelinking. */
+
+ void
+ data_rel_ro_section ()
+ {
+ if (in_section == in_data_rel_ro)
+ ;
+ else if (!flag_pic)
+ readonly_data_section ();
+ #ifdef DATA_REL_RO_SECTION_ASM_OP
+ else
+ {
+ fprintf (asm_out_file, "%s\n", DATA_REL_RO_SECTION_ASM_OP);
+ in_section = in_data_rel_ro;
+ }
+ #else
+ else if (targetm.have_named_sections)
+ {
+ named_section (NULL_TREE, ".data.rel.ro", 0);
+ in_section = in_data_rel_ro;
+ }
+ else
+ data_rel_section ();
+ #endif
+ }
/* Tell assembler to ALWAYS switch to data section, in case
it's not sure where it is. */
*************** default_exception_section ()
*** 614,620 ****
if (targetm.have_named_sections)
named_section (NULL_TREE, ".gcc_except_table", 0);
else if (flag_pic)
! data_section ();
else
readonly_data_section ();
}
--- 672,678 ----
if (targetm.have_named_sections)
named_section (NULL_TREE, ".gcc_except_table", 0);
else if (flag_pic)
! data_rel_ro_section ();
else
readonly_data_section ();
}
*************** output_constant_def_contents (exp, reloc
*** 3454,3462 ****
#ifdef SELECT_SECTION
SELECT_SECTION (exp, reloc, align);
#else
! if (((TREE_CODE (exp) == STRING_CST) && flag_writable_strings)
! || (flag_pic && reloc))
data_section ();
else
readonly_data_section ();
#endif
--- 3512,3521 ----
#ifdef SELECT_SECTION
SELECT_SECTION (exp, reloc, align);
#else
! if ((TREE_CODE (exp) == STRING_CST) && flag_writable_strings)
data_section ();
+ else if (flag_pic && reloc)
+ data_rel_ro_section ();
else
readonly_data_section ();
#endif
Index: config/elfos.h
===================================================================
RCS file: /cvs/gcc/egcs/gcc/config/elfos.h,v
retrieving revision 1.36
diff -c -3 -p -r1.36 elfos.h
*** elfos.h 2001/11/11 05:56:38 1.36
--- elfos.h 2001/11/12 14:42:07
*************** const_section () \
*** 377,388 ****
} \
else if (TREE_CODE (DECL) == VAR_DECL) \
{ \
! if ((flag_pic && RELOC) \
! || !TREE_READONLY (DECL) || TREE_SIDE_EFFECTS (DECL) \
|| !DECL_INITIAL (DECL) \
|| (DECL_INITIAL (DECL) != error_mark_node \
&& !TREE_CONSTANT (DECL_INITIAL (DECL)))) \
! data_section (); \
else if (flag_merge_constants < 2) \
/* C and C++ don't allow different variables to share \
the same location. -fmerge-all-constants allows \
--- 377,394 ----
} \
else if (TREE_CODE (DECL) == VAR_DECL) \
{ \
! if (!TREE_READONLY (DECL) || TREE_SIDE_EFFECTS (DECL) \
|| !DECL_INITIAL (DECL) \
|| (DECL_INITIAL (DECL) != error_mark_node \
&& !TREE_CONSTANT (DECL_INITIAL (DECL)))) \
! { \
! if (flag_pic && RELOC) \
! data_rel_section (); \
! else \
! data_section (); \
! } \
! else if (flag_pic && RELOC) \
! data_rel_ro_section (); \
else if (flag_merge_constants < 2) \
/* C and C++ don't allow different variables to share \
the same location. -fmerge-all-constants allows \
Index: doc/tm.texi
===================================================================
RCS file: /cvs/gcc/egcs/gcc/doc/tm.texi,v
retrieving revision 1.69
diff -c -3 -p -r1.69 tm.texi
*** tm.texi 2001/11/10 21:44:52 1.69
--- tm.texi 2001/11/12 14:42:09
*************** A C expression whose value is a string,
*** 5579,5584 ****
--- 5579,5600 ----
assembler operation to identify the following data as writable initialized
data. Normally @code{"\t.data"} is right.
+ @findex DATA_REL_SECTION_ASM_OP
+ @item DATA_REL_SECTION_ASM_OP
+ A C expression whose value is a string, including spacing, containing the
+ assembler operation to identify the following data as writable initialized
+ data that do need dynamic linking.
+ Used only in PIC compilation and if not present, data section is used
+ instead.
+
+ @findex DATA_REL_RO_SECTION_ASM_OP
+ @item DATA_REL_RO_SECTION_ASM_OP
+ A C expression whose value is a string, including spacing, containing the
+ assembler operation to identify the following data as read only initialized
+ data that do need dynamic linking.
+ Used only in PIC compilation and if not present, data section is used
+ instead.
+
@findex SHARED_SECTION_ASM_OP
@item SHARED_SECTION_ASM_OP
If defined, a C expression whose value is a string, including spacing,
WARNING: multiple messages have this Message-ID
From: Jan Hubicka <jh@suse.cz>
To: Jan Hubicka <jh@suse.cz>
Cc: Lubos Lunak <l.lunak@sh.cvut.cz>,
rth@cygnus.com, Jakub Jelinek <jakub@redhat.com>,
gcc-patches@gcc.gnu.org, patches@x86-64.org
Subject: Re: [patches] Re: KDE a gcc
Date: Tue, 13 Nov 2001 15:03:00 -0000 [thread overview]
Message-ID: <20011112155951.K8833@atrey.karlin.mff.cuni.cz> (raw)
Message-ID: <20011113150300.UXNkY0llYSX49hR5z-sjPi0X5ct7s6TRg1t9yjLN_nA@z> (raw)
In-Reply-To: <20011112155258.H8833@atrey.karlin.mff.cuni.cz>
> Hi,
> this patch implements idea described in:
> > http://dforce.sh.cvut.cz/~seli/en/linking2/#data_segment
>
> basically in KDE/QT applications there is lots of pregenerated data that is
> read only, but in PIC compilation it isn't because of dynamic linking. This
> code is intermixed with other readwrite data then. With prelinking this is a
> waste, as the pregenereated data is really readonly so it should be put
> together and without it is waste too, as dynamic linker needs to COW much more
> pages.
>
> This patch adds two new sections. .data.rel is used for read/write data that
> contains relocations (so it will be COWed on startup in case no prelinking is
> done) and .data.rel.ro contains read/only data with relocations that are
> read-only for prelinking and COWed on startup.
>
> Lubos measured about 60Kb saving on simple QT application requiring about 500Kb
> resources with the prelinking. He estimates savings for KDE application to
> about 200Kb. I made simple test with sartup time on the c++ library from
> crystal space w/o prelinking and got about 6% savings in startup time too.
>
> Note that I am not quite sure whether .data.rel / .data.rel.ro are handled as
> .data subsections on all systems. The patch uses the named sections by
> default, but allows to define new opcodes for that too, hope it is flexible
> enought and will not bring considerable compatibility issues.
>
> Honza
Oops, forgot the patch :)
Bootstrapped/regtested i686
Wed Oct 31 17:44:53 CET 2001 Jan Hubicka <jh@susue.cz>
* output.h (data_rel_section, data_rel_ro_section): Declare.
* varasm.c (in_section): Add in_data_rel and in_data_rel_ro.
(default_exception_section): Use data_rel_ro_section.
(output_constant_def_components): Likewise.
* elfos.h (SELECT_SECTION): Use data_rel_section
and data_rel_ro_section for relocatable insns.
* tm.texi (DATA_REL_SECTION_OP, DATA_REL_RO_SECTION_OP):
document.
Index: output.h
===================================================================
RCS file: /cvs/gcc/egcs/gcc/output.h,v
retrieving revision 1.87
diff -c -3 -p -r1.87 output.h
*** output.h 2001/11/04 02:47:36 1.87
--- output.h 2001/11/12 14:42:05
*************** extern void text_section PARAMS ((void)
*** 156,161 ****
--- 156,174 ----
/* Tell assembler to switch to data section. */
extern void data_section PARAMS ((void));
+ /* Tell assembler to switch to data_rel section.
+ This section contains data that needs dynamic linking.
+ If there is no dedicated section for this purpose, data
+ section is used. */
+
+ extern void data_rel_section PARAMS ((void));
+
+ /* Like data_rel_section, but data_rel_ro section is used
+ for data needing dynamic linking but read only otherwise.
+ These data are read only with prelinking. */
+
+ extern void data_rel_ro_section PARAMS ((void));
+
/* Tell assembler to make sure its in the data section. */
extern void force_data_section PARAMS ((void));
Index: varasm.c
===================================================================
RCS file: /cvs/gcc/egcs/gcc/varasm.c,v
retrieving revision 1.226
diff -c -3 -p -r1.226 varasm.c
*** varasm.c 2001/11/11 05:56:36 1.226
--- varasm.c 2001/11/12 14:42:06
*************** static void const_str_htab_del PARAMS (
*** 193,199 ****
static void asm_emit_uninitialised PARAMS ((tree, const char*, int, int));
static void resolve_unique_section PARAMS ((tree, int));
\f
! static enum in_section { no_section, in_text, in_data, in_named
#ifdef BSS_SECTION_ASM_OP
, in_bss
#endif
--- 193,200 ----
static void asm_emit_uninitialised PARAMS ((tree, const char*, int, int));
static void resolve_unique_section PARAMS ((tree, int));
\f
! static enum in_section { no_section, in_text, in_data, in_named, in_data_rel,
! in_data_rel_ro
#ifdef BSS_SECTION_ASM_OP
, in_bss
#endif
*************** data_section ()
*** 271,276 ****
--- 272,334 ----
in_section = in_data;
}
}
+
+ /* Tell assembler to switch to data_rel section.
+ This section contains data that needs dynamic linking.
+ If there is no dedicated section for this purpose, data
+ section is used. */
+
+ void
+ data_rel_section ()
+ {
+ if (in_section == in_data_rel)
+ ;
+ else if (flag_shared_data || !flag_pic)
+ data_section ();
+ #ifdef DATA_REL_SECTION_ASM_OP
+ else
+ {
+ fprintf (asm_out_file, "%s\n", DATA_REL_SECTION_ASM_OP);
+ in_section = in_data_rel;
+ }
+ #else
+ else if (targetm.have_named_sections)
+ {
+ named_section (NULL_TREE, ".data.rel", 0);
+ in_section = in_data_rel;
+ }
+ else
+ data_section ();
+ #endif
+ }
+
+ /* Like data_rel_section, but data_rel_ro section is used
+ for data needing dynamic linking but read only otherwise.
+ These data are read only with prelinking. */
+
+ void
+ data_rel_ro_section ()
+ {
+ if (in_section == in_data_rel_ro)
+ ;
+ else if (!flag_pic)
+ readonly_data_section ();
+ #ifdef DATA_REL_RO_SECTION_ASM_OP
+ else
+ {
+ fprintf (asm_out_file, "%s\n", DATA_REL_RO_SECTION_ASM_OP);
+ in_section = in_data_rel_ro;
+ }
+ #else
+ else if (targetm.have_named_sections)
+ {
+ named_section (NULL_TREE, ".data.rel.ro", 0);
+ in_section = in_data_rel_ro;
+ }
+ else
+ data_rel_section ();
+ #endif
+ }
/* Tell assembler to ALWAYS switch to data section, in case
it's not sure where it is. */
*************** default_exception_section ()
*** 614,620 ****
if (targetm.have_named_sections)
named_section (NULL_TREE, ".gcc_except_table", 0);
else if (flag_pic)
! data_section ();
else
readonly_data_section ();
}
--- 672,678 ----
if (targetm.have_named_sections)
named_section (NULL_TREE, ".gcc_except_table", 0);
else if (flag_pic)
! data_rel_ro_section ();
else
readonly_data_section ();
}
*************** output_constant_def_contents (exp, reloc
*** 3454,3462 ****
#ifdef SELECT_SECTION
SELECT_SECTION (exp, reloc, align);
#else
! if (((TREE_CODE (exp) == STRING_CST) && flag_writable_strings)
! || (flag_pic && reloc))
data_section ();
else
readonly_data_section ();
#endif
--- 3512,3521 ----
#ifdef SELECT_SECTION
SELECT_SECTION (exp, reloc, align);
#else
! if ((TREE_CODE (exp) == STRING_CST) && flag_writable_strings)
data_section ();
+ else if (flag_pic && reloc)
+ data_rel_ro_section ();
else
readonly_data_section ();
#endif
Index: config/elfos.h
===================================================================
RCS file: /cvs/gcc/egcs/gcc/config/elfos.h,v
retrieving revision 1.36
diff -c -3 -p -r1.36 elfos.h
*** elfos.h 2001/11/11 05:56:38 1.36
--- elfos.h 2001/11/12 14:42:07
*************** const_section () \
*** 377,388 ****
} \
else if (TREE_CODE (DECL) == VAR_DECL) \
{ \
! if ((flag_pic && RELOC) \
! || !TREE_READONLY (DECL) || TREE_SIDE_EFFECTS (DECL) \
|| !DECL_INITIAL (DECL) \
|| (DECL_INITIAL (DECL) != error_mark_node \
&& !TREE_CONSTANT (DECL_INITIAL (DECL)))) \
! data_section (); \
else if (flag_merge_constants < 2) \
/* C and C++ don't allow different variables to share \
the same location. -fmerge-all-constants allows \
--- 377,394 ----
} \
else if (TREE_CODE (DECL) == VAR_DECL) \
{ \
! if (!TREE_READONLY (DECL) || TREE_SIDE_EFFECTS (DECL) \
|| !DECL_INITIAL (DECL) \
|| (DECL_INITIAL (DECL) != error_mark_node \
&& !TREE_CONSTANT (DECL_INITIAL (DECL)))) \
! { \
! if (flag_pic && RELOC) \
! data_rel_section (); \
! else \
! data_section (); \
! } \
! else if (flag_pic && RELOC) \
! data_rel_ro_section (); \
else if (flag_merge_constants < 2) \
/* C and C++ don't allow different variables to share \
the same location. -fmerge-all-constants allows \
Index: doc/tm.texi
===================================================================
RCS file: /cvs/gcc/egcs/gcc/doc/tm.texi,v
retrieving revision 1.69
diff -c -3 -p -r1.69 tm.texi
*** tm.texi 2001/11/10 21:44:52 1.69
--- tm.texi 2001/11/12 14:42:09
*************** A C expression whose value is a string,
*** 5579,5584 ****
--- 5579,5600 ----
assembler operation to identify the following data as writable initialized
data. Normally @code{"\t.data"} is right.
+ @findex DATA_REL_SECTION_ASM_OP
+ @item DATA_REL_SECTION_ASM_OP
+ A C expression whose value is a string, including spacing, containing the
+ assembler operation to identify the following data as writable initialized
+ data that do need dynamic linking.
+ Used only in PIC compilation and if not present, data section is used
+ instead.
+
+ @findex DATA_REL_RO_SECTION_ASM_OP
+ @item DATA_REL_RO_SECTION_ASM_OP
+ A C expression whose value is a string, including spacing, containing the
+ assembler operation to identify the following data as read only initialized
+ data that do need dynamic linking.
+ Used only in PIC compilation and if not present, data section is used
+ instead.
+
@findex SHARED_SECTION_ASM_OP
@item SHARED_SECTION_ASM_OP
If defined, a C expression whose value is a string, including spacing,
next prev parent reply other threads:[~2001-11-12 15:03 UTC|newest]
Thread overview: 28+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <200110030715.f937FCT75772@ns.felk.cvut.cz>
[not found] ` <200110312108.WAA21661@stoupa.sh.cvut.cz>
[not found] ` <20011101145241.E31305@atrey.karlin.mff.cuni.cz>
[not found] ` <200111011733.SAA25987@stoupa.sh.cvut.cz>
2001-11-02 10:58 ` Jan Hubicka
2001-11-02 11:24 ` Jakub Jelinek
2001-11-02 12:25 ` [patches] " Jan Hubicka
2001-11-12 12:11 ` Jan Hubicka
2001-11-13 4:26 ` Jan Hubicka
2001-11-13 15:03 ` Jan Hubicka
2001-11-12 12:11 ` Jakub Jelinek
2001-11-13 4:26 ` Jakub Jelinek
2001-11-13 15:03 ` Jakub Jelinek
2001-11-02 12:23 ` Jan Hubicka [this message]
2001-11-12 12:11 ` [patches] " Jan Hubicka
2001-11-13 4:26 ` Jan Hubicka
[not found] ` <20011112092319.A15349@redhat.com>
2001-11-13 15:03 ` Jan Hubicka
2001-11-13 15:03 ` Jakub Jelinek
2001-11-13 15:03 ` Jakub Jelinek
2001-11-13 15:03 ` KDE and gcc take III Jan Hubicka
2001-11-14 7:28 ` Richard Henderson
2001-11-14 8:35 ` Jan Hubicka
2001-11-14 11:17 ` Richard Henderson
2001-11-24 12:26 ` Richard Henderson
2001-11-24 11:20 ` Jan Hubicka
2001-11-24 11:10 ` Richard Henderson
2001-11-22 5:06 ` Jan Hubicka
2001-11-22 1:32 ` [patches] Re: KDE a gcc Jakub Jelinek
2001-11-13 15:03 ` Jan Hubicka
2001-11-12 12:11 ` Jan Hubicka
2001-11-13 4:26 ` Jan Hubicka
2001-11-13 15:03 ` Jan Hubicka
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20011112155951.K8833@atrey.karlin.mff.cuni.cz \
--to=jh@suse.cz \
--cc=gcc-patches@gcc.gnu.org \
--cc=jakub@redhat.com \
--cc=l.lunak@sh.cvut.cz \
--cc=patches@x86-64.org \
--cc=rth@cygnus.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).