mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-06-22 19:09:31 +08:00
* config/tc-mips.c (mips_in_shared): New static variable.
(macro_build_lui): Permit "_gp" if !mips_in_shared. (md_longopts): Add -mshared and -mno-shared. (md_parse_option): Handle OPTION_MSHARED and OPTION_MNO_SHARED. (s_cpload): Implement !mips_in_shared case. (s_cpsetup): Likewise. * doc/c-mips.texi (MIPS Opts): Document -mno-shared. * NEWS: Mention -mno-shared.
This commit is contained in:
@ -1,3 +1,14 @@
|
|||||||
|
2004-12-10 Ian Lance Taylor <ian@wasabisystems.com>
|
||||||
|
|
||||||
|
* config/tc-mips.c (mips_in_shared): New static variable.
|
||||||
|
(macro_build_lui): Permit "_gp" if !mips_in_shared.
|
||||||
|
(md_longopts): Add -mshared and -mno-shared.
|
||||||
|
(md_parse_option): Handle OPTION_MSHARED and OPTION_MNO_SHARED.
|
||||||
|
(s_cpload): Implement !mips_in_shared case.
|
||||||
|
(s_cpsetup): Likewise.
|
||||||
|
* doc/c-mips.texi (MIPS Opts): Document -mno-shared.
|
||||||
|
* NEWS: Mention -mno-shared.
|
||||||
|
|
||||||
2004-12-09 Paul Brook <paul@codesourcery.com>
|
2004-12-09 Paul Brook <paul@codesourcery.com>
|
||||||
|
|
||||||
* config/tc-arm.c (s_arm_unwind_fnend): Use R_ARM_PREL31 relocation
|
* config/tc-arm.c (s_arm_unwind_fnend): Use R_ARM_PREL31 relocation
|
||||||
|
2
gas/NEWS
2
gas/NEWS
@ -19,6 +19,8 @@
|
|||||||
* Support for ColdFire EMAC instructions added and Motorola syntax for MAC/EMAC
|
* Support for ColdFire EMAC instructions added and Motorola syntax for MAC/EMAC
|
||||||
instrucitons.
|
instrucitons.
|
||||||
|
|
||||||
|
* New command line option -mno-shared for MIPS ELF targets.
|
||||||
|
|
||||||
* New command line option --alternate and pseudo-ops .altmacro and .noaltmacro
|
* New command line option --alternate and pseudo-ops .altmacro and .noaltmacro
|
||||||
added to enter (and leave) alternate macro syntax mode.
|
added to enter (and leave) alternate macro syntax mode.
|
||||||
|
|
||||||
|
@ -136,6 +136,10 @@ static enum mips_abi_level mips_abi = NO_ABI;
|
|||||||
/* Whether or not we have code that can call pic code. */
|
/* Whether or not we have code that can call pic code. */
|
||||||
int mips_abicalls = FALSE;
|
int mips_abicalls = FALSE;
|
||||||
|
|
||||||
|
/* Whether or not we have code which can be put into a shared
|
||||||
|
library. */
|
||||||
|
static bfd_boolean mips_in_shared = TRUE;
|
||||||
|
|
||||||
/* This is the set of options which may be modified by the .set
|
/* This is the set of options which may be modified by the .set
|
||||||
pseudo-op. We use a struct so that .set push and .set pop are more
|
pseudo-op. We use a struct so that .set push and .set pop are more
|
||||||
reliable. */
|
reliable. */
|
||||||
@ -3388,10 +3392,13 @@ macro_build_lui (expressionS *ep, int regnum)
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
assert (ep->X_op == O_symbol);
|
assert (ep->X_op == O_symbol);
|
||||||
/* _gp_disp is a special case, used from s_cpload. */
|
/* _gp_disp is a special case, used from s_cpload. _gp is used
|
||||||
|
if mips_no_shared. */
|
||||||
assert (mips_pic == NO_PIC
|
assert (mips_pic == NO_PIC
|
||||||
|| (! HAVE_NEWABI
|
|| (! HAVE_NEWABI
|
||||||
&& strcmp (S_GET_NAME (ep->X_add_symbol), "_gp_disp") == 0));
|
&& strcmp (S_GET_NAME (ep->X_add_symbol), "_gp_disp") == 0)
|
||||||
|
|| (! mips_in_shared
|
||||||
|
&& strcmp (S_GET_NAME (ep->X_add_symbol), "_gp") == 0));
|
||||||
*r = BFD_RELOC_HI16_S;
|
*r = BFD_RELOC_HI16_S;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -10120,10 +10127,14 @@ struct option md_longopts[] =
|
|||||||
#define OPTION_NO_RELAX_BRANCH (OPTION_MISC_BASE + 11)
|
#define OPTION_NO_RELAX_BRANCH (OPTION_MISC_BASE + 11)
|
||||||
{"relax-branch", no_argument, NULL, OPTION_RELAX_BRANCH},
|
{"relax-branch", no_argument, NULL, OPTION_RELAX_BRANCH},
|
||||||
{"no-relax-branch", no_argument, NULL, OPTION_NO_RELAX_BRANCH},
|
{"no-relax-branch", no_argument, NULL, OPTION_NO_RELAX_BRANCH},
|
||||||
|
#define OPTION_MSHARED (OPTION_MISC_BASE + 12)
|
||||||
|
#define OPTION_MNO_SHARED (OPTION_MISC_BASE + 13)
|
||||||
|
{"mshared", no_argument, NULL, OPTION_MSHARED},
|
||||||
|
{"mno-shared", no_argument, NULL, OPTION_MNO_SHARED},
|
||||||
|
|
||||||
/* ELF-specific options. */
|
/* ELF-specific options. */
|
||||||
#ifdef OBJ_ELF
|
#ifdef OBJ_ELF
|
||||||
#define OPTION_ELF_BASE (OPTION_MISC_BASE + 12)
|
#define OPTION_ELF_BASE (OPTION_MISC_BASE + 14)
|
||||||
#define OPTION_CALL_SHARED (OPTION_ELF_BASE + 0)
|
#define OPTION_CALL_SHARED (OPTION_ELF_BASE + 0)
|
||||||
{"KPIC", no_argument, NULL, OPTION_CALL_SHARED},
|
{"KPIC", no_argument, NULL, OPTION_CALL_SHARED},
|
||||||
{"call_shared", no_argument, NULL, OPTION_CALL_SHARED},
|
{"call_shared", no_argument, NULL, OPTION_CALL_SHARED},
|
||||||
@ -10336,6 +10347,14 @@ md_parse_option (int c, char *arg)
|
|||||||
mips_relax_branch = 0;
|
mips_relax_branch = 0;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case OPTION_MSHARED:
|
||||||
|
mips_in_shared = TRUE;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case OPTION_MNO_SHARED:
|
||||||
|
mips_in_shared = FALSE;
|
||||||
|
break;
|
||||||
|
|
||||||
#ifdef OBJ_ELF
|
#ifdef OBJ_ELF
|
||||||
/* When generating ELF code, we permit -KPIC and -call_shared to
|
/* When generating ELF code, we permit -KPIC and -call_shared to
|
||||||
select SVR4_PIC, and -non_shared to select no PIC. This is
|
select SVR4_PIC, and -non_shared to select no PIC. This is
|
||||||
@ -11794,12 +11813,22 @@ s_abicalls (int ignore ATTRIBUTE_UNUSED)
|
|||||||
lui $gp,%hi(_gp_disp)
|
lui $gp,%hi(_gp_disp)
|
||||||
addiu $gp,$gp,%lo(_gp_disp)
|
addiu $gp,$gp,%lo(_gp_disp)
|
||||||
addu $gp,$gp,.cpload argument
|
addu $gp,$gp,.cpload argument
|
||||||
The .cpload argument is normally $25 == $t9. */
|
The .cpload argument is normally $25 == $t9.
|
||||||
|
|
||||||
|
The -mno-shared option changes this to:
|
||||||
|
lui $gp,%hi(_gp)
|
||||||
|
addiu $gp,$gp,%lo(_gp)
|
||||||
|
and the argument is ignored. This saves an instruction, but the
|
||||||
|
resulting code is not position independent; it uses an absolute
|
||||||
|
address for _gp. Thus code assembled with -mno-shared can go into
|
||||||
|
an ordinary executable, but not into a shared library. */
|
||||||
|
|
||||||
static void
|
static void
|
||||||
s_cpload (int ignore ATTRIBUTE_UNUSED)
|
s_cpload (int ignore ATTRIBUTE_UNUSED)
|
||||||
{
|
{
|
||||||
expressionS ex;
|
expressionS ex;
|
||||||
|
int reg;
|
||||||
|
int in_shared;
|
||||||
|
|
||||||
/* If we are not generating SVR4 PIC code, or if this is NewABI code,
|
/* If we are not generating SVR4 PIC code, or if this is NewABI code,
|
||||||
.cpload is ignored. */
|
.cpload is ignored. */
|
||||||
@ -11813,8 +11842,14 @@ s_cpload (int ignore ATTRIBUTE_UNUSED)
|
|||||||
if (mips_opts.noreorder == 0)
|
if (mips_opts.noreorder == 0)
|
||||||
as_warn (_(".cpload not in noreorder section"));
|
as_warn (_(".cpload not in noreorder section"));
|
||||||
|
|
||||||
|
reg = tc_get_register (0);
|
||||||
|
|
||||||
|
/* If we need to produce a 64-bit address, we are better off using
|
||||||
|
the default instruction sequence. */
|
||||||
|
in_shared = mips_in_shared || HAVE_64BIT_ADDRESSES;
|
||||||
|
|
||||||
ex.X_op = O_symbol;
|
ex.X_op = O_symbol;
|
||||||
ex.X_add_symbol = symbol_find_or_make ("_gp_disp");
|
ex.X_add_symbol = symbol_find_or_make (in_shared ? "_gp_disp" : "_gp");
|
||||||
ex.X_op_symbol = NULL;
|
ex.X_op_symbol = NULL;
|
||||||
ex.X_add_number = 0;
|
ex.X_add_number = 0;
|
||||||
|
|
||||||
@ -11825,8 +11860,9 @@ s_cpload (int ignore ATTRIBUTE_UNUSED)
|
|||||||
macro_build_lui (&ex, mips_gp_register);
|
macro_build_lui (&ex, mips_gp_register);
|
||||||
macro_build (&ex, "addiu", "t,r,j", mips_gp_register,
|
macro_build (&ex, "addiu", "t,r,j", mips_gp_register,
|
||||||
mips_gp_register, BFD_RELOC_LO16);
|
mips_gp_register, BFD_RELOC_LO16);
|
||||||
macro_build (NULL, "addu", "d,v,t", mips_gp_register,
|
if (in_shared)
|
||||||
mips_gp_register, tc_get_register (0));
|
macro_build (NULL, "addu", "d,v,t", mips_gp_register,
|
||||||
|
mips_gp_register, reg);
|
||||||
macro_end ();
|
macro_end ();
|
||||||
|
|
||||||
demand_empty_rest_of_line ();
|
demand_empty_rest_of_line ();
|
||||||
@ -11846,7 +11882,13 @@ s_cpload (int ignore ATTRIBUTE_UNUSED)
|
|||||||
lui $gp, %hi(%neg(%gp_rel(label)))
|
lui $gp, %hi(%neg(%gp_rel(label)))
|
||||||
addiu $gp, $gp, %lo(%neg(%gp_rel(label)))
|
addiu $gp, $gp, %lo(%neg(%gp_rel(label)))
|
||||||
daddu $gp, $gp, $reg1
|
daddu $gp, $gp, $reg1
|
||||||
$reg1 is normally $25 == $t9. */
|
$reg1 is normally $25 == $t9.
|
||||||
|
|
||||||
|
The -mno-shared option replaces the last three instructions with
|
||||||
|
lui $gp,%hi(_gp)
|
||||||
|
addiu $gp,$gp,%lo(_gp)
|
||||||
|
*/
|
||||||
|
|
||||||
static void
|
static void
|
||||||
s_cpsetup (int ignore ATTRIBUTE_UNUSED)
|
s_cpsetup (int ignore ATTRIBUTE_UNUSED)
|
||||||
{
|
{
|
||||||
@ -11908,15 +11950,36 @@ s_cpsetup (int ignore ATTRIBUTE_UNUSED)
|
|||||||
macro_build (NULL, "daddu", "d,v,t", mips_cpreturn_register,
|
macro_build (NULL, "daddu", "d,v,t", mips_cpreturn_register,
|
||||||
mips_gp_register, 0);
|
mips_gp_register, 0);
|
||||||
|
|
||||||
macro_build (&ex_sym, "lui", "t,u", mips_gp_register,
|
if (mips_in_shared || HAVE_64BIT_ADDRESSES)
|
||||||
-1, BFD_RELOC_GPREL16, BFD_RELOC_MIPS_SUB, BFD_RELOC_HI16_S);
|
{
|
||||||
|
macro_build (&ex_sym, "lui", "t,u", mips_gp_register,
|
||||||
|
-1, BFD_RELOC_GPREL16, BFD_RELOC_MIPS_SUB,
|
||||||
|
BFD_RELOC_HI16_S);
|
||||||
|
|
||||||
macro_build (&ex_sym, "addiu", "t,r,j", mips_gp_register,
|
macro_build (&ex_sym, "addiu", "t,r,j", mips_gp_register,
|
||||||
mips_gp_register, -1, BFD_RELOC_GPREL16,
|
mips_gp_register, -1, BFD_RELOC_GPREL16,
|
||||||
BFD_RELOC_MIPS_SUB, BFD_RELOC_LO16);
|
BFD_RELOC_MIPS_SUB, BFD_RELOC_LO16);
|
||||||
|
|
||||||
|
macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", mips_gp_register,
|
||||||
|
mips_gp_register, reg1);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
expressionS ex;
|
||||||
|
|
||||||
|
ex.X_op = O_symbol;
|
||||||
|
ex.X_add_symbol = symbol_find_or_make ("_gp");
|
||||||
|
ex.X_op_symbol = NULL;
|
||||||
|
ex.X_add_number = 0;
|
||||||
|
|
||||||
|
/* In ELF, this symbol is implicitly an STT_OBJECT symbol. */
|
||||||
|
symbol_get_bfdsym (ex.X_add_symbol)->flags |= BSF_OBJECT;
|
||||||
|
|
||||||
|
macro_build_lui (&ex, mips_gp_register);
|
||||||
|
macro_build (&ex, "addiu", "t,r,j", mips_gp_register,
|
||||||
|
mips_gp_register, BFD_RELOC_LO16);
|
||||||
|
}
|
||||||
|
|
||||||
macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", mips_gp_register,
|
|
||||||
mips_gp_register, reg1);
|
|
||||||
macro_end ();
|
macro_end ();
|
||||||
|
|
||||||
demand_empty_rest_of_line ();
|
demand_empty_rest_of_line ();
|
||||||
|
@ -238,6 +238,16 @@ error is detected. This is the default.
|
|||||||
@itemx -mno-pdr
|
@itemx -mno-pdr
|
||||||
Control generation of @code{.pdr} sections. Off by default on IRIX, on
|
Control generation of @code{.pdr} sections. Off by default on IRIX, on
|
||||||
elsewhere.
|
elsewhere.
|
||||||
|
|
||||||
|
@item -mshared
|
||||||
|
@itemx -mno-shared
|
||||||
|
When generating code using the Unix calling conventions (selected by
|
||||||
|
@samp{-KPIC} or @samp{-mcall_shared}), gas will normally generate code
|
||||||
|
which can go into a shared library. The @samp{-mno-shared} option
|
||||||
|
tells gas to generate code which uses the calling convention, but can
|
||||||
|
not go into a shared library. The resulting code is slightly more
|
||||||
|
efficient. This option only affects the handling of the
|
||||||
|
@samp{.cpload} and @samp{.cpsetup} pseudo-ops.
|
||||||
@end table
|
@end table
|
||||||
|
|
||||||
@node MIPS Object
|
@node MIPS Object
|
||||||
|
Reference in New Issue
Block a user