* [OpenRISC] [PATCH] or1k: Add mcmodel option to handle large GOTs
@ 2021-04-19 0:10 Stafford Horne
2021-04-20 23:20 ` Jeff Law
0 siblings, 1 reply; 4+ messages in thread
From: Stafford Horne @ 2021-04-19 0:10 UTC (permalink / raw)
To: openrisc
When building libgeos we get an error with:
linux-uclibc/9.3.0/crtbeginS.o: in function `__do_global_dtors_aux':
crtstuff.c:(.text+0x118): relocation truncated to fit: R_OR1K_GOT16 against symbol `__cxa_finalize' defined in .text section in
/home/shorne/work/openrisc/3eb9f9d0f6d8274b2d19753c006bd83f7d536e3c/output/host/or1k-buildroot-linux-uclibc/sysroot/lib/libc.so.
This is caused by GOT code having a limit of 64k. In OpenRISC this
looks to be the only relocation code pattern to be limited to 64k.
This patch allows specifying a new option -mcmodel=large which can be
used to generate 2 more instructions to construct 32-bit addresses for
up to 4G GOTs.
gcc/ChangeLog:
PR 99783
* config/or1k/or1k-opts.h: New file.
* config/or1k/or1k.c (or1k_legitimize_address_1, print_reloc):
Support generating gotha relocations if -mcmodel=large is
specified.
* config/or1k/or1k.h (TARGET_CMODEL_SMALL, TARGET_CMODEL_LARGE):
New macros.
* config/or1k/or1k.opt (mcmodel=): New option.
* doc/invoke.text (OpenRISC Options): Document mcmodel.
---
This depends on the binutils-gdb patch sent here:
- https://sourceware.org/pipermail/binutils/2021-April/116155.html
gcc/config/or1k/or1k-opts.h | 30 ++++++++++++++++++++++++++++++
gcc/config/or1k/or1k.c | 11 +++++++++--
gcc/config/or1k/or1k.h | 7 +++++++
gcc/config/or1k/or1k.opt | 19 +++++++++++++++++++
gcc/doc/invoke.texi | 12 +++++++++++-
5 files changed, 76 insertions(+), 3 deletions(-)
create mode 100644 gcc/config/or1k/or1k-opts.h
diff --git a/gcc/config/or1k/or1k-opts.h b/gcc/config/or1k/or1k-opts.h
new file mode 100644
index 00000000000..f791b894fdd
--- /dev/null
+++ b/gcc/config/or1k/or1k-opts.h
@@ -0,0 +1,30 @@
+/* Definitions for option handling for OpenRISC.
+ Copyright (C) 2021 Free Software Foundation, Inc.
+ Contributed by Stafford Horne.
+
+ This file is part of GCC.
+
+ GCC is free software; you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published
+ by the Free Software Foundation; either version 3, or (at your
+ option) any later version.
+
+ GCC is distributed in the hope that it will be useful, but WITHOUT
+ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
+ License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with GCC; see the file COPYING3. If not see
+ <http://www.gnu.org/licenses/>. */
+
+#ifndef GCC_OR1K_OPTS_H
+#define GCC_OR1K_OPTS_H
+
+/* The OpenRISC code generation models available. */
+enum or1k_cmodel_type {
+ CMODEL_SMALL,
+ CMODEL_LARGE
+};
+
+#endif /* GCC_OR1K_OPTS_H */
diff --git a/gcc/config/or1k/or1k.c b/gcc/config/or1k/or1k.c
index e772a7addea..27d3fa17995 100644
--- a/gcc/config/or1k/or1k.c
+++ b/gcc/config/or1k/or1k.c
@@ -750,7 +750,14 @@ or1k_legitimize_address_1 (rtx x, rtx scratch)
{
base = gen_sym_unspec (base, UNSPEC_GOT);
crtl->uses_pic_offset_table = 1;
- t2 = gen_rtx_LO_SUM (Pmode, pic_offset_table_rtx, base);
+ if (TARGET_CMODEL_LARGE)
+ {
+ emit_insn (gen_rtx_SET (t1, gen_rtx_HIGH (Pmode, base)));
+ emit_insn (gen_add3_insn (t1, t1, pic_offset_table_rtx));
+ t2 = gen_rtx_LO_SUM (Pmode, t1, base);
+ }
+ else
+ t2 = gen_rtx_LO_SUM (Pmode, pic_offset_table_rtx, base);
t2 = gen_const_mem (Pmode, t2);
emit_insn (gen_rtx_SET (t1, t2));
base = t1;
@@ -1089,7 +1096,7 @@ print_reloc (FILE *stream, rtx x, HOST_WIDE_INT add, reloc_kind kind)
no special markup. */
static const char * const relocs[RKIND_MAX][RTYPE_MAX] = {
{ "lo", "got", "gotofflo", "tpofflo", "gottpofflo", "tlsgdlo" },
- { "ha", NULL, "gotoffha", "tpoffha", "gottpoffha", "tlsgdhi" },
+ { "ha", "gotha", "gotoffha", "tpoffha", "gottpoffha", "tlsgdhi" },
};
reloc_type type = RTYPE_DIRECT;
diff --git a/gcc/config/or1k/or1k.h b/gcc/config/or1k/or1k.h
index fe01ab81ead..669907e7e74 100644
--- a/gcc/config/or1k/or1k.h
+++ b/gcc/config/or1k/or1k.h
@@ -21,6 +21,8 @@
#ifndef GCC_OR1K_H
#define GCC_OR1K_H
+#include "config/or1k/or1k-opts.h"
+
/* Names to predefine in the preprocessor for this target machine. */
#define TARGET_CPU_CPP_BUILTINS() \
do \
@@ -37,6 +39,11 @@
} \
while (0)
+#define TARGET_CMODEL_SMALL \
+ (or1k_code_model == CMODEL_SMALL)
+#define TARGET_CMODEL_LARGE \
+ (or1k_code_model == CMODEL_LARGE)
+
/* Storage layout. */
#define DEFAULT_SIGNED_CHAR 1
diff --git a/gcc/config/or1k/or1k.opt b/gcc/config/or1k/or1k.opt
index 6bd0f3eee6d..cc23e3b8856 100644
--- a/gcc/config/or1k/or1k.opt
+++ b/gcc/config/or1k/or1k.opt
@@ -21,6 +21,9 @@
; See the GCC internals manual (options.texi) for a description of
; this file's format.
+HeaderInclude
+config/or1k/or1k-opts.h
+
mhard-div
Target RejectNegative InverseMask(SOFT_DIV)
Enable generation of hardware divide (l.div, l.divu) instructions. This is the
@@ -63,6 +66,22 @@ When -mhard-float is selected, enables generation of unordered floating point
compare and set flag (lf.sfun*) instructions. By default functions from libgcc
are used to perform unordered floating point compare and set flag operations.
+mcmodel=
+Target RejectNegative Joined Enum(or1k_cmodel_type) Var(or1k_code_model) Init(CMODEL_SMALL)
+Specify the code model used for accessing memory addresses. Specifying large
+enables generating binaries with large global offset tables. By default the
+value is small.
+
+Enum
+Name(or1k_cmodel_type) Type(enum or1k_cmodel_type)
+Known code model types (for use with the -mcmodel= option):
+
+EnumValue
+Enum(or1k_cmodel_type) String(small) Value(CMODEL_SMALL)
+
+EnumValue
+Enum(or1k_cmodel_type) String(large) Value(CMODEL_LARGE)
+
mcmov
Target RejectNegative Mask(CMOV)
Enable generation of conditional move (l.cmov) instructions. By default the
diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi
index 096cebc8562..63cc4ec97db 100644
--- a/gcc/doc/invoke.texi
+++ b/gcc/doc/invoke.texi
@@ -1135,7 +1135,8 @@ Objective-C and Objective-C++ Dialects}.
@gccoptlist{-mboard=@var{name} -mnewlib -mhard-mul -mhard-div @gol
-msoft-mul -msoft-div @gol
-msoft-float -mhard-float -mdouble-float -munordered-float @gol
--mcmov -mror -mrori -msext -msfimm -mshftimm}
+-mcmov -mror -mrori -msext -msfimm -mshftimm @gol
+-mcmodel=@var{code-model}}
@emph{PDP-11 Options}
@gccoptlist{-mfpu -msoft-float -mac0 -mno-ac0 -m40 -m45 -m10 @gol
@@ -26406,6 +26407,15 @@ Enable generation of shift with immediate (@code{l.srai}, @code{l.srli},
@code{l.slli}) instructions. By default extra instructions will be generated
to store the immediate to a register first.
+ at item -mcmodel=small
+ at opindex mcmodel=small
+Generate OpenRISC code for the small model: The GOT is limited to 64k. This is
+the default model.
+
+ at item -mcmodel=large
+ at opindex mcmodel=large
+Generate OpenRISC code for the large model: The GOT may grow up to 4G in size.
+
@end table
--
2.26.2
^ permalink raw reply related [flat|nested] 4+ messages in thread
* [OpenRISC] [PATCH] or1k: Add mcmodel option to handle large GOTs
2021-04-19 0:10 [OpenRISC] [PATCH] or1k: Add mcmodel option to handle large GOTs Stafford Horne
@ 2021-04-20 23:20 ` Jeff Law
2021-04-21 0:12 ` Stafford Horne
0 siblings, 1 reply; 4+ messages in thread
From: Jeff Law @ 2021-04-20 23:20 UTC (permalink / raw)
To: openrisc
On 4/18/2021 6:10 PM, Stafford Horne via Gcc-patches wrote:
> When building libgeos we get an error with:
>
> linux-uclibc/9.3.0/crtbeginS.o: in function `__do_global_dtors_aux':
> crtstuff.c:(.text+0x118): relocation truncated to fit: R_OR1K_GOT16 against symbol `__cxa_finalize' defined in .text section in
> /home/shorne/work/openrisc/3eb9f9d0f6d8274b2d19753c006bd83f7d536e3c/output/host/or1k-buildroot-linux-uclibc/sysroot/lib/libc.so.
>
> This is caused by GOT code having a limit of 64k. In OpenRISC this
> looks to be the only relocation code pattern to be limited to 64k.
>
> This patch allows specifying a new option -mcmodel=large which can be
> used to generate 2 more instructions to construct 32-bit addresses for
> up to 4G GOTs.
>
> gcc/ChangeLog:
>
> PR 99783
> * config/or1k/or1k-opts.h: New file.
> * config/or1k/or1k.c (or1k_legitimize_address_1, print_reloc):
> Support generating gotha relocations if -mcmodel=large is
> specified.
> * config/or1k/or1k.h (TARGET_CMODEL_SMALL, TARGET_CMODEL_LARGE):
> New macros.
> * config/or1k/or1k.opt (mcmodel=): New option.
> * doc/invoke.text (OpenRISC Options): Document mcmodel.
Note you're the port maintainer, so you don't need approval to commit
this to GCC.
Jeff
^ permalink raw reply [flat|nested] 4+ messages in thread
* [OpenRISC] [PATCH] or1k: Add mcmodel option to handle large GOTs
2021-04-20 23:20 ` Jeff Law
@ 2021-04-21 0:12 ` Stafford Horne
2021-04-21 0:22 ` Jeff Law
0 siblings, 1 reply; 4+ messages in thread
From: Stafford Horne @ 2021-04-21 0:12 UTC (permalink / raw)
To: openrisc
On Tue, Apr 20, 2021 at 05:20:39PM -0600, Jeff Law wrote:
>
> On 4/18/2021 6:10 PM, Stafford Horne via Gcc-patches wrote:
> > When building libgeos we get an error with:
> >
> > linux-uclibc/9.3.0/crtbeginS.o: in function `__do_global_dtors_aux':
> > crtstuff.c:(.text+0x118): relocation truncated to fit: R_OR1K_GOT16 against symbol `__cxa_finalize' defined in .text section in
> > /home/shorne/work/openrisc/3eb9f9d0f6d8274b2d19753c006bd83f7d536e3c/output/host/or1k-buildroot-linux-uclibc/sysroot/lib/libc.so.
> >
> > This is caused by GOT code having a limit of 64k. In OpenRISC this
> > looks to be the only relocation code pattern to be limited to 64k.
> >
> > This patch allows specifying a new option -mcmodel=large which can be
> > used to generate 2 more instructions to construct 32-bit addresses for
> > up to 4G GOTs.
> >
> > gcc/ChangeLog:
> >
> > PR 99783
> > * config/or1k/or1k-opts.h: New file.
> > * config/or1k/or1k.c (or1k_legitimize_address_1, print_reloc):
> > Support generating gotha relocations if -mcmodel=large is
> > specified.
> > * config/or1k/or1k.h (TARGET_CMODEL_SMALL, TARGET_CMODEL_LARGE):
> > New macros.
> > * config/or1k/or1k.opt (mcmodel=): New option.
> > * doc/invoke.text (OpenRISC Options): Document mcmodel.
>
> Note you're the port maintainer, so you don't need approval to commit this
> to GCC.
Thanks for confirming, I know that after Segher told me with some previous
patches. :)
For this series Giulio picked it up and tested it. We found some issues and I
am going to fix with a V2. I should commit that version, after the binutils
changes are in.
-Stafford
^ permalink raw reply [flat|nested] 4+ messages in thread
* [OpenRISC] [PATCH] or1k: Add mcmodel option to handle large GOTs
2021-04-21 0:12 ` Stafford Horne
@ 2021-04-21 0:22 ` Jeff Law
0 siblings, 0 replies; 4+ messages in thread
From: Jeff Law @ 2021-04-21 0:22 UTC (permalink / raw)
To: openrisc
On 4/20/2021 6:12 PM, Stafford Horne wrote:
> On Tue, Apr 20, 2021 at 05:20:39PM -0600, Jeff Law wrote:
>> On 4/18/2021 6:10 PM, Stafford Horne via Gcc-patches wrote:
>>> When building libgeos we get an error with:
>>>
>>> linux-uclibc/9.3.0/crtbeginS.o: in function `__do_global_dtors_aux':
>>> crtstuff.c:(.text+0x118): relocation truncated to fit: R_OR1K_GOT16 against symbol `__cxa_finalize' defined in .text section in
>>> /home/shorne/work/openrisc/3eb9f9d0f6d8274b2d19753c006bd83f7d536e3c/output/host/or1k-buildroot-linux-uclibc/sysroot/lib/libc.so.
>>>
>>> This is caused by GOT code having a limit of 64k. In OpenRISC this
>>> looks to be the only relocation code pattern to be limited to 64k.
>>>
>>> This patch allows specifying a new option -mcmodel=large which can be
>>> used to generate 2 more instructions to construct 32-bit addresses for
>>> up to 4G GOTs.
>>>
>>> gcc/ChangeLog:
>>>
>>> PR 99783
>>> * config/or1k/or1k-opts.h: New file.
>>> * config/or1k/or1k.c (or1k_legitimize_address_1, print_reloc):
>>> Support generating gotha relocations if -mcmodel=large is
>>> specified.
>>> * config/or1k/or1k.h (TARGET_CMODEL_SMALL, TARGET_CMODEL_LARGE):
>>> New macros.
>>> * config/or1k/or1k.opt (mcmodel=): New option.
>>> * doc/invoke.text (OpenRISC Options): Document mcmodel.
>> Note you're the port maintainer, so you don't need approval to commit this
>> to GCC.
> Thanks for confirming, I know that after Segher told me with some previous
> patches. :)
>
> For this series Giulio picked it up and tested it. We found some issues and I
> am going to fix with a V2. I should commit that version, after the binutils
> changes are in.
Sounds good. Thanks. Given we're making gcc-11 RCs you'll have to
decide if its worth the risk of introducing those changes this late in
the cycle is safe or not.
jeff
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2021-04-21 0:22 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-04-19 0:10 [OpenRISC] [PATCH] or1k: Add mcmodel option to handle large GOTs Stafford Horne
2021-04-20 23:20 ` Jeff Law
2021-04-21 0:12 ` Stafford Horne
2021-04-21 0:22 ` Jeff Law
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.