public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
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,

  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).