* config/tc-mips.c: Replace GP in comments by $gp.
(mips_big_got): Initialize. (mips_trap): Initialize. (load_address): Use mips_gp_register instead of hardcoded value. Remove dbl parameter, use HAVE_32BIT_ADDRESSES instead. (macro): Use mips_gp_register instead of hardcoded value. (macro2): Change load_address calls. (md_pcrel_from): Comment formatting. (s_cpload): Use mips_gp_register instead of hardcoded value. (s_cprestore): Likewise. Comment formatting. (s_gpword): Fix data type. (s_cpadd): Use mips_gp_register instead of hardcoded value. (nopic_need_relax): Replace GP in comments by $gp. (mips_elf_final_processing): Better comment.
This commit is contained in:
parent
485721b1e7
commit
c99147661e
|
@ -1,3 +1,20 @@
|
||||||
|
2002-05-28 Thiemo Seufer <seufer@csv.ica.uni-stuttgart.de>
|
||||||
|
|
||||||
|
* config/tc-mips.c: Replace GP in comments by $gp.
|
||||||
|
(mips_big_got): Initialize.
|
||||||
|
(mips_trap): Initialize.
|
||||||
|
(load_address): Use mips_gp_register instead of hardcoded value.
|
||||||
|
Remove dbl parameter, use HAVE_32BIT_ADDRESSES instead.
|
||||||
|
(macro): Use mips_gp_register instead of hardcoded value.
|
||||||
|
(macro2): Change load_address calls.
|
||||||
|
(md_pcrel_from): Comment formatting.
|
||||||
|
(s_cpload): Use mips_gp_register instead of hardcoded value.
|
||||||
|
(s_cprestore): Likewise. Comment formatting.
|
||||||
|
(s_gpword): Fix data type.
|
||||||
|
(s_cpadd): Use mips_gp_register instead of hardcoded value.
|
||||||
|
(nopic_need_relax): Replace GP in comments by $gp.
|
||||||
|
(mips_elf_final_processing): Better comment.
|
||||||
|
|
||||||
2002-05-28 Kuang Hwa Lin <kuang@sbcglobal.net>
|
2002-05-28 Kuang Hwa Lin <kuang@sbcglobal.net>
|
||||||
|
|
||||||
* configure.in: Add DLX configuraton
|
* configure.in: Add DLX configuraton
|
||||||
|
|
|
@ -326,13 +326,13 @@ static enum mips_pic_level mips_pic;
|
||||||
/* Warn about all NOPS that the assembler generates. */
|
/* Warn about all NOPS that the assembler generates. */
|
||||||
static int warn_nops = 0;
|
static int warn_nops = 0;
|
||||||
|
|
||||||
/* 1 if we should generate 32 bit offsets from the GP register in
|
/* 1 if we should generate 32 bit offsets from the $gp register in
|
||||||
SVR4_PIC mode. Currently has no meaning in other modes. */
|
SVR4_PIC mode. Currently has no meaning in other modes. */
|
||||||
static int mips_big_got;
|
static int mips_big_got = 0;
|
||||||
|
|
||||||
/* 1 if trap instructions should used for overflow rather than break
|
/* 1 if trap instructions should used for overflow rather than break
|
||||||
instructions. */
|
instructions. */
|
||||||
static int mips_trap;
|
static int mips_trap = 0;
|
||||||
|
|
||||||
/* 1 if double width floating point constants should not be constructed
|
/* 1 if double width floating point constants should not be constructed
|
||||||
by assembling two single width halves into two single width floating
|
by assembling two single width halves into two single width floating
|
||||||
|
@ -702,7 +702,7 @@ static void set_at PARAMS ((int *counter, int reg, int unsignedp));
|
||||||
static void check_absolute_expr PARAMS ((struct mips_cl_insn * ip,
|
static void check_absolute_expr PARAMS ((struct mips_cl_insn * ip,
|
||||||
expressionS *));
|
expressionS *));
|
||||||
static void load_register PARAMS ((int *, int, expressionS *, int));
|
static void load_register PARAMS ((int *, int, expressionS *, int));
|
||||||
static void load_address PARAMS ((int *, int, expressionS *, int, int *));
|
static void load_address PARAMS ((int *, int, expressionS *, int *));
|
||||||
static void move_register PARAMS ((int *, int, int));
|
static void move_register PARAMS ((int *, int, int));
|
||||||
static void macro PARAMS ((struct mips_cl_insn * ip));
|
static void macro PARAMS ((struct mips_cl_insn * ip));
|
||||||
static void mips16_macro PARAMS ((struct mips_cl_insn * ip));
|
static void mips16_macro PARAMS ((struct mips_cl_insn * ip));
|
||||||
|
@ -3660,11 +3660,10 @@ load_register (counter, reg, ep, dbl)
|
||||||
/* Load an address into a register. */
|
/* Load an address into a register. */
|
||||||
|
|
||||||
static void
|
static void
|
||||||
load_address (counter, reg, ep, dbl, used_at)
|
load_address (counter, reg, ep, used_at)
|
||||||
int *counter;
|
int *counter;
|
||||||
int reg;
|
int reg;
|
||||||
expressionS *ep;
|
expressionS *ep;
|
||||||
int dbl;
|
|
||||||
int *used_at;
|
int *used_at;
|
||||||
{
|
{
|
||||||
char *p = NULL;
|
char *p = NULL;
|
||||||
|
@ -3678,7 +3677,7 @@ load_address (counter, reg, ep, dbl, used_at)
|
||||||
|
|
||||||
if (ep->X_op == O_constant)
|
if (ep->X_op == O_constant)
|
||||||
{
|
{
|
||||||
load_register (counter, reg, ep, dbl);
|
load_register (counter, reg, ep, HAVE_64BIT_ADDRESSES);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3708,7 +3707,7 @@ load_address (counter, reg, ep, dbl, used_at)
|
||||||
dsll $reg,16
|
dsll $reg,16
|
||||||
daddiu $reg,<sym> (BFD_RELOC_LO16)
|
daddiu $reg,<sym> (BFD_RELOC_LO16)
|
||||||
*/
|
*/
|
||||||
if (dbl)
|
if (HAVE_64BIT_ADDRESSES)
|
||||||
{
|
{
|
||||||
/* We don't do GP optimization for now because RELAX_ENCODE can't
|
/* We don't do GP optimization for now because RELAX_ENCODE can't
|
||||||
hold the data for such large chunks. */
|
hold the data for such large chunks. */
|
||||||
|
@ -3752,8 +3751,8 @@ load_address (counter, reg, ep, dbl, used_at)
|
||||||
{
|
{
|
||||||
frag_grow (20);
|
frag_grow (20);
|
||||||
macro_build ((char *) NULL, counter, ep,
|
macro_build ((char *) NULL, counter, ep,
|
||||||
dbl ? "daddiu" : "addiu", "t,r,j", reg, GP,
|
HAVE_32BIT_ADDRESSES ? "addiu" : "daddiu", "t,r,j",
|
||||||
(int) BFD_RELOC_GPREL16);
|
reg, mips_gp_register, (int) BFD_RELOC_GPREL16);
|
||||||
p = frag_var (rs_machine_dependent, 8, 0,
|
p = frag_var (rs_machine_dependent, 8, 0,
|
||||||
RELAX_ENCODE (4, 8, 0, 4, 0,
|
RELAX_ENCODE (4, 8, 0, 4, 0,
|
||||||
mips_opts.warn_about_macros),
|
mips_opts.warn_about_macros),
|
||||||
|
@ -3762,7 +3761,8 @@ load_address (counter, reg, ep, dbl, used_at)
|
||||||
macro_build_lui (p, counter, ep, reg);
|
macro_build_lui (p, counter, ep, reg);
|
||||||
if (p != NULL)
|
if (p != NULL)
|
||||||
p += 4;
|
p += 4;
|
||||||
macro_build (p, counter, ep, dbl ? "daddiu" : "addiu",
|
macro_build (p, counter, ep,
|
||||||
|
HAVE_32BIT_ADDRESSES ? "addiu" : "daddiu",
|
||||||
"t,r,j", reg, reg, (int) BFD_RELOC_LO16);
|
"t,r,j", reg, reg, (int) BFD_RELOC_LO16);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -3781,8 +3781,8 @@ load_address (counter, reg, ep, dbl, used_at)
|
||||||
ep->X_add_number = 0;
|
ep->X_add_number = 0;
|
||||||
frag_grow (20);
|
frag_grow (20);
|
||||||
macro_build ((char *) NULL, counter, ep,
|
macro_build ((char *) NULL, counter, ep,
|
||||||
HAVE_32BIT_ADDRESSES ? "lw" : "ld",
|
HAVE_32BIT_ADDRESSES ? "lw" : "ld", "t,o(b)",
|
||||||
"t,o(b)", reg, (int) BFD_RELOC_MIPS_GOT16, GP);
|
reg, (int) BFD_RELOC_MIPS_GOT16, mips_gp_register);
|
||||||
macro_build ((char *) NULL, counter, (expressionS *) NULL, "nop", "");
|
macro_build ((char *) NULL, counter, (expressionS *) NULL, "nop", "");
|
||||||
p = frag_var (rs_machine_dependent, 4, 0,
|
p = frag_var (rs_machine_dependent, 4, 0,
|
||||||
RELAX_ENCODE (0, 4, -8, 0, 0, mips_opts.warn_about_macros),
|
RELAX_ENCODE (0, 4, -8, 0, 0, mips_opts.warn_about_macros),
|
||||||
|
@ -3862,8 +3862,9 @@ load_address (counter, reg, ep, dbl, used_at)
|
||||||
/* We always do
|
/* We always do
|
||||||
addiu $reg,$gp,<sym> (BFD_RELOC_GPREL16)
|
addiu $reg,$gp,<sym> (BFD_RELOC_GPREL16)
|
||||||
*/
|
*/
|
||||||
macro_build ((char *) NULL, counter, ep, dbl ? "daddiu" : "addiu",
|
macro_build ((char *) NULL, counter, ep,
|
||||||
"t,r,j", reg, GP, (int) BFD_RELOC_GPREL16);
|
HAVE_32BIT_ADDRESSES ? "addiu" : "daddiu",
|
||||||
|
"t,r,j", reg, mips_gp_register, (int) BFD_RELOC_GPREL16);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
abort ();
|
abort ();
|
||||||
|
@ -4744,7 +4745,8 @@ macro (ip)
|
||||||
{
|
{
|
||||||
frag_grow (20);
|
frag_grow (20);
|
||||||
macro_build ((char *) NULL, &icnt, &offset_expr, "addiu",
|
macro_build ((char *) NULL, &icnt, &offset_expr, "addiu",
|
||||||
"t,r,j", tempreg, GP, (int) BFD_RELOC_GPREL16);
|
"t,r,j", tempreg, mips_gp_register,
|
||||||
|
(int) BFD_RELOC_GPREL16);
|
||||||
p = frag_var (rs_machine_dependent, 8, 0,
|
p = frag_var (rs_machine_dependent, 8, 0,
|
||||||
RELAX_ENCODE (4, 8, 0, 4, 0,
|
RELAX_ENCODE (4, 8, 0, 4, 0,
|
||||||
mips_opts.warn_about_macros),
|
mips_opts.warn_about_macros),
|
||||||
|
@ -4796,7 +4798,7 @@ macro (ip)
|
||||||
lw_reloc_type = (int) BFD_RELOC_MIPS_CALL16;
|
lw_reloc_type = (int) BFD_RELOC_MIPS_CALL16;
|
||||||
macro_build ((char *) NULL, &icnt, &offset_expr,
|
macro_build ((char *) NULL, &icnt, &offset_expr,
|
||||||
HAVE_32BIT_ADDRESSES ? "lw" : "ld",
|
HAVE_32BIT_ADDRESSES ? "lw" : "ld",
|
||||||
"t,o(b)", tempreg, lw_reloc_type, GP);
|
"t,o(b)", tempreg, lw_reloc_type, mips_gp_register);
|
||||||
if (expr1.X_add_number == 0)
|
if (expr1.X_add_number == 0)
|
||||||
{
|
{
|
||||||
int off;
|
int off;
|
||||||
|
@ -4950,7 +4952,7 @@ macro (ip)
|
||||||
tempreg, lui_reloc_type);
|
tempreg, lui_reloc_type);
|
||||||
macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
|
macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
|
||||||
HAVE_32BIT_ADDRESSES ? "addu" : "daddu",
|
HAVE_32BIT_ADDRESSES ? "addu" : "daddu",
|
||||||
"d,v,t", tempreg, tempreg, GP);
|
"d,v,t", tempreg, tempreg, mips_gp_register);
|
||||||
macro_build ((char *) NULL, &icnt, &offset_expr,
|
macro_build ((char *) NULL, &icnt, &offset_expr,
|
||||||
HAVE_32BIT_ADDRESSES ? "lw" : "ld",
|
HAVE_32BIT_ADDRESSES ? "lw" : "ld",
|
||||||
"t,o(b)", tempreg, lw_reloc_type, tempreg);
|
"t,o(b)", tempreg, lw_reloc_type, tempreg);
|
||||||
|
@ -5056,7 +5058,8 @@ macro (ip)
|
||||||
}
|
}
|
||||||
macro_build (p, &icnt, &offset_expr,
|
macro_build (p, &icnt, &offset_expr,
|
||||||
HAVE_32BIT_ADDRESSES ? "lw" : "ld",
|
HAVE_32BIT_ADDRESSES ? "lw" : "ld",
|
||||||
"t,o(b)", tempreg, (int) BFD_RELOC_MIPS_GOT16, GP);
|
"t,o(b)", tempreg, (int) BFD_RELOC_MIPS_GOT16,
|
||||||
|
mips_gp_register);
|
||||||
p += 4;
|
p += 4;
|
||||||
if (expr1.X_add_number >= -0x8000
|
if (expr1.X_add_number >= -0x8000
|
||||||
&& expr1.X_add_number < 0x8000)
|
&& expr1.X_add_number < 0x8000)
|
||||||
|
@ -5109,8 +5112,8 @@ macro (ip)
|
||||||
addiu $tempreg,$gp,<sym> (BFD_RELOC_GPREL16)
|
addiu $tempreg,$gp,<sym> (BFD_RELOC_GPREL16)
|
||||||
*/
|
*/
|
||||||
macro_build ((char *) NULL, &icnt, &offset_expr,
|
macro_build ((char *) NULL, &icnt, &offset_expr,
|
||||||
HAVE_32BIT_ADDRESSES ? "addiu" : "daddiu",
|
HAVE_32BIT_ADDRESSES ? "addiu" : "daddiu", "t,r,j",
|
||||||
"t,r,j", tempreg, GP, (int) BFD_RELOC_GPREL16);
|
tempreg, mips_gp_register, (int) BFD_RELOC_GPREL16);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
abort ();
|
abort ();
|
||||||
|
@ -5182,7 +5185,8 @@ macro (ip)
|
||||||
expr1.X_add_number = mips_cprestore_offset;
|
expr1.X_add_number = mips_cprestore_offset;
|
||||||
macro_build ((char *) NULL, &icnt, &expr1,
|
macro_build ((char *) NULL, &icnt, &expr1,
|
||||||
HAVE_32BIT_ADDRESSES ? "lw" : "ld", "t,o(b)",
|
HAVE_32BIT_ADDRESSES ? "lw" : "ld", "t,o(b)",
|
||||||
GP, (int) BFD_RELOC_LO16, mips_frame_reg);
|
mips_gp_register, (int) BFD_RELOC_LO16,
|
||||||
|
mips_frame_reg);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -5300,7 +5304,8 @@ macro (ip)
|
||||||
expr1.X_add_number = mips_cprestore_offset;
|
expr1.X_add_number = mips_cprestore_offset;
|
||||||
macro_build ((char *) NULL, &icnt, &expr1,
|
macro_build ((char *) NULL, &icnt, &expr1,
|
||||||
HAVE_32BIT_ADDRESSES ? "lw" : "ld", "t,o(b)",
|
HAVE_32BIT_ADDRESSES ? "lw" : "ld", "t,o(b)",
|
||||||
GP, (int) BFD_RELOC_LO16, mips_frame_reg);
|
mips_gp_register, (int) BFD_RELOC_LO16,
|
||||||
|
mips_frame_reg);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -5663,7 +5668,8 @@ macro (ip)
|
||||||
{
|
{
|
||||||
frag_grow (20);
|
frag_grow (20);
|
||||||
macro_build ((char *) NULL, &icnt, &offset_expr, s, fmt,
|
macro_build ((char *) NULL, &icnt, &offset_expr, s, fmt,
|
||||||
treg, (int) BFD_RELOC_GPREL16, GP);
|
treg, (int) BFD_RELOC_GPREL16,
|
||||||
|
mips_gp_register);
|
||||||
p = frag_var (rs_machine_dependent, 8, 0,
|
p = frag_var (rs_machine_dependent, 8, 0,
|
||||||
RELAX_ENCODE (4, 8, 0, 4, 0,
|
RELAX_ENCODE (4, 8, 0, 4, 0,
|
||||||
(mips_opts.warn_about_macros
|
(mips_opts.warn_about_macros
|
||||||
|
@ -5688,7 +5694,7 @@ macro (ip)
|
||||||
frag_grow (28);
|
frag_grow (28);
|
||||||
macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
|
macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
|
||||||
HAVE_32BIT_ADDRESSES ? "addu" : "daddu",
|
HAVE_32BIT_ADDRESSES ? "addu" : "daddu",
|
||||||
"d,v,t", tempreg, breg, GP);
|
"d,v,t", tempreg, breg, mips_gp_register);
|
||||||
macro_build ((char *) NULL, &icnt, &offset_expr, s, fmt,
|
macro_build ((char *) NULL, &icnt, &offset_expr, s, fmt,
|
||||||
treg, (int) BFD_RELOC_GPREL16, tempreg);
|
treg, (int) BFD_RELOC_GPREL16, tempreg);
|
||||||
p = frag_var (rs_machine_dependent, 12, 0,
|
p = frag_var (rs_machine_dependent, 12, 0,
|
||||||
|
@ -5734,8 +5740,8 @@ macro (ip)
|
||||||
as_bad (_("PIC code offset overflow (max 16 signed bits)"));
|
as_bad (_("PIC code offset overflow (max 16 signed bits)"));
|
||||||
frag_grow (20);
|
frag_grow (20);
|
||||||
macro_build ((char *) NULL, &icnt, &offset_expr,
|
macro_build ((char *) NULL, &icnt, &offset_expr,
|
||||||
HAVE_32BIT_ADDRESSES ? "lw" : "ld",
|
HAVE_32BIT_ADDRESSES ? "lw" : "ld", "t,o(b)", tempreg,
|
||||||
"t,o(b)", tempreg, (int) BFD_RELOC_MIPS_GOT16, GP);
|
(int) BFD_RELOC_MIPS_GOT16, mips_gp_register);
|
||||||
macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "nop", "");
|
macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "nop", "");
|
||||||
p = frag_var (rs_machine_dependent, 4, 0,
|
p = frag_var (rs_machine_dependent, 4, 0,
|
||||||
RELAX_ENCODE (0, 4, -8, 0, 0, 0),
|
RELAX_ENCODE (0, 4, -8, 0, 0, 0),
|
||||||
|
@ -5786,7 +5792,7 @@ macro (ip)
|
||||||
tempreg, (int) BFD_RELOC_MIPS_GOT_HI16);
|
tempreg, (int) BFD_RELOC_MIPS_GOT_HI16);
|
||||||
macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
|
macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
|
||||||
HAVE_32BIT_ADDRESSES ? "addu" : "daddu",
|
HAVE_32BIT_ADDRESSES ? "addu" : "daddu",
|
||||||
"d,v,t", tempreg, tempreg, GP);
|
"d,v,t", tempreg, tempreg, mips_gp_register);
|
||||||
macro_build ((char *) NULL, &icnt, &offset_expr,
|
macro_build ((char *) NULL, &icnt, &offset_expr,
|
||||||
HAVE_32BIT_ADDRESSES ? "lw" : "ld",
|
HAVE_32BIT_ADDRESSES ? "lw" : "ld",
|
||||||
"t,o(b)", tempreg, (int) BFD_RELOC_MIPS_GOT_LO16,
|
"t,o(b)", tempreg, (int) BFD_RELOC_MIPS_GOT_LO16,
|
||||||
|
@ -5801,7 +5807,8 @@ macro (ip)
|
||||||
}
|
}
|
||||||
macro_build (p, &icnt, &offset_expr,
|
macro_build (p, &icnt, &offset_expr,
|
||||||
HAVE_32BIT_ADDRESSES ? "lw" : "ld",
|
HAVE_32BIT_ADDRESSES ? "lw" : "ld",
|
||||||
"t,o(b)", tempreg, (int) BFD_RELOC_MIPS_GOT16, GP);
|
"t,o(b)", tempreg, (int) BFD_RELOC_MIPS_GOT16,
|
||||||
|
mips_gp_register);
|
||||||
p += 4;
|
p += 4;
|
||||||
macro_build (p, &icnt, (expressionS *) NULL, "nop", "");
|
macro_build (p, &icnt, (expressionS *) NULL, "nop", "");
|
||||||
p += 4;
|
p += 4;
|
||||||
|
@ -5827,14 +5834,14 @@ macro (ip)
|
||||||
if (breg == 0)
|
if (breg == 0)
|
||||||
{
|
{
|
||||||
macro_build ((char *) NULL, &icnt, &offset_expr, s, fmt,
|
macro_build ((char *) NULL, &icnt, &offset_expr, s, fmt,
|
||||||
treg, (int) BFD_RELOC_GPREL16, GP);
|
treg, (int) BFD_RELOC_GPREL16, mips_gp_register);
|
||||||
used_at = 0;
|
used_at = 0;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
|
macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
|
||||||
HAVE_32BIT_ADDRESSES ? "addu" : "daddu",
|
HAVE_32BIT_ADDRESSES ? "addu" : "daddu",
|
||||||
"d,v,t", tempreg, breg, GP);
|
"d,v,t", tempreg, breg, mips_gp_register);
|
||||||
macro_build ((char *) NULL, &icnt, &offset_expr, s, fmt,
|
macro_build ((char *) NULL, &icnt, &offset_expr, s, fmt,
|
||||||
treg, (int) BFD_RELOC_GPREL16, tempreg);
|
treg, (int) BFD_RELOC_GPREL16, tempreg);
|
||||||
}
|
}
|
||||||
|
@ -5872,7 +5879,7 @@ macro (ip)
|
||||||
".lit4") == 0
|
".lit4") == 0
|
||||||
&& offset_expr.X_add_number == 0);
|
&& offset_expr.X_add_number == 0);
|
||||||
macro_build ((char *) NULL, &icnt, &offset_expr, "lwc1", "T,o(b)",
|
macro_build ((char *) NULL, &icnt, &offset_expr, "lwc1", "T,o(b)",
|
||||||
treg, (int) BFD_RELOC_MIPS_LITERAL, GP);
|
treg, (int) BFD_RELOC_MIPS_LITERAL, mips_gp_register);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -5926,15 +5933,16 @@ macro (ip)
|
||||||
{
|
{
|
||||||
macro_build ((char *) NULL, &icnt, &offset_expr,
|
macro_build ((char *) NULL, &icnt, &offset_expr,
|
||||||
HAVE_32BIT_ADDRESSES ? "lw" : "ld",
|
HAVE_32BIT_ADDRESSES ? "lw" : "ld",
|
||||||
"t,o(b)", AT, (int) BFD_RELOC_MIPS_GOT16, GP);
|
"t,o(b)", AT, (int) BFD_RELOC_MIPS_GOT16,
|
||||||
|
mips_gp_register);
|
||||||
}
|
}
|
||||||
else if (mips_pic == EMBEDDED_PIC)
|
else if (mips_pic == EMBEDDED_PIC)
|
||||||
{
|
{
|
||||||
/* For embedded PIC we pick up the entire address off $gp in
|
/* For embedded PIC we pick up the entire address off $gp in
|
||||||
a single instruction. */
|
a single instruction. */
|
||||||
macro_build ((char *) NULL, &icnt, &offset_expr,
|
macro_build ((char *) NULL, &icnt, &offset_expr,
|
||||||
HAVE_32BIT_ADDRESSES ? "addiu" : "daddiu",
|
HAVE_32BIT_ADDRESSES ? "addiu" : "daddiu", "t,r,j", AT,
|
||||||
"t,r,j", AT, GP, (int) BFD_RELOC_GPREL16);
|
mips_gp_register, (int) BFD_RELOC_GPREL16);
|
||||||
offset_expr.X_op = O_constant;
|
offset_expr.X_op = O_constant;
|
||||||
offset_expr.X_add_number = 0;
|
offset_expr.X_add_number = 0;
|
||||||
}
|
}
|
||||||
|
@ -6007,10 +6015,11 @@ macro (ip)
|
||||||
if (mips_opts.isa != ISA_MIPS1)
|
if (mips_opts.isa != ISA_MIPS1)
|
||||||
{
|
{
|
||||||
macro_build ((char *) NULL, &icnt, &offset_expr, "ldc1",
|
macro_build ((char *) NULL, &icnt, &offset_expr, "ldc1",
|
||||||
"T,o(b)", treg, (int) BFD_RELOC_MIPS_LITERAL, GP);
|
"T,o(b)", treg, (int) BFD_RELOC_MIPS_LITERAL,
|
||||||
|
mips_gp_register);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
breg = GP;
|
breg = mips_gp_register;
|
||||||
r = BFD_RELOC_MIPS_LITERAL;
|
r = BFD_RELOC_MIPS_LITERAL;
|
||||||
goto dob;
|
goto dob;
|
||||||
}
|
}
|
||||||
|
@ -6020,7 +6029,8 @@ macro (ip)
|
||||||
if (mips_pic == SVR4_PIC)
|
if (mips_pic == SVR4_PIC)
|
||||||
macro_build ((char *) NULL, &icnt, &offset_expr,
|
macro_build ((char *) NULL, &icnt, &offset_expr,
|
||||||
HAVE_32BIT_ADDRESSES ? "lw" : "ld",
|
HAVE_32BIT_ADDRESSES ? "lw" : "ld",
|
||||||
"t,o(b)", AT, (int) BFD_RELOC_MIPS_GOT16, GP);
|
"t,o(b)", AT, (int) BFD_RELOC_MIPS_GOT16,
|
||||||
|
mips_gp_register);
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* FIXME: This won't work for a 64 bit address. */
|
/* FIXME: This won't work for a 64 bit address. */
|
||||||
|
@ -6195,7 +6205,7 @@ macro (ip)
|
||||||
if (breg == 0)
|
if (breg == 0)
|
||||||
{
|
{
|
||||||
frag_grow (28);
|
frag_grow (28);
|
||||||
tempreg = GP;
|
tempreg = mips_gp_register;
|
||||||
off = 0;
|
off = 0;
|
||||||
used_at = 0;
|
used_at = 0;
|
||||||
}
|
}
|
||||||
|
@ -6204,7 +6214,7 @@ macro (ip)
|
||||||
frag_grow (36);
|
frag_grow (36);
|
||||||
macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
|
macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
|
||||||
HAVE_32BIT_ADDRESSES ? "addu" : "daddu",
|
HAVE_32BIT_ADDRESSES ? "addu" : "daddu",
|
||||||
"d,v,t", AT, breg, GP);
|
"d,v,t", AT, breg, mips_gp_register);
|
||||||
tempreg = AT;
|
tempreg = AT;
|
||||||
off = 4;
|
off = 4;
|
||||||
used_at = 1;
|
used_at = 1;
|
||||||
|
@ -6305,8 +6315,8 @@ macro (ip)
|
||||||
off = 4;
|
off = 4;
|
||||||
frag_grow (24 + off);
|
frag_grow (24 + off);
|
||||||
macro_build ((char *) NULL, &icnt, &offset_expr,
|
macro_build ((char *) NULL, &icnt, &offset_expr,
|
||||||
HAVE_32BIT_ADDRESSES ? "lw" : "ld",
|
HAVE_32BIT_ADDRESSES ? "lw" : "ld", "t,o(b)", AT,
|
||||||
"t,o(b)", AT, (int) BFD_RELOC_MIPS_GOT16, GP);
|
(int) BFD_RELOC_MIPS_GOT16, mips_gp_register);
|
||||||
macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "nop", "");
|
macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "nop", "");
|
||||||
if (breg != 0)
|
if (breg != 0)
|
||||||
macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
|
macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
|
||||||
|
@ -6358,7 +6368,7 @@ macro (ip)
|
||||||
if (expr1.X_add_number < -0x8000
|
if (expr1.X_add_number < -0x8000
|
||||||
|| expr1.X_add_number >= 0x8000 - 4)
|
|| expr1.X_add_number >= 0x8000 - 4)
|
||||||
as_bad (_("PIC code offset overflow (max 16 signed bits)"));
|
as_bad (_("PIC code offset overflow (max 16 signed bits)"));
|
||||||
if (reg_needs_delay (GP))
|
if (reg_needs_delay (mips_gp_register))
|
||||||
gpdel = 4;
|
gpdel = 4;
|
||||||
else
|
else
|
||||||
gpdel = 0;
|
gpdel = 0;
|
||||||
|
@ -6371,7 +6381,7 @@ macro (ip)
|
||||||
AT, (int) BFD_RELOC_MIPS_GOT_HI16);
|
AT, (int) BFD_RELOC_MIPS_GOT_HI16);
|
||||||
macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
|
macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
|
||||||
HAVE_32BIT_ADDRESSES ? "addu" : "daddu",
|
HAVE_32BIT_ADDRESSES ? "addu" : "daddu",
|
||||||
"d,v,t", AT, AT, GP);
|
"d,v,t", AT, AT, mips_gp_register);
|
||||||
macro_build ((char *) NULL, &icnt, &offset_expr,
|
macro_build ((char *) NULL, &icnt, &offset_expr,
|
||||||
HAVE_32BIT_ADDRESSES ? "lw" : "ld",
|
HAVE_32BIT_ADDRESSES ? "lw" : "ld",
|
||||||
"t,o(b)", AT, (int) BFD_RELOC_MIPS_GOT_LO16, AT);
|
"t,o(b)", AT, (int) BFD_RELOC_MIPS_GOT_LO16, AT);
|
||||||
|
@ -6408,7 +6418,8 @@ macro (ip)
|
||||||
}
|
}
|
||||||
macro_build (p, &icnt, &offset_expr,
|
macro_build (p, &icnt, &offset_expr,
|
||||||
HAVE_32BIT_ADDRESSES ? "lw" : "ld",
|
HAVE_32BIT_ADDRESSES ? "lw" : "ld",
|
||||||
"t,o(b)", AT, (int) BFD_RELOC_MIPS_GOT16, GP);
|
"t,o(b)", AT, (int) BFD_RELOC_MIPS_GOT16,
|
||||||
|
mips_gp_register);
|
||||||
p += 4;
|
p += 4;
|
||||||
macro_build (p, &icnt, (expressionS *) NULL, "nop", "");
|
macro_build (p, &icnt, (expressionS *) NULL, "nop", "");
|
||||||
p += 4;
|
p += 4;
|
||||||
|
@ -6448,14 +6459,14 @@ macro (ip)
|
||||||
*/
|
*/
|
||||||
if (breg == 0)
|
if (breg == 0)
|
||||||
{
|
{
|
||||||
tempreg = GP;
|
tempreg = mips_gp_register;
|
||||||
used_at = 0;
|
used_at = 0;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
|
macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
|
||||||
HAVE_32BIT_ADDRESSES ? "addu" : "daddu",
|
HAVE_32BIT_ADDRESSES ? "addu" : "daddu",
|
||||||
"d,v,t", AT, breg, GP);
|
"d,v,t", AT, breg, mips_gp_register);
|
||||||
tempreg = AT;
|
tempreg = AT;
|
||||||
used_at = 1;
|
used_at = 1;
|
||||||
}
|
}
|
||||||
|
@ -7225,7 +7236,7 @@ macro2 (ip)
|
||||||
off = 3;
|
off = 3;
|
||||||
ulwa:
|
ulwa:
|
||||||
used_at = 1;
|
used_at = 1;
|
||||||
load_address (&icnt, AT, &offset_expr, HAVE_64BIT_ADDRESSES, &used_at);
|
load_address (&icnt, AT, &offset_expr, &used_at);
|
||||||
if (breg != 0)
|
if (breg != 0)
|
||||||
macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
|
macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
|
||||||
HAVE_32BIT_ADDRESSES ? "addu" : "daddu",
|
HAVE_32BIT_ADDRESSES ? "addu" : "daddu",
|
||||||
|
@ -7247,7 +7258,7 @@ macro2 (ip)
|
||||||
case M_ULH_A:
|
case M_ULH_A:
|
||||||
case M_ULHU_A:
|
case M_ULHU_A:
|
||||||
used_at = 1;
|
used_at = 1;
|
||||||
load_address (&icnt, AT, &offset_expr, HAVE_64BIT_ADDRESSES, &used_at);
|
load_address (&icnt, AT, &offset_expr, &used_at);
|
||||||
if (breg != 0)
|
if (breg != 0)
|
||||||
macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
|
macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
|
||||||
HAVE_32BIT_ADDRESSES ? "addu" : "daddu",
|
HAVE_32BIT_ADDRESSES ? "addu" : "daddu",
|
||||||
|
@ -7321,7 +7332,7 @@ macro2 (ip)
|
||||||
off = 3;
|
off = 3;
|
||||||
uswa:
|
uswa:
|
||||||
used_at = 1;
|
used_at = 1;
|
||||||
load_address (&icnt, AT, &offset_expr, HAVE_64BIT_ADDRESSES, &used_at);
|
load_address (&icnt, AT, &offset_expr, &used_at);
|
||||||
if (breg != 0)
|
if (breg != 0)
|
||||||
macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
|
macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
|
||||||
HAVE_32BIT_ADDRESSES ? "addu" : "daddu",
|
HAVE_32BIT_ADDRESSES ? "addu" : "daddu",
|
||||||
|
@ -7342,7 +7353,7 @@ macro2 (ip)
|
||||||
|
|
||||||
case M_USH_A:
|
case M_USH_A:
|
||||||
used_at = 1;
|
used_at = 1;
|
||||||
load_address (&icnt, AT, &offset_expr, HAVE_64BIT_ADDRESSES, &used_at);
|
load_address (&icnt, AT, &offset_expr, &used_at);
|
||||||
if (breg != 0)
|
if (breg != 0)
|
||||||
macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
|
macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
|
||||||
HAVE_32BIT_ADDRESSES ? "addu" : "daddu",
|
HAVE_32BIT_ADDRESSES ? "addu" : "daddu",
|
||||||
|
@ -10402,7 +10413,7 @@ md_pcrel_from (fixP)
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* return the address of the delay slot */
|
/* Return the address of the delay slot. */
|
||||||
return fixP->fx_size + fixP->fx_where + fixP->fx_frag->fr_address;
|
return fixP->fx_size + fixP->fx_where + fixP->fx_frag->fr_address;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -11568,12 +11579,12 @@ s_cpload (ignore)
|
||||||
/* In ELF, this symbol is implicitly an STT_OBJECT symbol. */
|
/* In ELF, this symbol is implicitly an STT_OBJECT symbol. */
|
||||||
symbol_get_bfdsym (ex.X_add_symbol)->flags |= BSF_OBJECT;
|
symbol_get_bfdsym (ex.X_add_symbol)->flags |= BSF_OBJECT;
|
||||||
|
|
||||||
macro_build_lui (NULL, &icnt, &ex, GP);
|
macro_build_lui (NULL, &icnt, &ex, mips_gp_register);
|
||||||
macro_build ((char *) NULL, &icnt, &ex, "addiu", "t,r,j", GP, GP,
|
macro_build ((char *) NULL, &icnt, &ex, "addiu", "t,r,j",
|
||||||
(int) BFD_RELOC_LO16);
|
mips_gp_register, mips_gp_register, (int) BFD_RELOC_LO16);
|
||||||
|
|
||||||
macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "addu", "d,v,t",
|
macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "addu", "d,v,t",
|
||||||
GP, GP, tc_get_register (0));
|
mips_gp_register, mips_gp_register, tc_get_register (0));
|
||||||
|
|
||||||
demand_empty_rest_of_line ();
|
demand_empty_rest_of_line ();
|
||||||
}
|
}
|
||||||
|
@ -11715,9 +11726,8 @@ s_cprestore (ignore)
|
||||||
ex.X_op_symbol = NULL;
|
ex.X_op_symbol = NULL;
|
||||||
ex.X_add_number = mips_cprestore_offset;
|
ex.X_add_number = mips_cprestore_offset;
|
||||||
|
|
||||||
macro_build ((char *) NULL, &icnt, &ex,
|
macro_build ((char *) NULL, &icnt, &ex, HAVE_32BIT_ADDRESSES ? "sw" : "sd",
|
||||||
HAVE_32BIT_ADDRESSES ? "sw" : "sd",
|
"t,o(b)", mips_gp_register, (int) BFD_RELOC_LO16, SP);
|
||||||
"t,o(b)", GP, (int) BFD_RELOC_LO16, SP);
|
|
||||||
|
|
||||||
demand_empty_rest_of_line ();
|
demand_empty_rest_of_line ();
|
||||||
}
|
}
|
||||||
|
@ -11815,7 +11825,7 @@ s_gpword (ignore)
|
||||||
|
|
||||||
p = frag_more (4);
|
p = frag_more (4);
|
||||||
md_number_to_chars (p, (valueT) 0, 4);
|
md_number_to_chars (p, (valueT) 0, 4);
|
||||||
fix_new_exp (frag_now, p - frag_now->fr_literal, 4, &ex, 0,
|
fix_new_exp (frag_now, p - frag_now->fr_literal, 4, &ex, false,
|
||||||
BFD_RELOC_GPREL32);
|
BFD_RELOC_GPREL32);
|
||||||
|
|
||||||
demand_empty_rest_of_line ();
|
demand_empty_rest_of_line ();
|
||||||
|
@ -11843,7 +11853,7 @@ s_cpadd (ignore)
|
||||||
reg = tc_get_register (0);
|
reg = tc_get_register (0);
|
||||||
macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
|
macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
|
||||||
HAVE_32BIT_ADDRESSES ? "addu" : "daddu",
|
HAVE_32BIT_ADDRESSES ? "addu" : "daddu",
|
||||||
"d,v,t", reg, reg, GP);
|
"d,v,t", reg, reg, mips_gp_register);
|
||||||
|
|
||||||
demand_empty_rest_of_line ();
|
demand_empty_rest_of_line ();
|
||||||
}
|
}
|
||||||
|
@ -12021,10 +12031,10 @@ nopic_need_relax (sym, before_relaxing)
|
||||||
const char *symname;
|
const char *symname;
|
||||||
int change;
|
int change;
|
||||||
|
|
||||||
/* Find out whether this symbol can be referenced off the GP
|
/* Find out whether this symbol can be referenced off the $gp
|
||||||
register. It can be if it is smaller than the -G size or if
|
register. It can be if it is smaller than the -G size or if
|
||||||
it is in the .sdata or .sbss section. Certain symbols can
|
it is in the .sdata or .sbss section. Certain symbols can
|
||||||
not be referenced off the GP, although it appears as though
|
not be referenced off the $gp, although it appears as though
|
||||||
they can. */
|
they can. */
|
||||||
symname = S_GET_NAME (sym);
|
symname = S_GET_NAME (sym);
|
||||||
if (symname != (const char *) NULL
|
if (symname != (const char *) NULL
|
||||||
|
@ -12071,7 +12081,7 @@ nopic_need_relax (sym, before_relaxing)
|
||||||
return change;
|
return change;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
/* We are not optimizing for the GP register. */
|
/* We are not optimizing for the $gp register. */
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -12914,7 +12924,7 @@ mips_elf_final_processing ()
|
||||||
else if (file_mips_abi == N32_ABI)
|
else if (file_mips_abi == N32_ABI)
|
||||||
elf_elfheader (stdoutput)->e_flags |= EF_MIPS_ABI2;
|
elf_elfheader (stdoutput)->e_flags |= EF_MIPS_ABI2;
|
||||||
|
|
||||||
/* Nothing to do for "64". */
|
/* Nothing to do for N64_ABI. */
|
||||||
|
|
||||||
if (mips_32bitmode)
|
if (mips_32bitmode)
|
||||||
elf_elfheader (stdoutput)->e_flags |= EF_MIPS_32BITMODE;
|
elf_elfheader (stdoutput)->e_flags |= EF_MIPS_32BITMODE;
|
||||||
|
|
Loading…
Reference in New Issue