Re: [PATCH] Add support for putting jump table into relocation read-only section

2020-09-08 Thread Segher Boessenkool
Hi!

On Mon, Aug 24, 2020 at 03:53:44PM +0800, HAO CHEN GUI wrote:
>   abs_jump_table = (!CASE_VECTOR_PC_RELATIVE
>                                     && 
> !targetm.asm_out.generate_pic_addr_diff_vec ()) ? 1 : 0;

  x = y ? 1 : 0;

is the same as

  x = y;

if y is already only 0 or 1, and otherwise it is

  x = !!y;

You can also write this as an "if", that often is more readable.

> @@ -2491,9 +2491,17 @@ final_scan_insn_1 (rtx_insn *insn, FILE *file, int 
> optimize_p ATTRIBUTE_UNUSED,
> if (! JUMP_TABLES_IN_TEXT_SECTION)
>   {
> int log_align;
> +   bool reloc;

> +extern section *default_function_rodata_section (tree, bool reloc);
> +extern section *default_no_function_rodata_section (tree, bool reloc);

"reloc" is an int elsewhere, and can have 4 values.  And you have to
interact with that code (mostly in varasm.c), so don't use the same name
meaning something else?


You need an RTL maintainer or global maintainer to review this...


Segher


Re: [PATCH] Add support for putting jump table into relocation read-only section

2020-08-24 Thread HAO CHEN GUI via Gcc-patches

Hi,

I revised the patch according to the advice. The attachment is the 
revised change log and diff file. Thanks a lot.


Now it first judges if it's absolute jump table or not. Then decide if 
the relocation is needed.


  abs_jump_table = (!CASE_VECTOR_PC_RELATIVE
                                    && 
!targetm.asm_out.generate_pic_addr_diff_vec ()) ? 1 : 0;


  reloc = (abs_jump_table && targetm.asm_out.reloc_rw_mask ());


  switch_to_section (targetm.asm_out.function_rodata_section
                                 (current_function_decl, reloc));

On 17/8/2020 下午 10:50, Segher Boessenkool wrote:

Hi!

On Mon, Aug 17, 2020 at 10:28:31AM +0800, HAO CHEN GUI wrote:

For the reloc,  my understanding is the jump table needs to be
relocated if it's a non-relative jump table and PIC flag is set at the
same time.

Yes, I did say the *existing* code seems sub-optimal, too :-)


According to the slice of code in stmt.c,  the non-relative jump table
is created with PIC flag set when CASE_VECTOR_PC_RELATIVE is false,
flag_pic is true and targetm.asm_out.generate_pic_addr_diff_vec is
false. So I set the reloc to

reloc = (! CASE_VECTOR_PC_RELATIVE && flag_pic &&
    ! targetm.asm_out.generate_pic_addr_diff_vec ()) ? 1
: 0;

The funcation_rodata_section is not only for jump tables. It's no
relro in other cases. I am not sure if it's suitable to put selecting
relro section in it. Of course, I can create a separate function for
section selection of jump table and send its output to
funcation_rodata_section.

.data.rel.ro is just another kind of .rodata, one that *can* be
relocated.  So when we use it, fPIC or not doesn't matter.  Also, we can
just use the existing rodata functions for generating .data.rel.ro, and
it should simplify all code even.


-@deftypefn {Target Hook} {section *} TARGET_ASM_FUNCTION_RODATA_SECTION (tree 
@var{decl})
-Return the readonly data section associated with
+@deftypefn {Target Hook} {section *} TARGET_ASM_FUNCTION_RODATA_SECTION (tree 
@var{decl}, bool @var{section_reloc})
+Return the readonly or reloc readonly data section associated with

Should this take the 2-bit int "reloc" field like other functions,
instead of this bool?


Segher
* final.c (final_scan_insn_1): Judge if a jump table is relative or
absoluted, and if it needs to be relocated.
* output.h (default_function_rodata_section,
default_no_function_rodata_section): Add the second argument to the
declarations.
* target.def (function_rodata_section): Change the doc and add
the second argument.
* doc/tm.texi: Regenerate.
* varasm.c (default_function_rodata_section): Add the second argument
to default_function_rodata_section. It indicates the section should be
read-only or relocated read-only.
(default_no_function_rodata_section): Add the second argument.
(function_mergeable_rodata_prefix): Set the second argument to false
when default_function_rodata_section calls function_rodata_section.
* config/mips/mips.c (mips_function_rodata_section): Add the second
arugment and set it to false when it calls function_rodata_section.
* config/s390/s390.c (targetm.asm_out.function_rodata_section): Set
the second argument to false.
* config/s390/s390.md Likewise.
diff --git a/gcc/config/mips/mips.c b/gcc/config/mips/mips.c
index 513fc5fe295..b22a7161052 100644
--- a/gcc/config/mips/mips.c
+++ b/gcc/config/mips/mips.c
@@ -9315,10 +9315,10 @@ mips_select_rtx_section (machine_mode mode, rtx x,
default_function_rodata_section.  */
 
 static section *
-mips_function_rodata_section (tree decl)
+mips_function_rodata_section (tree decl, bool reloc ATTRIBUTE_UNUSED)
 {
   if (!TARGET_ABICALLS || TARGET_ABSOLUTE_ABICALLS || TARGET_GPWORD)
-return default_function_rodata_section (decl);
+return default_function_rodata_section (decl, false);
 
   if (decl && DECL_SECTION_NAME (decl))
 {
index 758315c0c72..eb619d39ad7 100644
--- a/gcc/config/s390/s390.c
+++ b/gcc/config/s390/s390.c
@@ -11639,7 +11639,7 @@ s390_output_split_stack_data (rtx parm_block, rtx 
call_done,
   rtx ops[] = { parm_block, call_done };
 
   switch_to_section (targetm.asm_out.function_rodata_section
-(current_function_decl));
+(current_function_decl, false));
 
   if (TARGET_64BIT)
 output_asm_insn (".align\t8", NULL);
diff --git a/gcc/config/s390/s390.md b/gcc/config/s390/s390.md
index cd1c0634b71..6ca03ed9002 100644
--- a/gcc/config/s390/s390.md
+++ b/gcc/config/s390/s390.md
@@ -11218,7 +11218,7 @@
   ""
 {
   switch_to_section (targetm.asm_out.function_rodata_section
-(current_function_decl));
+(current_function_decl, false));
   return "";
 }
   [(set_attr "length" "0")])
diff --git a/gcc/doc/tm.texi b/gcc/doc/tm.texi
index 6e7d9dc54a9..b19609f9c96 100644
--- a/gcc/doc/tm.texi
+++ b/gcc/doc/tm.texi
@@ -7703,13 

Re: [PATCH] Add support for putting jump table into relocation read-only section

2020-08-17 Thread Segher Boessenkool
Hi!

On Mon, Aug 17, 2020 at 10:28:31AM +0800, HAO CHEN GUI wrote:
> >For the reloc,  my understanding is the jump table needs to be 
> >relocated if it's a non-relative jump table and PIC flag is set at the 
> >same time.

Yes, I did say the *existing* code seems sub-optimal, too :-)

> >According to the slice of code in stmt.c,  the non-relative jump table 
> >is created with PIC flag set when CASE_VECTOR_PC_RELATIVE is false, 
> >flag_pic is true and targetm.asm_out.generate_pic_addr_diff_vec is 
> >false. So I set the reloc to
> >
> >reloc = (! CASE_VECTOR_PC_RELATIVE && flag_pic &&
> >   ! targetm.asm_out.generate_pic_addr_diff_vec ()) ? 1 
> >: 0;
> >
> >The funcation_rodata_section is not only for jump tables. It's no 
> >relro in other cases. I am not sure if it's suitable to put selecting 
> >relro section in it. Of course, I can create a separate function for 
> >section selection of jump table and send its output to 
> >funcation_rodata_section.

.data.rel.ro is just another kind of .rodata, one that *can* be
relocated.  So when we use it, fPIC or not doesn't matter.  Also, we can
just use the existing rodata functions for generating .data.rel.ro, and
it should simplify all code even.

> -@deftypefn {Target Hook} {section *} TARGET_ASM_FUNCTION_RODATA_SECTION 
> (tree @var{decl})
> -Return the readonly data section associated with
> +@deftypefn {Target Hook} {section *} TARGET_ASM_FUNCTION_RODATA_SECTION 
> (tree @var{decl}, bool @var{section_reloc})
> +Return the readonly or reloc readonly data section associated with

Should this take the 2-bit int "reloc" field like other functions,
instead of this bool?


Segher


Re: [PATCH] Add support for putting jump table into relocation read-only section

2020-08-16 Thread HAO CHEN GUI via Gcc-patches

Segher,

Please ignore the attachments in my last email. My editor cached the old 
things. Now they should be correct. Sorry for that.




On 17/8/2020 上午 10:20, HAO CHEN GUI wrote:

Segher,

Seems I sent the wrong diff file. Now the attachments should be 
correct ones. Sorry for that.


For the reloc,  my understanding is the jump table needs to be 
relocated if it's a non-relative jump table and PIC flag is set at the 
same time.


//stmt.c

 if (CASE_VECTOR_PC_RELATIVE
  || (flag_pic && targetm.asm_out.generate_pic_addr_diff_vec ()))
    emit_jump_table_data (gen_rtx_ADDR_DIFF_VEC (CASE_VECTOR_MODE,
 gen_rtx_LABEL_REF 
(Pmode,

table_label),
 gen_rtvec_v (ncases, 
labelvec),
 const0_rtx, 
const0_rtx));

  else
    emit_jump_table_data (gen_rtx_ADDR_VEC (CASE_VECTOR_MODE,
    gen_rtvec_v (ncases, 
labelvec)));


According to the slice of code in stmt.c,  the non-relative jump table 
is created with PIC flag set when CASE_VECTOR_PC_RELATIVE is false, 
flag_pic is true and targetm.asm_out.generate_pic_addr_diff_vec is 
false. So I set the reloc to


reloc = (! CASE_VECTOR_PC_RELATIVE && flag_pic &&
   ! targetm.asm_out.generate_pic_addr_diff_vec ()) ? 1 : 0;

The funcation_rodata_section is not only for jump tables. It's no 
relro in other cases. I am not sure if it's suitable to put selecting 
relro section in it. Of course, I can create a separate function for 
section selection of jump table and send its output to 
funcation_rodata_section.


Please advice. Thanks a lot.


On 15/8/2020 上午 7:39, Segher Boessenkool wrote:


Hi!

On Fri, Aug 14, 2020 at 03:20:03PM +0800, HAO CHEN GUI wrote:

section *
select_jump_table_section (tree decl)
{
   int reloc;
   bool section_reloc;

   reloc = (! CASE_VECTOR_PC_RELATIVE && flag_pic &&
    ! targetm.asm_out.generate_pic_addr_diff_vec ()) ? 1 :
0;

(Modern style is no space after "!", and your mailer wrapped the code).


   section_reloc = (reloc & targetm.asm_out.reloc_rw_mask ());

(No space after & either).

   return targetm.asm_out.function_rodata_section (decl, 
section_reloc);

So you are saying it should not go into relro if either there is no pic
flag, the targets are pc relative, or pic uses some address diff?

This seems too complicated, and/or not the right abstraction.



diff --git a/gcc/doc/tm.texi.in b/gcc/doc/tm.texi.in
index 3be984bbd5c..0ac1488c837 100644
--- a/gcc/doc/tm.texi.in
+++ b/gcc/doc/tm.texi.in
@@ -5007,6 +5007,8 @@ it is unlikely to be called.
    @hook TARGET_ASM_FUNCTION_RODATA_SECTION
  +@hook TARGET_ASM_FUNCTION_RELRO_SECTION

I would expect people to just use TARGET_ASM_FUNCTION_RODATA_SECTION to
get the .data.rel.ro?  With another argument then.


+section *
+select_jump_table_section (tree decl)
+{
+  int relco;

"reloc"?


+  relco = JUMP_TABLES_IN_RELRO;

Just put that on the same line as the declaration?


+  if (relco & targetm.asm_out.reloc_rw_mask ())
+    return targetm.asm_out.function_relro_section (decl);
+  else
+    return targetm.asm_out.function_rodata_section (decl);
+}

(trailing spaces btw)

@@ -2492,7 +2513,7 @@ final_scan_insn_1 (rtx_insn *insn, FILE *file, 
int optimize_p ATTRIBUTE_UNUSED,

  {
    int log_align;
  -  switch_to_section (targetm.asm_out.function_rodata_section
+  switch_to_section (select_jump_table_section
   (current_function_decl));

  section *section
    = select_jump_table_section (current_function_decl));
  switch_to_section (section);

(but it would be better if we didn't indent so deeply here).


I think this should be split into a function just selecting the relro
section (either directly, or from the rodata selection function), and
then separately the jumptable section thing.

There is a lot of stuff here that seems confused, and a lot of that
already was there :-(


Segher
* final.c (select_jump_table_section): Implement a function to select 
the section of jump tables by reloc_rw_mask and other flags.
* output.h (default_function_rodata_section, 
default_no_function_rodata_section):
Add the second argument to the declarations.
* target.def (function_rodata_section): Change the doc and add the 
second argument.
* doc/tm.texi: Regenerate.
* varasm.c (default_function_rodata_section, 
default_no_function_rodata_section, 
function_mergeable_rodata_prefix): Add the second argument in 
default_function_rodata_section.
It indicates the section should be read-only or relocation 
read-only.
Add the second argument in default_function_rodata_section. Set 
the second argument to
false when default_function_rodata_section calls 
function_rodata_section.

Re: [PATCH] Add support for putting jump table into relocation read-only section

2020-08-16 Thread HAO CHEN GUI via Gcc-patches

Segher,

Seems I sent the wrong diff file. Now the attachments should be correct 
ones. Sorry for that.


For the reloc,  my understanding is the jump table needs to be relocated 
if it's a non-relative jump table and PIC flag is set at the same time.


//stmt.c

 if (CASE_VECTOR_PC_RELATIVE
  || (flag_pic && targetm.asm_out.generate_pic_addr_diff_vec ()))
    emit_jump_table_data (gen_rtx_ADDR_DIFF_VEC (CASE_VECTOR_MODE,
 gen_rtx_LABEL_REF (Pmode,
table_label),
 gen_rtvec_v (ncases, 
labelvec),

 const0_rtx, const0_rtx));
  else
    emit_jump_table_data (gen_rtx_ADDR_VEC (CASE_VECTOR_MODE,
    gen_rtvec_v (ncases, 
labelvec)));


According to the slice of code in stmt.c,  the non-relative jump table 
is created with PIC flag set when CASE_VECTOR_PC_RELATIVE is false, 
flag_pic is true and targetm.asm_out.generate_pic_addr_diff_vec is 
false. So I set the reloc to


reloc = (! CASE_VECTOR_PC_RELATIVE && flag_pic &&
   ! targetm.asm_out.generate_pic_addr_diff_vec ()) ? 1 : 0;

The funcation_rodata_section is not only for jump tables. It's no relro 
in other cases. I am not sure if it's suitable to put selecting relro 
section in it. Of course, I can create a separate function for section 
selection of jump table and send its output to funcation_rodata_section.


Please advice. Thanks a lot.


On 15/8/2020 上午 7:39, Segher Boessenkool wrote:


Hi!

On Fri, Aug 14, 2020 at 03:20:03PM +0800, HAO CHEN GUI wrote:

section *
select_jump_table_section (tree decl)
{
   int reloc;
   bool section_reloc;

   reloc = (! CASE_VECTOR_PC_RELATIVE && flag_pic &&
    ! targetm.asm_out.generate_pic_addr_diff_vec ()) ? 1 :
0;

(Modern style is no space after "!", and your mailer wrapped the code).


   section_reloc = (reloc & targetm.asm_out.reloc_rw_mask ());

(No space after & either).


   return targetm.asm_out.function_rodata_section (decl, section_reloc);

So you are saying it should not go into relro if either there is no pic
flag, the targets are pc relative, or pic uses some address diff?

This seems too complicated, and/or not the right abstraction.



diff --git a/gcc/doc/tm.texi.in b/gcc/doc/tm.texi.in
index 3be984bbd5c..0ac1488c837 100644
--- a/gcc/doc/tm.texi.in
+++ b/gcc/doc/tm.texi.in
@@ -5007,6 +5007,8 @@ it is unlikely to be called.
  
  @hook TARGET_ASM_FUNCTION_RODATA_SECTION
  
+@hook TARGET_ASM_FUNCTION_RELRO_SECTION

I would expect people to just use TARGET_ASM_FUNCTION_RODATA_SECTION to
get the .data.rel.ro?  With another argument then.


+section *
+select_jump_table_section (tree decl)
+{
+  int relco;

"reloc"?


+  relco = JUMP_TABLES_IN_RELRO;

Just put that on the same line as the declaration?


+  if (relco & targetm.asm_out.reloc_rw_mask ())
+return targetm.asm_out.function_relro_section (decl);
+  else
+return targetm.asm_out.function_rodata_section (decl);
+}

(trailing spaces btw)


@@ -2492,7 +2513,7 @@ final_scan_insn_1 (rtx_insn *insn, FILE *file, int 
optimize_p ATTRIBUTE_UNUSED,
{
  int log_align;
  
-	  switch_to_section (targetm.asm_out.function_rodata_section

+ switch_to_section (select_jump_table_section
 (current_function_decl));

  section *section
= select_jump_table_section (current_function_decl));
  switch_to_section (section);

(but it would be better if we didn't indent so deeply here).


I think this should be split into a function just selecting the relro
section (either directly, or from the rodata selection function), and
then separately the jumptable section thing.

There is a lot of stuff here that seems confused, and a lot of that
already was there :-(


Segher
diff --git a/gcc/doc/tm.texi b/gcc/doc/tm.texi
index 6e7d9dc54a9..3ff7527f2cc 100644
--- a/gcc/doc/tm.texi
+++ b/gcc/doc/tm.texi
@@ -7712,6 +7712,15 @@ if function is in @code{.text.name}, and the normal 
readonly-data section
 otherwise.
 @end deftypefn
 
+@deftypefn {Target Hook} {section *} TARGET_ASM_FUNCTION_RELRO_SECTION (tree 
@var{decl})
+Return the relro section associated with
+@samp{DECL_SECTION_NAME (@var{decl})}.
+The default version of this function selects @code{.gnu.linkonce.r.name} if
+the function's section is @code{.gnu.linkonce.t.name}, 
+@code{.data.rel.ro.name} if function is in @code{.text.name}, 
+and the normal data relro section otherwise.
+@end deftypefn
+
 @deftypevr {Target Hook} {const char *} TARGET_ASM_MERGEABLE_RODATA_PREFIX
 Usually, the compiler uses the prefix @code{".rodata"} to construct
 section names for mergeable constant data.  Define this macro to override
diff --git a/gcc/doc/tm.texi.in b/gcc/doc/tm.texi.in
index 3be984bbd5c..0ac1488c837 100644
--- a/gcc/doc/tm.texi.in
+++ b/gcc/doc/tm.texi.in
@@ -5007,6 +5007,8 @@ it is unlikely to be 

Re: [PATCH] Add support for putting jump table into relocation read-only section

2020-08-14 Thread Segher Boessenkool
Hi!

On Fri, Aug 14, 2020 at 03:20:03PM +0800, HAO CHEN GUI wrote:
> section *
> select_jump_table_section (tree decl)
> {
>   int reloc;
>   bool section_reloc;
> 
>   reloc = (! CASE_VECTOR_PC_RELATIVE && flag_pic &&
>    ! targetm.asm_out.generate_pic_addr_diff_vec ()) ? 1 : 
> 0;

(Modern style is no space after "!", and your mailer wrapped the code).

>   section_reloc = (reloc & targetm.asm_out.reloc_rw_mask ());

(No space after & either).

>   return targetm.asm_out.function_rodata_section (decl, section_reloc);

So you are saying it should not go into relro if either there is no pic
flag, the targets are pc relative, or pic uses some address diff?

This seems too complicated, and/or not the right abstraction.


> diff --git a/gcc/doc/tm.texi.in b/gcc/doc/tm.texi.in
> index 3be984bbd5c..0ac1488c837 100644
> --- a/gcc/doc/tm.texi.in
> +++ b/gcc/doc/tm.texi.in
> @@ -5007,6 +5007,8 @@ it is unlikely to be called.
>  
>  @hook TARGET_ASM_FUNCTION_RODATA_SECTION
>  
> +@hook TARGET_ASM_FUNCTION_RELRO_SECTION

I would expect people to just use TARGET_ASM_FUNCTION_RODATA_SECTION to
get the .data.rel.ro?  With another argument then.

> +section *
> +select_jump_table_section (tree decl)
> +{
> +  int relco;

"reloc"?

> +  relco = JUMP_TABLES_IN_RELRO;

Just put that on the same line as the declaration?

> +  if (relco & targetm.asm_out.reloc_rw_mask ())
> +return targetm.asm_out.function_relro_section (decl);
> +  else 
> +return targetm.asm_out.function_rodata_section (decl);
> +}

(trailing spaces btw)

> @@ -2492,7 +2513,7 @@ final_scan_insn_1 (rtx_insn *insn, FILE *file, int 
> optimize_p ATTRIBUTE_UNUSED,
>   {
> int log_align;
>  
> -   switch_to_section (targetm.asm_out.function_rodata_section
> +   switch_to_section (select_jump_table_section
>(current_function_decl));

  section *section
= select_jump_table_section (current_function_decl));
  switch_to_section (section);

(but it would be better if we didn't indent so deeply here).


I think this should be split into a function just selecting the relro
section (either directly, or from the rodata selection function), and
then separately the jumptable section thing.

There is a lot of stuff here that seems confused, and a lot of that
already was there :-(


Segher


[PATCH] Add support for putting jump table into relocation read-only section

2020-08-14 Thread HAO CHEN GUI via Gcc-patches

Hi,

This patch adds a section selection for jump tables. The jump tables can 
be put into read-only data section or relocation read-only data section 
by the relocation flags. When the PIC flag is set and jump table is 
non-relative, the jump table is put into relocation read-only section.


section *
select_jump_table_section (tree decl)
{
  int reloc;
  bool section_reloc;

  reloc = (! CASE_VECTOR_PC_RELATIVE && flag_pic &&
   ! targetm.asm_out.generate_pic_addr_diff_vec ()) ? 1 : 0;

  section_reloc = (reloc & targetm.asm_out.reloc_rw_mask ());
  return targetm.asm_out.function_rodata_section (decl, section_reloc);
}

The attachments are the patch diff file and change log file.

Bootstrapped and tested on powerpc64le-linux-gnu with no regressions.  
Is this okay for trunk? Any recommendations? Thanks a lot.


* final.c (select_jump_table_section): Implement a function to select 
the section of jump tables by reloc_rw_mask and other flags.
* output.h (default_function_rodata_section, 
default_no_function_rodata_section):
Add the second argument to the declarations.
* target.def (function_rodata_section): Change the doc and add the 
second argument.
* doc/tm.texi: Regenerate.
* varasm.c (default_function_rodata_section, 
default_no_function_rodata_section, 
function_mergeable_rodata_prefix): Add the second argument in 
default_function_rodata_section.
It indicates the section should be read-only or relocation 
read-only.
Add the second argument in default_function_rodata_section. Set 
the second argument to
false when default_function_rodata_section calls 
function_rodata_section.
* config/mips/mips.c (mips_function_rodata_section): Add the 
second arugment and set it
to false when it calls function_rodata_section.
* config/s390/s390.c (targetm.asm_out.function_rodata_section): 
Set the second argument to false.
* config/s390/s390.md Likewise.diff --git a/gcc/doc/tm.texi b/gcc/doc/tm.texi
index 6e7d9dc54a9..3ff7527f2cc 100644
--- a/gcc/doc/tm.texi
+++ b/gcc/doc/tm.texi
@@ -7712,6 +7712,15 @@ if function is in @code{.text.name}, and the normal 
readonly-data section
 otherwise.
 @end deftypefn
 
+@deftypefn {Target Hook} {section *} TARGET_ASM_FUNCTION_RELRO_SECTION (tree 
@var{decl})
+Return the relro section associated with
+@samp{DECL_SECTION_NAME (@var{decl})}.
+The default version of this function selects @code{.gnu.linkonce.r.name} if
+the function's section is @code{.gnu.linkonce.t.name}, 
+@code{.data.rel.ro.name} if function is in @code{.text.name}, 
+and the normal data relro section otherwise.
+@end deftypefn
+
 @deftypevr {Target Hook} {const char *} TARGET_ASM_MERGEABLE_RODATA_PREFIX
 Usually, the compiler uses the prefix @code{".rodata"} to construct
 section names for mergeable constant data.  Define this macro to override
diff --git a/gcc/doc/tm.texi.in b/gcc/doc/tm.texi.in
index 3be984bbd5c..0ac1488c837 100644
--- a/gcc/doc/tm.texi.in
+++ b/gcc/doc/tm.texi.in
@@ -5007,6 +5007,8 @@ it is unlikely to be called.
 
 @hook TARGET_ASM_FUNCTION_RODATA_SECTION
 
+@hook TARGET_ASM_FUNCTION_RELRO_SECTION
+
 @hook TARGET_ASM_MERGEABLE_RODATA_PREFIX
 
 @hook TARGET_ASM_TM_CLONE_TABLE_SECTION
diff --git a/gcc/final.c b/gcc/final.c
index a3601964a8d..ba198182663 100644
--- a/gcc/final.c
+++ b/gcc/final.c
@@ -107,6 +107,10 @@ along with GCC; see the file COPYING3.  If not see
 #define JUMP_TABLES_IN_TEXT_SECTION 0
 #endif
 
+#ifndef JUMP_TABLES_IN_RELRO
+#define JUMP_TABLES_IN_RELRO 0
+#endif
+
 /* Bitflags used by final_scan_insn.  */
 #define SEEN_NOTE  1
 #define SEEN_EMITTED   2
@@ -2154,6 +2158,23 @@ asm_show_source (const char *filename, int linenum)
   fputc ('\n', asm_out_file);
 }
 
+/* Select sections for jump table.
+   If the jump table need to be relocated, 
+   select relro sections. Otherwise in readonly section */
+
+section *
+select_jump_table_section (tree decl)
+{
+  int relco;
+
+  relco = JUMP_TABLES_IN_RELRO;
+
+  if (relco & targetm.asm_out.reloc_rw_mask ())
+return targetm.asm_out.function_relro_section (decl);
+  else 
+return targetm.asm_out.function_rodata_section (decl);
+}
+
 /* The final scan for one insn, INSN.
Args are same as in `final', except that INSN
is the insn being scanned.
@@ -2492,7 +2513,7 @@ final_scan_insn_1 (rtx_insn *insn, FILE *file, int 
optimize_p ATTRIBUTE_UNUSED,
{
  int log_align;
 
- switch_to_section (targetm.asm_out.function_rodata_section
+ switch_to_section (select_jump_table_section
 (current_function_decl));
 
 #ifdef ADDR_VEC_ALIGN
@@ -2571,7 +2592,7 @@ final_scan_insn_1 (rtx_insn *insn, FILE *file, int 
optimize_p ATTRIBUTE_UNUSED,
 #endif
 
if (! JUMP_TABLES_IN_TEXT_SECTION)
- 

[PATCH] Add support for putting jump table into relocation read-only section

2020-08-14 Thread HAO CHEN GUI via Gcc-patches

Hi,

This patch adds a section selection for jump tables. The jump tables can 
be put into read-only data section or relocation read-only data section 
by the relocation flags. When the PIC flag is set and jump table is 
non-relative, the jump table is put into relocation read-only section.


section *
select_jump_table_section (tree decl)
{
  int reloc;
  bool section_reloc;

  reloc = (! CASE_VECTOR_PC_RELATIVE && flag_pic &&
   ! targetm.asm_out.generate_pic_addr_diff_vec ()) ? 1 : 0;

  section_reloc = (reloc & targetm.asm_out.reloc_rw_mask ());
  return targetm.asm_out.function_rodata_section (decl, section_reloc);
}

The attachments are the patch diff file and change log file.

Bootstrapped and tested on powerpc64le-linux-gnu with no regressions.  
Is this okay for trunk? Any recommendations? Thanks a lot.


* final.c (select_jump_table_section): Implement a function to select 
the section of jump tables by reloc_rw_mask and other flags.
* output.h (default_function_rodata_section, 
default_no_function_rodata_section):
Add the second argument to the declarations.
* target.def (function_rodata_section): Change the doc and add the 
second argument.
* doc/tm.texi: Regenerate.
* varasm.c (default_function_rodata_section, 
default_no_function_rodata_section, 
function_mergeable_rodata_prefix): Add the second argument in 
default_function_rodata_section.
It indicates the section should be read-only or relocation 
read-only.
Add the second argument in default_function_rodata_section. Set 
the second argument to
false when default_function_rodata_section calls 
function_rodata_section.
* config/mips/mips.c (mips_function_rodata_section): Add the 
second arugment and set it
to false when it calls function_rodata_section.
* config/s390/s390.c (targetm.asm_out.function_rodata_section): 
Set the second argument to false.
* config/s390/s390.md Likewise.diff --git a/gcc/doc/tm.texi b/gcc/doc/tm.texi
index 6e7d9dc54a9..3ff7527f2cc 100644
--- a/gcc/doc/tm.texi
+++ b/gcc/doc/tm.texi
@@ -7712,6 +7712,15 @@ if function is in @code{.text.name}, and the normal 
readonly-data section
 otherwise.
 @end deftypefn
 
+@deftypefn {Target Hook} {section *} TARGET_ASM_FUNCTION_RELRO_SECTION (tree 
@var{decl})
+Return the relro section associated with
+@samp{DECL_SECTION_NAME (@var{decl})}.
+The default version of this function selects @code{.gnu.linkonce.r.name} if
+the function's section is @code{.gnu.linkonce.t.name}, 
+@code{.data.rel.ro.name} if function is in @code{.text.name}, 
+and the normal data relro section otherwise.
+@end deftypefn
+
 @deftypevr {Target Hook} {const char *} TARGET_ASM_MERGEABLE_RODATA_PREFIX
 Usually, the compiler uses the prefix @code{".rodata"} to construct
 section names for mergeable constant data.  Define this macro to override
diff --git a/gcc/doc/tm.texi.in b/gcc/doc/tm.texi.in
index 3be984bbd5c..0ac1488c837 100644
--- a/gcc/doc/tm.texi.in
+++ b/gcc/doc/tm.texi.in
@@ -5007,6 +5007,8 @@ it is unlikely to be called.
 
 @hook TARGET_ASM_FUNCTION_RODATA_SECTION
 
+@hook TARGET_ASM_FUNCTION_RELRO_SECTION
+
 @hook TARGET_ASM_MERGEABLE_RODATA_PREFIX
 
 @hook TARGET_ASM_TM_CLONE_TABLE_SECTION
diff --git a/gcc/final.c b/gcc/final.c
index a3601964a8d..ba198182663 100644
--- a/gcc/final.c
+++ b/gcc/final.c
@@ -107,6 +107,10 @@ along with GCC; see the file COPYING3.  If not see
 #define JUMP_TABLES_IN_TEXT_SECTION 0
 #endif
 
+#ifndef JUMP_TABLES_IN_RELRO
+#define JUMP_TABLES_IN_RELRO 0
+#endif
+
 /* Bitflags used by final_scan_insn.  */
 #define SEEN_NOTE  1
 #define SEEN_EMITTED   2
@@ -2154,6 +2158,23 @@ asm_show_source (const char *filename, int linenum)
   fputc ('\n', asm_out_file);
 }
 
+/* Select sections for jump table.
+   If the jump table need to be relocated, 
+   select relro sections. Otherwise in readonly section */
+
+section *
+select_jump_table_section (tree decl)
+{
+  int relco;
+
+  relco = JUMP_TABLES_IN_RELRO;
+
+  if (relco & targetm.asm_out.reloc_rw_mask ())
+return targetm.asm_out.function_relro_section (decl);
+  else 
+return targetm.asm_out.function_rodata_section (decl);
+}
+
 /* The final scan for one insn, INSN.
Args are same as in `final', except that INSN
is the insn being scanned.
@@ -2492,7 +2513,7 @@ final_scan_insn_1 (rtx_insn *insn, FILE *file, int 
optimize_p ATTRIBUTE_UNUSED,
{
  int log_align;
 
- switch_to_section (targetm.asm_out.function_rodata_section
+ switch_to_section (select_jump_table_section
 (current_function_decl));
 
 #ifdef ADDR_VEC_ALIGN
@@ -2571,7 +2592,7 @@ final_scan_insn_1 (rtx_insn *insn, FILE *file, int 
optimize_p ATTRIBUTE_UNUSED,
 #endif
 
if (! JUMP_TABLES_IN_TEXT_SECTION)
-