From: HAO CHEN GUI <guihaoc@linux.ibm.com>
To: gcc-patches <gcc-patches@gcc.gnu.org>
Cc: "segher@kernel.crashing.org wschmidt"@linux.ibm.com
Subject: [PATCH] Add support for putting jump table into relocation read-only section
Date: Fri, 14 Aug 2020 15:16:55 +0800 [thread overview]
Message-ID: <c7947853-7912-65b3-4a90-9dd076f6a111@linux.ibm.com> (raw)
[-- Attachment #1: Type: text/plain, Size: 854 bytes --]
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.
[-- Attachment #2: ChangeLog-0 --]
[-- Type: text/plain, Size: 1109 bytes --]
* 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.
[-- Attachment #3: patch-0.diff --]
[-- Type: text/plain, Size: 4620 bytes --]
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)
- switch_to_section (targetm.asm_out.function_rodata_section
+ switch_to_section (select_jump_table_section
(current_function_decl));
else
switch_to_section (current_function_section ());
diff --git a/gcc/output.h b/gcc/output.h
index eb253c50329..9a463c42955 100644
--- a/gcc/output.h
+++ b/gcc/output.h
@@ -573,6 +573,7 @@ extern section *default_elf_select_section (tree, int, unsigned HOST_WIDE_INT);
extern void default_unique_section (tree, int);
extern section *default_function_rodata_section (tree);
extern section *default_no_function_rodata_section (tree);
+extern section *default_function_relro_section (tree);
extern section *default_clone_table_section (void);
extern section *default_select_rtx_section (machine_mode, rtx,
unsigned HOST_WIDE_INT);
diff --git a/gcc/target.def b/gcc/target.def
index 07059a87caf..9bd61b4e018 100644
--- a/gcc/target.def
+++ b/gcc/target.def
@@ -561,6 +561,18 @@ otherwise.",
section *, (tree decl),
default_function_rodata_section)
+/* Return the relro section associated with function DECL. */
+DEFHOOK
+(function_relro_section,
+ "Return the relro section associated with\n\
+@samp{DECL_SECTION_NAME (@var{decl})}.\n\
+The default version of this function selects @code{.gnu.linkonce.r.name} if\n\
+the function's section is @code{.gnu.linkonce.t.name}, \n\
+@code{.data.rel.ro.name} if function is in @code{.text.name}, \n\
+and the normal data relro section otherwise.",
+ section *, (tree decl),
+ default_function_relro_section)
+
/* Nonnull if the target wants to override the default ".rodata" prefix
for mergeable data sections. */
DEFHOOKPOD
diff --git a/gcc/varasm.c b/gcc/varasm.c
next reply other threads:[~2020-08-14 7:17 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-08-14 7:16 HAO CHEN GUI [this message]
2020-08-14 7:20 HAO CHEN GUI
2020-08-14 23:39 ` Segher Boessenkool
2020-08-17 2:20 ` HAO CHEN GUI
2020-08-17 2:28 ` HAO CHEN GUI
2020-08-17 14:50 ` Segher Boessenkool
2020-08-24 7:53 ` HAO CHEN GUI
2020-09-08 17:30 ` Segher Boessenkool
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=c7947853-7912-65b3-4a90-9dd076f6a111@linux.ibm.com \
--to=guihaoc@linux.ibm.com \
--cc="segher@kernel.crashing.org wschmidt"@linux.ibm.com \
--cc=gcc-patches@gcc.gnu.org \
/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).