Re: [google][4.7] Allow function reordering linker plugin to separate hot and cold code into different ELF segments

2013-01-04 Thread Rong Xu
The code looks fine to me. Please consider David's comments about the
option name.

-Rong

On Thu, Jan 3, 2013 at 9:14 PM, Xinliang David Li davi...@google.com wrote:
 Is it better to change the option to something like:

 split_segment|nosplit-segment
 or split_segment=yes|no


 David

 On Thu, Jan 3, 2013 at 5:41 PM, Sriraman Tallam tmsri...@google.com wrote:
 Hi Rong,

   The following patch modifies the behaviour of the linker plugin to
 not create a separate segment for cold sections by default. Separate
 segments can be created with the plugin option segment=cold. Is this
 alright to commit?

 Thanks,
 -Sri.

 On Mon, Dec 17, 2012 at 11:14 AM, Sriraman Tallam tmsri...@google.com 
 wrote:
 I have committed this patch.

 Thanks,
 -Sri.

 On Fri, Dec 14, 2012 at 4:16 PM, Rong Xu x...@google.com wrote:
 Looks good to me for google/gcc-4_7 branch.

 Thanks,

 -Rong


 On Fri, Dec 14, 2012 at 3:42 PM, Sriraman Tallam tmsri...@google.com
 wrote:

 Hi Rong,

 Please review this code. This code allows the function reordering
 plugin to separate hot and cold code into different ELF segments.
 This would allow optimizations like mapping the hot code alone to huge
 pages.

 With this patch, by default, the plugin maps .text.unlikely
 sections into a separate ELF segment.  This can be turned off with
 plugin option --segment=none.

 The include/plugin-api.h changes are a backport from trunk.

 Thanks,
 -Sri.




Re: [google][4.7] Allow function reordering linker plugin to separate hot and cold code into different ELF segments

2013-01-04 Thread Sriraman Tallam
Attached new patch.

Thanks,
-Sri.

On Fri, Jan 4, 2013 at 9:12 AM, Rong Xu x...@google.com wrote:
 The code looks fine to me. Please consider David's comments about the
 option name.

 -Rong

 On Thu, Jan 3, 2013 at 9:14 PM, Xinliang David Li davi...@google.com wrote:
 Is it better to change the option to something like:

 split_segment|nosplit-segment
 or split_segment=yes|no


 David

 On Thu, Jan 3, 2013 at 5:41 PM, Sriraman Tallam tmsri...@google.com wrote:
 Hi Rong,

   The following patch modifies the behaviour of the linker plugin to
 not create a separate segment for cold sections by default. Separate
 segments can be created with the plugin option segment=cold. Is this
 alright to commit?

 Thanks,
 -Sri.

 On Mon, Dec 17, 2012 at 11:14 AM, Sriraman Tallam tmsri...@google.com 
 wrote:
 I have committed this patch.

 Thanks,
 -Sri.

 On Fri, Dec 14, 2012 at 4:16 PM, Rong Xu x...@google.com wrote:
 Looks good to me for google/gcc-4_7 branch.

 Thanks,

 -Rong


 On Fri, Dec 14, 2012 at 3:42 PM, Sriraman Tallam tmsri...@google.com
 wrote:

 Hi Rong,

 Please review this code. This code allows the function reordering
 plugin to separate hot and cold code into different ELF segments.
 This would allow optimizations like mapping the hot code alone to huge
 pages.

 With this patch, by default, the plugin maps .text.unlikely
 sections into a separate ELF segment.  This can be turned off with
 plugin option --segment=none.

 The include/plugin-api.h changes are a backport from trunk.

 Thanks,
 -Sri.


Index: function_reordering_plugin/function_reordering_plugin.c
===
--- function_reordering_plugin/function_reordering_plugin.c (revision 
194878)
+++ function_reordering_plugin/function_reordering_plugin.c (working copy)
@@ -33,9 +33,13 @@ along with this program; see the file COPYING3.  I
 
