From: Milica Matic <milicamatic05@gmail.com>
To: gdb-patches@sourceware.org
Cc: milica.matic@htecgroup.com, simark@simark.ca, cfu@wavecomp.com,
aburgess@redhat.com, kevinb@redhat.com, macro@orcam.me.uk,
djordje.todorovic@htecgroup.com,
Matthew Fortune <matthew.fortune@imgtec.com>,
Matthew Fortune <matthew.fortune@mips.com>,
Faraz Shahbazker <fshahbazker@wavecomp.com>
Subject: [PATCH 07/21] Add --user-defined-sdata-sections
Date: Fri, 13 Dec 2024 16:53:14 +0100 [thread overview]
Message-ID: <20241213155328.406003-9-milica.matic@htecgroup.com> (raw)
In-Reply-To: <20241213155328.406003-1-milica.matic@htecgroup.com>
From: Matthew Fortune <matthew.fortune@imgtec.com>
This feature has never been used. It was not properly documented at the
usual places or tested. Posting the entire documentation that Matthew
provided to the customer in to the commit message, for lack of better
alternative:
Introduction
============
This documentation describes how a user can specify which small data
area is used for each data item. This allows different software
contexts to use different small data areas. There are three stages:
1. GCC is informed which small data area to use.
2. The linker script places each small data area around a specifically
named anchor.
3. System code sets up GP to contain the correct value for each
software context.
Compiling/Assembling
====================
Automatic data placement
------------------------
The -mgpopt and -G<num> behaviour is modified by the -msdata-num=<num>
option to tell the compiler to use a numbered small data area instead of
the generic area.
<num> can be 0 to 999.
e.g. mips-mti-elf-gcc -mgpopt -G4 -msdata-num=4
GP relative addressing will be used for automatically chosen data items
as usual.
Manual data placement
---------------------
The section attribute can be used to place data into a numbered small
data section.
int a __attribute__((section(".sdata_1"))) = 9;
int b __attribute__((section(".sdata_2")));
e.g. mips-mti-elf-gcc -mgpopt -msdata-num=<any>
When using the -msdata-num=<num> option then these data items will be
accessed via GP relative addressing. This will happen even if the number
given to the compiler option does not match the numbered data section in
the section attribute. It is the user's responsibility to only access
data from one small data area in each software context. If the
-msdata-num=<num> option is not given then global addressing will be
used for these variables.
Manual data placement with a list
---------------------------------
The -moptimize-sdata-list=<file> option is modified by the
-msdata-num=<num> option to use a numbered small data section for the
list of symbols instead of the generic area.
e.g. mips-mti-elf-gcc -moptimize-sdata-list=sdata.lst -msdata-num=4
Linking
=======
Add the --user-defined-sdata-sections option to the link command to
perform multi small data area linking. This will need prefixing with
"-Wl," if passed via the 'mips-mti-elf-gcc' compiler driver.
The linker script also needs modifying to place the multiple small data
sections and define the 'gp' anchors. Each numbered area requires a
corresponding numbered anchor defined like this:
. = ALIGN(8);
_gp_1 = . + 0x8000;
.sdata_1 : {
*(.sdata_1)
*(.sdata_1.*)
}
. = ALIGN(4);
_fsbss_1 = .;
.sbss_1 : {
*(.sbss_1)
*(.sbss_1.*)
}
. = ALIGN(4);
_esbss_1 = .;
The range _fsbss_1 to _esbss_1 must be cleared to zero by CRT code
similarly to the normal bss area.
Runtime
=======
System code needs to set the 'gp' register to the correct _gp_<num>
value for each software context. There are no runtime checks to
ensure that the correct GP value is used for each data item.
Context switching code may need to save/restore GP if contexts
running on the same VPE use different areas or contexts migrate
between VPEs or cores.
Cherry-picked 236e648
from https://github.com/MIPS/binutils-gdb
Signed-off-by: Matthew Fortune <matthew.fortune@mips.com>
Signed-off-by: Faraz Shahbazker <fshahbazker@wavecomp.com>
Signed-off-by: Milica Matic <milica.matic@htecgroup.com>
---
bfd/elfxx-mips.c | 58 ++++++++++++++++++++++++++++++++++++++++-
bfd/elfxx-mips.h | 2 ++
ld/emultempl/mipself.em | 23 ++++++++++++++++
ld/ldlex.h | 2 ++
4 files changed, 84 insertions(+), 1 deletion(-)
diff --git a/bfd/elfxx-mips.c b/bfd/elfxx-mips.c
index 6345e782776..a895d08e009 100644
--- a/bfd/elfxx-mips.c
+++ b/bfd/elfxx-mips.c
@@ -464,6 +464,12 @@ struct mips_elf_link_hash_table
/* True if we are targetting R6 compact branches. */
bool compact_branches;
+ /* When True and processing a gp relative relocation against a symbol
+ in a .sdata_<num>/.sbss_<num> section use the gp value
+ based on the address of the _gp_<num> symbol where <num> is
+ the number of the .sbss/.sdata section the symbol is in. */
+ bool user_def_sdata_sections;
+
/* True if we're generating code for VxWorks. */
bool is_vxworks;
@@ -606,6 +612,8 @@ struct mips_elf_obj_tdata
asection *elf_data_section;
asection *elf_text_section;
+ bfd_signed_vma sdata_section[1000];
+
struct mips_hi16 *mips_hi16_list;
};
@@ -5604,6 +5612,7 @@ mips_elf_calculate_relocation (bfd *abfd, bfd *input_bfd,
struct mips_elf_link_hash_table *htab;
bfd *dynobj;
bool resolved_to_zero;
+ int gp_sec_num = 0;
dynobj = elf_hash_table (info)->dynobj;
htab = mips_elf_hash_table (info);
@@ -6000,6 +6009,27 @@ mips_elf_calculate_relocation (bfd *abfd, bfd *input_bfd,
if (gnu_local_gp_p)
symbol = gp;
+ if (mips_elf_hash_table (info)->user_def_sdata_sections && sec != NULL)
+ {
+ if (strncmp (".sdata_", sec->name, 7) == 0)
+ gp_sec_num = atoi (&sec->name[7]);
+ else if (strncmp (".sbss_", sec->name, 6) == 0)
+ gp_sec_num = atoi (&sec->name[6]);
+
+ if (gp_sec_num)
+ {
+ if (gp_sec_num < 0 || gp_sec_num > 999
+ || mips_elf_tdata(abfd)->sdata_section[gp_sec_num] == -1)
+ {
+ (*_bfd_error_handler)
+ (_("%pB: Error: Unable to apply gp relocation to section `%s'"),
+ abfd, sec->name);
+ bfd_set_error (bfd_error_bad_value);
+ }
+ }
+
+ gp = mips_elf_tdata(abfd)->sdata_section[gp_sec_num];
+ }
/* Global R_MIPS_GOT_PAGE/R_MICROMIPS_GOT_PAGE relocations are equivalent
to R_MIPS_GOT_DISP/R_MICROMIPS_GOT_DISP. The addend is applied by the
corresponding R_MIPS_GOT_OFST/R_MICROMIPS_GOT_OFST. */
@@ -7597,7 +7627,8 @@ _bfd_mips_elf_section_processing (bfd *abfd, Elf_Internal_Shdr *hdr)
on it in an input file will be followed. */
if (strcmp (name, ".sdata") == 0
|| strcmp (name, ".lit8") == 0
- || strcmp (name, ".lit4") == 0)
+ || strcmp (name, ".lit4") == 0
+ || strncmp (name, ".sdata_", 7) == 0)
hdr->sh_flags |= SHF_ALLOC | SHF_WRITE | SHF_MIPS_GPREL;
else if (strcmp (name, ".srdata") == 0)
hdr->sh_flags |= SHF_ALLOC | SHF_MIPS_GPREL;
@@ -7889,7 +7920,9 @@ _bfd_mips_elf_fake_sections (bfd *abfd, Elf_Internal_Shdr *hdr, asection *sec)
else if (strcmp (name, ".got") == 0
|| strcmp (name, ".srdata") == 0
|| strcmp (name, ".sdata") == 0
+ || strncmp (name, ".sdata_", 7) == 0
|| strcmp (name, ".sbss") == 0
+ || strncmp (name, ".sbss_", 6) == 0
|| strcmp (name, ".lit4") == 0
|| strcmp (name, ".lit8") == 0)
hdr->sh_flags |= SHF_MIPS_GPREL;
@@ -14832,6 +14865,12 @@ _bfd_mips_elf_compact_branches (struct bfd_link_info *info, bool on)
mips_elf_hash_table (info)->compact_branches = on;
}
+void
+_bfd_mips_elf_user_def_sdata_sections (struct bfd_link_info *info, bool on)
+{
+ mips_elf_hash_table (info)->user_def_sdata_sections = on;
+}
+
\f
/* Structure for saying that BFD machine EXTENSION extends BASE. */
@@ -15182,6 +15221,23 @@ _bfd_mips_elf_final_link (bfd *abfd, struct bfd_link_info *info)
if (hti.error)
return false;
+ unsigned int gp_num;
+ for (gp_num = 0 ; gp_num < 1000 ; gp_num++)
+ {
+ struct bfd_link_hash_entry *h;
+ char gp_name[8];
+ bfd_signed_vma gp_vma = -1;
+
+ sprintf (gp_name, "_gp_%d", gp_num);
+ h = bfd_link_hash_lookup (info->hash, gp_name, false, false, true);
+ if (h != NULL && h->type == bfd_link_hash_defined)
+ gp_vma = (h->u.def.value
+ + h->u.def.section->output_section->vma
+ + h->u.def.section->output_offset);
+
+ mips_elf_tdata(abfd)->sdata_section[gp_num] = gp_vma;
+ }
+
/* Get a value for the GP register. */
if (elf_gp (abfd) == 0)
{
diff --git a/bfd/elfxx-mips.h b/bfd/elfxx-mips.h
index 85fb3da78f8..6e5843b565b 100644
--- a/bfd/elfxx-mips.h
+++ b/bfd/elfxx-mips.h
@@ -171,6 +171,8 @@ extern void _bfd_mips_elf_linker_flags
(struct bfd_link_info *, bool, bool, bool);
extern void _bfd_mips_elf_compact_branches
(struct bfd_link_info *, bool);
+extern void _bfd_mips_elf_user_def_sdata_sections
+ (struct bfd_link_info *, bool);
extern bool _bfd_mips_elf_init_stubs
(struct bfd_link_info *,
asection *(*) (const char *, asection *, asection *));
diff --git a/ld/emultempl/mipself.em b/ld/emultempl/mipself.em
index 3259f654b36..b9bea3756b2 100644
--- a/ld/emultempl/mipself.em
+++ b/ld/emultempl/mipself.em
@@ -45,6 +45,7 @@ static bfd *stub_bfd;
static bool insn32;
static bool ignore_branch_isa;
static bool compact_branches;
+static bool user_def_sdata_sections;
struct hook_stub_info
{
@@ -204,6 +205,7 @@ mips_create_output_section_statements (void)
if (is_mips_elf (link_info.output_bfd))
{
_bfd_mips_elf_compact_branches (&link_info, compact_branches);
+ _bfd_mips_elf_user_def_sdata_sections (&link_info, user_def_sdata_sections);
_bfd_mips_elf_init_stubs (&link_info, mips_add_stub_section);
}
}
@@ -239,6 +241,8 @@ PARSE_AND_LIST_LONGOPTS='
{ "no-ignore-branch-isa", no_argument, NULL, OPTION_NO_IGNORE_BRANCH_ISA },
{ "compact-branches", no_argument, NULL, OPTION_COMPACT_BRANCHES },
{ "no-compact-branches", no_argument, NULL, OPTION_NO_COMPACT_BRANCHES },
+ { "user-defined-sdata-sections", no_argument, NULL, OPTION_USER_DEF_SDATA_SECTIONS },
+ { "no-user-defined-sdata-sections", no_argument, NULL, OPTION_NO_USER_DEF_SDATA_SECTIONS },
'
PARSE_AND_LIST_OPTIONS='
@@ -262,6 +266,17 @@ PARSE_AND_LIST_OPTIONS='
fprintf (file, _("\
--no-compact-branches Generate delay slot branches/jumps for MIPS R6\n"
));
+ fprintf (file, _("\
+ --user-defined-sdata-sections\n\
+ When processing a gp relative relocation against a symbol\n\
+ in a .sdata_<num>/.sbss_<num> section use the gp value\n\
+ based on the address of the _gp_<num> symbol where <num> is\n\
+ the number of the .sbss/.sdata section the symbol is in\n"));
+ fprintf (file, _("\
+ --no-user-defined-sdata-sections\n\
+ When processing a gp relative relocation against a symbol\n\
+ in a .sdata_<num>/.sbss_<num> section use the gp value\n\
+ based on the address of the _gp symbol\n"));
'
PARSE_AND_LIST_ARGS_CASES='
@@ -288,6 +303,14 @@ PARSE_AND_LIST_ARGS_CASES='
case OPTION_NO_COMPACT_BRANCHES:
compact_branches = false;
break;
+
+ case OPTION_USER_DEF_SDATA_SECTIONS:
+ user_def_sdata_sections = true;
+ break;
+
+ case OPTION_NO_USER_DEF_SDATA_SECTIONS:
+ user_def_sdata_sections = false;
+ break;
'
LDEMUL_BEFORE_ALLOCATION=mips_before_allocation
diff --git a/ld/ldlex.h b/ld/ldlex.h
index bb431101fb2..c86352553bf 100644
--- a/ld/ldlex.h
+++ b/ld/ldlex.h
@@ -306,6 +306,8 @@ enum option_values
OPTION_NO_IGNORE_BRANCH_ISA,
OPTION_COMPACT_BRANCHES,
OPTION_NO_COMPACT_BRANCHES,
+ OPTION_USER_DEF_SDATA_SECTIONS,
+ OPTION_NO_USER_DEF_SDATA_SECTIONS,
/* Used by emultempl/msp430.em. */
OPTION_CODE_REGION,
OPTION_DATA_REGION,
--
2.34.1
next prev parent reply other threads:[~2024-12-13 16:04 UTC|newest]
Thread overview: 26+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-12-13 15:53 [PATCH 0/21] Integrate MIPS-Specific Support into Official binutils-gdb Milica Matic
2024-12-13 15:53 ` [PATCH 00/21] " Milica Matic
2024-12-13 15:53 ` [PATCH 01/21] Don't adjust microMIPS HI/LO rel section-relative Milica Matic
2024-12-13 15:53 ` [PATCH 02/21] Add new relocations for microMIPSR6 Milica Matic
2024-12-13 15:53 ` [PATCH 03/21] Improve WARN for $0 constraint on MIPSR6 branches Milica Matic
2024-12-13 15:53 ` [PATCH 04/21] Instruction mapping support (pre-R6 to R6) Milica Matic
2024-12-13 15:53 ` [PATCH 05/21] Add microMIPSR6 support Milica Matic
2024-12-13 15:53 ` [PATCH 06/21] Update branch relaxation Milica Matic
2024-12-13 15:53 ` Milica Matic [this message]
2024-12-13 15:53 ` [PATCH 08/21] Disassembler fix Milica Matic
2024-12-13 15:53 ` [PATCH 09/21] MIPS: Add CRYPTO ASE support Milica Matic
2024-12-13 15:53 ` [PATCH 10/21] Add the m6201 architecture Milica Matic
2024-12-13 15:53 ` [PATCH 11/21] Add GINV(+VIRT) ASE for MIPSr6/microMIPS6 Milica Matic
2024-12-13 15:53 ` [PATCH 12/21] Implement the XBurst MXU extensions Milica Matic
2024-12-13 15:53 ` [PATCH 13/21] MIPS: Update encoding of d16mule MXU instruction Milica Matic
2024-12-13 15:53 ` [PATCH 14/21] Re-arrange MXU code blocks and add comments Milica Matic
2024-12-13 15:53 ` [PATCH 15/21] Accept MCU mapped string operands as constants Milica Matic
2024-12-13 15:53 ` [PATCH 16/21] Fix addr2line mapping - garbage collected modules Milica Matic
2024-12-13 15:53 ` [PATCH 17/21] Extend trap macros to handle immediate zero Milica Matic
2024-12-13 15:53 ` [PATCH 18/21] Fix failing test cases for linux and 64-bit target Milica Matic
2024-12-13 15:53 ` [PATCH 19/21] Remove exec permission tc-mips.c Milica Matic
2024-12-13 15:53 ` [PATCH 20/21] Workaround for line info in compressed MIPS func Milica Matic
2024-12-13 15:53 ` [PATCH 21/21] Fix gold linker build issues for mingw Milica Matic
2025-01-07 21:18 ` [PATCH 0/21] Integrate MIPS-Specific Support into Official binutils-gdb Kevin Buettner
2025-01-09 1:11 ` [EXTERNAL]Re: " Chao-ying Fu
2025-01-07 21:31 ` Kevin Buettner
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=20241213155328.406003-9-milica.matic@htecgroup.com \
--to=milicamatic05@gmail.com \
--cc=aburgess@redhat.com \
--cc=cfu@wavecomp.com \
--cc=djordje.todorovic@htecgroup.com \
--cc=fshahbazker@wavecomp.com \
--cc=gdb-patches@sourceware.org \
--cc=kevinb@redhat.com \
--cc=macro@orcam.me.uk \
--cc=matthew.fortune@imgtec.com \
--cc=matthew.fortune@mips.com \
--cc=milica.matic@htecgroup.com \
--cc=simark@simark.ca \
/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