This is the mail archive of the
binutils@sourceware.org
mailing list for the binutils project.
[PATCH] MIPS/GAS: Disable PIC pseudo-ops in the MIPS16 mode
- From: "Maciej W. Rozycki" <macro at codesourcery dot com>
- To: <binutils at sourceware dot org>
- Cc: Richard Sandiford <rdsandiford at googlemail dot com>
- Date: Mon, 24 Oct 2011 22:56:48 +0100
- Subject: [PATCH] MIPS/GAS: Disable PIC pseudo-ops in the MIPS16 mode
Hi,
We don't really support the PIC pseudo-ops in the MIPS16 mode, and
frankly I have doubts if they make sense in that mode in the first place
-- we just don't have the complementing infrastructure, e.g. the MIPS16
counterpart of the PIC JAL macro and the limitations of the instruction
set likely make it infeasible.
Worse yet, some of these pseudo-ops trigger assertion failures, e.g.:
$ cat cpload16.s
.set mips16
.set noreorder
foo:
.cpload $25
$ mips-linux-gnu-as -KPIC cpload16.s
cpload16.s: Assembler messages:
cpload16.s:4: Internal error!
Assertion failure in macro_build_lui at [...]/gas/config/tc-mips.c line 5284.
Please report this bug.
$
so let's just disable them all altogether.
Regression-tested successfully, for the mips-linux-gnu and mips-sde-elf
targets. OK to apply?
2011-10-24 Maciej W. Rozycki <macro@codesourcery.com>
gas/
* config/tc-mips.c (s_cpload, s_cpsetup): Fail if MIPS16 mode.
(s_cplocal, s_cprestore, s_cpreturn): Likewise.
Maciej
binutils-gas-cpmips16-fix.diff
Index: binutils-fsf-trunk-quilt/gas/config/tc-mips.c
===================================================================
--- binutils-fsf-trunk-quilt.orig/gas/config/tc-mips.c 2011-10-24 22:15:38.555969862 +0100
+++ binutils-fsf-trunk-quilt/gas/config/tc-mips.c 2011-10-24 22:15:38.735905037 +0100
@@ -16315,6 +16315,9 @@ s_cpload (int ignore ATTRIBUTE_UNUSED)
return;
}
+ if (mips_opts.mips16)
+ as_bad (_("%s not supported in MIPS16 mode"), ".cpload");
+
/* .cpload should be in a .set noreorder section. */
if (mips_opts.noreorder == 0)
as_warn (_(".cpload not in noreorder section"));
@@ -16381,6 +16384,9 @@ s_cpsetup (int ignore ATTRIBUTE_UNUSED)
return;
}
+ if (mips_opts.mips16)
+ as_bad (_("%s not supported in MIPS16 mode"), ".cpsetup");
+
reg1 = tc_get_register (0);
SKIP_WHITESPACE ();
if (*input_line_pointer != ',')
@@ -16473,6 +16479,9 @@ s_cplocal (int ignore ATTRIBUTE_UNUSED)
return;
}
+ if (mips_opts.mips16)
+ as_bad (_("%s not supported in MIPS16 mode"), ".cplocal");
+
mips_gp_register = tc_get_register (0);
demand_empty_rest_of_line ();
}
@@ -16494,6 +16503,9 @@ s_cprestore (int ignore ATTRIBUTE_UNUSED
return;
}
+ if (mips_opts.mips16)
+ as_bad (_("%s not supported in MIPS16 mode"), ".cprestore");
+
mips_cprestore_offset = get_absolute_expression ();
mips_cprestore_valid = 1;
@@ -16530,6 +16542,9 @@ s_cpreturn (int ignore ATTRIBUTE_UNUSED)
return;
}
+ if (mips_opts.mips16)
+ as_bad (_("%s not supported in MIPS16 mode"), ".cpreturn");
+
macro_start ();
if (mips_cpreturn_register == -1)
{