This plugin dumps the final layout order of the functions in a file
called final_layout.txt.  To change the output file, pass the new
-   file name with --plugin-opt.  To dump to stderr instead, just pass
-   stderr to --plugin-opt.  */
+   file name with --plugin-opt,file=name.  To dump to stderr instead,
+   just pass stderr as the file name.
 
+   This plugin also allows placing all functions found cold in a separate
+   segment.  This can be enabled with the linker option:
+   --plugin-opt,split_segment=yes.  */
+
 #if HAVE_STDINT_H
 #include stdint.h
 #endif
@@ -89,9 +93,10 @@ static int is_api_exist = 0;
 /* The plugin does nothing when no-op is 1.  */
 static int no_op = 0;
 
-/* The plugin does not create a new segment for unlikely code if
-   no_segment is set.  */
-static int no_segment = 0;
+/* The plugin creates a new segment for unlikely code if split_segment
+   is set.  This can be set with the linker option:
+   --plugin-opt,split_segment=yes.  */
+static int split_segment = 0;
 
 /* Copies new output file name out_file  */
 void get_filename (const char *name)
@@ -110,7 +115,7 @@ process_option (const char *name)
 {
   const char *option_group = group=;
   const char *option_file = file=;
-  const char *option_segment = segment=;
+  const char *option_segment = split_segment=;
 
   /* Check if option is group=  */
   if (strncmp (name, option_group, strlen (option_group)) == 0)
@@ -129,13 +134,14 @@ process_option (const char *name)
   return;
 }
 
-  /* Check if options is segment=none  */
+  /* Check if options is split_segment=[yes|no]  */
   if (strncmp (name, option_segment, strlen (option_segment)) == 0)
 {
-  if (strcmp (name + strlen (option_segment), none) == 0)
-   no_segment = 1;
-  else
-   no_segment = 0;
+  const char *option_val = name + strlen (option_segment);
+  if (strcmp (option_val, no) == 0)
+   split_segment = 0;
+  else if (strcmp (option_val, yes) == 0)
+   split_segment = 1;
   return;
 }
 
@@ -244,7 +250,10 @@ claim_file_hook (const struct ld_plugin_input_file
 {
   /* Inform the linker to prepare for section reordering.  */
   (*allow_section_ordering) ();
-  (*allow_unique_segment_for_sections) ();
+  /* Inform the linker to allow certain sections to be placed in
+a separate segment.  */
+  if (split_segment == 1)
+(*allow_unique_segment_for_sections) ();
   is_ordering_specified = 1;
 }
 
@@ -335,15 +344,29 @@ all_symbols_read_hook (void)
   if (out_file != NULL
strcmp (out_file, stderr) != 0)
 fclose (fp);
-  /* Pass the new order of functions to the linker.  */
-  update_section_order (section_list, unlikely_segment_start);
-  assert (num_entries = unlikely_segment_end);
-  update_section_order (section_list, num_entries - unlikely_segment_end);
-  /* Map all unlikely code into a new segment.  */
-  if (no_segment == 0)
-unique_segment_for_sections (.text.unlikely_executed, 0, 0x1000,
-section_list + unlikely_segment_start,
-  

Re: [google][4.7] Allow function reordering linker plugin to separate hot and cold code into different ELF segments

2013-01-04 Thread Xinliang David Li
Looks good -- but better with followup :
1) give a warning when the parameter to the option is not allowed;
2) add test cases if possible.

David


On Fri, Jan 4, 2013 at 2:19 PM, Sriraman Tallam tmsri...@google.com wrote:
 Attached new patch.

 Thanks,
 -Sri.

 On Fri, Jan 4, 2013 at 9:12 AM, Rong Xu x...@google.com wrote:
 The code looks fine to me. Please consider David's comments about the
 option name.

 -Rong

 On Thu, Jan 3, 2013 at 9:14 PM, Xinliang David Li davi...@google.com wrote:
 Is it better to change the option to something like:

 split_segment|nosplit-segment
 or split_segment=yes|no


 David

 On Thu, Jan 3, 2013 at 5:41 PM, Sriraman Tallam tmsri...@google.com wrote:
 Hi Rong,

   The following patch modifies the behaviour of the linker plugin to
 not create a separate segment for cold sections by default. Separate
 segments can be created with the plugin option segment=cold. Is this
 alright to commit?

 Thanks,
 -Sri.

 On Mon, Dec 17, 2012 at 11:14 AM, Sriraman Tallam tmsri...@google.com 
 wrote:
 I have committed this patch.

 Thanks,
 -Sri.

 On Fri, Dec 14, 2012 at 4:16 PM, Rong Xu x...@google.com wrote:
 Looks good to me for google/gcc-4_7 branch.

 Thanks,

 -Rong


 On Fri, Dec 14, 2012 at 3:42 PM, Sriraman Tallam tmsri...@google.com
 wrote:

 Hi Rong,

 Please review this code. This code allows the function reordering
 plugin to separate hot and cold code into different ELF segments.
 This would allow optimizations like mapping the hot code alone to huge
 pages.

 With this patch, by default, the plugin maps .text.unlikely
 sections into a separate ELF segment.  This can be turned off with
 plugin option --segment=none.

 The include/plugin-api.h changes are a backport from trunk.

 Thanks,
 -Sri.




Re: [google][4.7] Allow function reordering linker plugin to separate hot and cold code into different ELF segments

2013-01-04 Thread Sriraman Tallam
On Fri, Jan 4, 2013 at 2:32 PM, Xinliang David Li davi...@google.com wrote:
 Looks good -- but better with followup :
 1) give a warning when the parameter to the option is not allowed;
 2) add test cases if possible.

Made all the changes. Modified the test case to check if the segment
splitting API is invoked. The gold linker has a test case to check if
the segment API actually splits segments.

Thanks,
-Sri.


 David


 On Fri, Jan 4, 2013 at 2:19 PM, Sriraman Tallam tmsri...@google.com wrote:
 Attached new patch.

 Thanks,
 -Sri.

 On Fri, Jan 4, 2013 at 9:12 AM, Rong Xu x...@google.com wrote:
 The code looks fine to me. Please consider David's comments about the
 option name.

 -Rong

 On Thu, Jan 3, 2013 at 9:14 PM, Xinliang David Li davi...@google.com 
 wrote:
 Is it better to change the option to something like:

 split_segment|nosplit-segment
 or split_segment=yes|no


 David

 On Thu, Jan 3, 2013 at 5:41 PM, Sriraman Tallam tmsri...@google.com 
 wrote:
 Hi Rong,

   The following patch modifies the behaviour of the linker plugin to
 not create a separate segment for cold sections by default. Separate
 segments can be created with the plugin option segment=cold. Is this
 alright to commit?

 Thanks,
 -Sri.

 On Mon, Dec 17, 2012 at 11:14 AM, Sriraman Tallam tmsri...@google.com 
 wrote:
 I have committed this patch.

 Thanks,
 -Sri.

 On Fri, Dec 14, 2012 at 4:16 PM, Rong Xu x...@google.com wrote:
 Looks good to me for google/gcc-4_7 branch.

 Thanks,

 -Rong


 On Fri, Dec 14, 2012 at 3:42 PM, Sriraman Tallam tmsri...@google.com
 wrote:

 Hi Rong,

 Please review this code. This code allows the function reordering
 plugin to separate hot and cold code into different ELF segments.
 This would allow optimizations like mapping the hot code alone to huge
 pages.

 With this patch, by default, the plugin maps .text.unlikely
 sections into a separate ELF segment.  This can be turned off with
 plugin option --segment=none.

 The include/plugin-api.h changes are a backport from trunk.

 Thanks,
 -Sri.


Index: function_reordering_plugin/function_reordering_plugin.c
===
--- function_reordering_plugin/function_reordering_plugin.c (revision 
194878)
+++ function_reordering_plugin/function_reordering_plugin.c (working copy)
@@ -33,9 +33,13 @@ along with this program; see the file COPYING3.  I
 
This plugin dumps the final layout order of the functions in a file
called final_layout.txt.  To change the output file, pass the new
-   file name with --plugin-opt.  To dump to stderr instead, just pass
-   stderr to --plugin-opt.  */
+   file name with --plugin-opt,file=name.  To dump to stderr instead,
+   just pass stderr as the file name.
 
+   This plugin also allows placing all functions found cold in a separate
+   segment.  This can be enabled with the linker option:
+   --plugin-opt,split_segment=yes.  */
+
 #if HAVE_STDINT_H
 #include stdint.h
 #endif
@@ -89,9 +93,10 @@ static int is_api_exist = 0;
 /* The plugin does nothing when no-op is 1.  */
 static int no_op = 0;
 
-/* The plugin does not create a new segment for unlikely code if
-   no_segment is set.  */
-static int no_segment = 0;
+/* The plugin creates a new segment for unlikely code if split_segment
+   is set.  This can be set with the linker option:
+   --plugin-opt,split_segment=yes.  */
+static int split_segment = 0;
 
 /* Copies new output file name out_file  */
 void get_filename (const char *name)
@@ -110,7 +115,7 @@ process_option (const char *name)
 {
   const char *option_group = group=;
   const char *option_file = file=;
-  const char *option_segment = segment=;
+  const char *option_segment = split_segment=;
 
   /* Check if option is group=  */
   if (strncmp (name, option_group, strlen (option_group)) == 0)
@@ -121,22 +126,26 @@ process_option (const char *name)
no_op = 0;
   return;
 }
-
   /* Check if option is file= */
-  if (strncmp (name, option_file, strlen (option_file)) == 0)
+  else if (strncmp (name, option_file, strlen (option_file)) == 0)
 {
   get_filename (name + strlen (option_file));
   return;
 }
-
-  /* Check if options is segment=none  */
-  if (strncmp (name, option_segment, strlen (option_segment)) == 0)
+  /* Check if options is split_segment=[yes|no]  */
+  else if (strncmp (name, option_segment, strlen (option_segment)) == 0)
 {
-  if (strcmp (name + strlen (option_segment), none) == 0)
-   no_segment = 1;
-  else
-   no_segment = 0;
-  return;
+  const char *option_val = name + strlen (option_segment);
+  if (strcmp (option_val, no) == 0)
+   {
+ split_segment = 0;
+ return;
+   }
+  else if (strcmp (option_val, yes) == 0)
+   {
+ split_segment = 1;
+ return;
+   }
 }
 
   /* Unknown option, set no_op to 1.  */
@@ -244,7 +253,10 @@ claim_file_hook (const struct ld_plugin_input_file
 {
   /* 

Re: [google][4.7] Allow function reordering linker plugin to separate hot and cold code into different ELF segments

2013-01-03 Thread Sriraman Tallam
Hi Rong,

  The following patch modifies the behaviour of the linker plugin to
not create a separate segment for cold sections by default. Separate
segments can be created with the plugin option segment=cold. Is this
alright to commit?

Thanks,
-Sri.

On Mon, Dec 17, 2012 at 11:14 AM, Sriraman Tallam tmsri...@google.com wrote:
 I have committed this patch.

 Thanks,
 -Sri.

 On Fri, Dec 14, 2012 at 4:16 PM, Rong Xu x...@google.com wrote:
 Looks good to me for google/gcc-4_7 branch.

 Thanks,

 -Rong


 On Fri, Dec 14, 2012 at 3:42 PM, Sriraman Tallam tmsri...@google.com
 wrote:

 Hi Rong,

 Please review this code. This code allows the function reordering
 plugin to separate hot and cold code into different ELF segments.
 This would allow optimizations like mapping the hot code alone to huge
 pages.

 With this patch, by default, the plugin maps .text.unlikely
 sections into a separate ELF segment.  This can be turned off with
 plugin option --segment=none.

 The include/plugin-api.h changes are a backport from trunk.

 Thanks,
 -Sri.


Index: function_reordering_plugin/function_reordering_plugin.c
===
--- function_reordering_plugin/function_reordering_plugin.c (revision 
194878)
+++ function_reordering_plugin/function_reordering_plugin.c (working copy)
@@ -34,8 +34,12 @@ along with this program; see the file COPYING3.  I
This plugin dumps the final layout order of the functions in a file
called final_layout.txt.  To change the output file, pass the new
file name with --plugin-opt.  To dump to stderr instead, just pass
-   stderr to --plugin-opt.  */
+   stderr to --plugin-opt.  
 
+   This plugin also allows placing all functions found cold in a separate
+   segment.  This can be enabled with the linker option:
+   --plugin-opt,segment=cold.  */
+
 #if HAVE_STDINT_H
 #include stdint.h
 #endif
@@ -89,9 +93,10 @@ static int is_api_exist = 0;
 /* The plugin does nothing when no-op is 1.  */
 static int no_op = 0;
 
-/* The plugin does not create a new segment for unlikely code if
-   no_segment is set.  */
-static int no_segment = 0;
+/* The plugin creates a new segment for unlikely code if unlikely_segment
+   is set.  This can be set with the linker option:
+   --plugin-opt,segment=cold.  */
+static int unlikely_segment = 0;
 
 /* Copies new output file name out_file  */
 void get_filename (const char *name)
@@ -132,10 +137,11 @@ process_option (const char *name)
   /* Check if options is segment=none  */
   if (strncmp (name, option_segment, strlen (option_segment)) == 0)
 {
-  if (strcmp (name + strlen (option_segment), none) == 0)
-   no_segment = 1;
-  else
-   no_segment = 0;
+  const char *option_val = name + strlen (option_segment);
+  if (strcmp (option_val, none) == 0)
+   unlikely_segment = 0;
+  else if (strcmp (option_val, cold) == 0)
+   unlikely_segment = 1;
   return;
 }
 
@@ -244,7 +250,10 @@ claim_file_hook (const struct ld_plugin_input_file
 {
   /* Inform the linker to prepare for section reordering.  */
   (*allow_section_ordering) ();
-  (*allow_unique_segment_for_sections) ();
+  /* Inform the linker to allow certain sections to be placed in
+a separate segment.  */
+  if (unlikely_segment == 1)
+(*allow_unique_segment_for_sections) ();
   is_ordering_specified = 1;
 }
 
@@ -335,15 +344,29 @@ all_symbols_read_hook (void)
   if (out_file != NULL
strcmp (out_file, stderr) != 0)
 fclose (fp);
-  /* Pass the new order of functions to the linker.  */
-  update_section_order (section_list, unlikely_segment_start);
-  assert (num_entries = unlikely_segment_end);
-  update_section_order (section_list, num_entries - unlikely_segment_end);
-  /* Map all unlikely code into a new segment.  */
-  if (no_segment == 0)
-unique_segment_for_sections (.text.unlikely_executed, 0, 0x1000,
-section_list + unlikely_segment_start,
-unlikely_segment_end - unlikely_segment_start);
+
+  if (unlikely_segment == 1)
+{
+  /* Pass the new order of functions to the linker.  */
+  /* Fix the order of all sections upto the beginning of the
+unlikely section.  */
+  update_section_order (section_list, unlikely_segment_start);
+  assert (num_entries = unlikely_segment_end);
+  /* Fix the order of all sections after the end of the unlikely
+section.  */
+  update_section_order (section_list, num_entries - unlikely_segment_end);
+  /* Map all unlikely code into a new segment.  */
+  unique_segment_for_sections (
+ .text.unlikely_executed, 0, 0x1000,
+ section_list + unlikely_segment_start,
+ unlikely_segment_end - unlikely_segment_start);
+}
+  else
+{
+  /* Pass the new order of functions to the linker.  */
+  update_section_order (section_list, num_entries);
+  

Re: [google][4.7] Allow function reordering linker plugin to separate hot and cold code into different ELF segments

2013-01-03 Thread Xinliang David Li
Is it better to change the option to something like:

split_segment|nosplit-segment
or split_segment=yes|no


David

On Thu, Jan 3, 2013 at 5:41 PM, Sriraman Tallam tmsri...@google.com wrote:
 Hi Rong,

   The following patch modifies the behaviour of the linker plugin to
 not create a separate segment for cold sections by default. Separate
 segments can be created with the plugin option segment=cold. Is this
 alright to commit?

 Thanks,
 -Sri.

 On Mon, Dec 17, 2012 at 11:14 AM, Sriraman Tallam tmsri...@google.com wrote:
 I have committed this patch.

 Thanks,
 -Sri.

 On Fri, Dec 14, 2012 at 4:16 PM, Rong Xu x...@google.com wrote:
 Looks good to me for google/gcc-4_7 branch.

 Thanks,

 -Rong


 On Fri, Dec 14, 2012 at 3:42 PM, Sriraman Tallam tmsri...@google.com
 wrote:

 Hi Rong,

 Please review this code. This code allows the function reordering
 plugin to separate hot and cold code into different ELF segments.
 This would allow optimizations like mapping the hot code alone to huge
 pages.

 With this patch, by default, the plugin maps .text.unlikely
 sections into a separate ELF segment.  This can be turned off with
 plugin option --segment=none.

 The include/plugin-api.h changes are a backport from trunk.

 Thanks,
 -Sri.




Re: [google][4.7] Allow function reordering linker plugin to separate hot and cold code into different ELF segments

2012-12-17 Thread Sriraman Tallam
I have committed this patch.

Thanks,
-Sri.

On Fri, Dec 14, 2012 at 4:16 PM, Rong Xu x...@google.com wrote:
 Looks good to me for google/gcc-4_7 branch.

 Thanks,

 -Rong


 On Fri, Dec 14, 2012 at 3:42 PM, Sriraman Tallam tmsri...@google.com
 wrote:

 Hi Rong,

 Please review this code. This code allows the function reordering
 plugin to separate hot and cold code into different ELF segments.
 This would allow optimizations like mapping the hot code alone to huge
 pages.

 With this patch, by default, the plugin maps .text.unlikely
 sections into a separate ELF segment.  This can be turned off with
 plugin option --segment=none.

 The include/plugin-api.h changes are a backport from trunk.

 Thanks,
 -Sri.




[google][4.7] Allow function reordering linker plugin to separate hot and cold code into different ELF segments

2012-12-14 Thread Sriraman Tallam
Hi Rong,

Please review this code. This code allows the function reordering
plugin to separate hot and cold code into different ELF segments.
This would allow optimizations like mapping the hot code alone to huge
pages.

With this patch, by default, the plugin maps .text.unlikely
sections into a separate ELF segment.  This can be turned off with
plugin option --segment=none.

The include/plugin-api.h changes are a backport from trunk.

Thanks,
-Sri.
Index: function_reordering_plugin/function_reordering_plugin.c
===
--- function_reordering_plugin/function_reordering_plugin.c (revision 
194505)
+++ function_reordering_plugin/function_reordering_plugin.c (working copy)
@@ -74,6 +74,9 @@ static ld_plugin_get_input_section_name get_input_
 static ld_plugin_get_input_section_contents get_input_section_contents = NULL;
 static ld_plugin_update_section_order update_section_order = NULL;
 static ld_plugin_allow_section_ordering allow_section_ordering = NULL;
+static ld_plugin_allow_unique_segment_for_sections 
+allow_unique_segment_for_sections = NULL;
+static ld_plugin_unique_segment_for_sections unique_segment_for_sections = 
NULL;
 
 /* The file where the final function order will be stored.
It can be set by using the  plugin option  as --plugin-opt
@@ -86,6 +89,10 @@ static int is_api_exist = 0;
 /* The plugin does nothing when no-op is 1.  */
 static int no_op = 0;
 
+/* The plugin does not create a new segment for unlikely code if
+   no_segment is set.  */
+static int no_segment = 0;
+
 /* Copies new output file name out_file  */
 void get_filename (const char *name)
 {
@@ -96,12 +103,14 @@ void get_filename (const char *name)
 /* Process options to plugin.  Options with prefix group= are special.
They specify the type of grouping. The option group=none makes the
plugin do nothing.   Options with prefix file= set the output file
-   where the final function order must be stored.  */
+   where the final function order must be stored.  Option segment=none
+   does not place the cold code in a separate ELF segment.  */
 void
 process_option (const char *name)
 {
   const char *option_group = group=;
   const char *option_file = file=;
+  const char *option_segment = segment=;
 
   /* Check if option is group=  */
   if (strncmp (name, option_group, strlen (option_group)) == 0)
@@ -120,6 +129,16 @@ process_option (const char *name)
   return;
 }
 
+  /* Check if options is segment=none  */
+  if (strncmp (name, option_segment, strlen (option_segment)) == 0)
+{
+  if (strcmp (name + strlen (option_segment), none) == 0)
+   no_segment = 1;
+  else
+   no_segment = 0;
+  return;
+}
+
   /* Unknown option, set no_op to 1.  */
   no_op = 1;
   fprintf (stderr, Unknown option to function reordering plugin :%s\n,
@@ -169,6 +188,13 @@ onload (struct ld_plugin_tv *tv)
case LDPT_ALLOW_SECTION_ORDERING:
  allow_section_ordering = *entry-tv_u.tv_allow_section_ordering;
  break;
+   case LDPT_ALLOW_UNIQUE_SEGMENT_FOR_SECTIONS:
+ allow_unique_segment_for_sections
+ = *entry-tv_u.tv_allow_unique_segment_for_sections;
+ break;
+   case LDPT_UNIQUE_SEGMENT_FOR_SECTIONS:
+ unique_segment_for_sections = 
*entry-tv_u.tv_unique_segment_for_sections;
+ break;
 default:
   break;
 }
@@ -183,7 +209,9 @@ onload (struct ld_plugin_tv *tv)
get_input_section_name != NULL
get_input_section_contents != NULL
update_section_order != NULL
-   allow_section_ordering != NULL)
+   allow_section_ordering != NULL
+   allow_unique_segment_for_sections != NULL
+   unique_segment_for_sections != NULL)
 is_api_exist = 1;
   else
 return LDPS_OK;
@@ -216,6 +244,7 @@ claim_file_hook (const struct ld_plugin_input_file
 {
   /* Inform the linker to prepare for section reordering.  */
   (*allow_section_ordering) ();
+  (*allow_unique_segment_for_sections) ();
   is_ordering_specified = 1;
 }
 
@@ -259,6 +288,11 @@ claim_file_hook (const struct ld_plugin_input_file
 /* This function is called by the linker after all the symbols have been read.
At this stage, it is fine to tell the linker the desired function order.  */
 
+/* These globals are set to the start and end of the unlikely function sections
+   in the section list, which can then be mapped to a separate segment.  */
+extern int unlikely_segment_start;
+extern int unlikely_segment_end;
+
 enum ld_plugin_status
 all_symbols_read_hook (void)
 {
@@ -302,7 +336,14 @@ all_symbols_read_hook (void)
strcmp (out_file, stderr) != 0)
 fclose (fp);
   /* Pass the new order of functions to the linker.  */
-  update_section_order (section_list, num_entries);
+  update_section_order (section_list, unlikely_segment_start);
+  assert (num_entries  unlikely_segment_end);
+  update_section_order