This is the mail archive of the binutils@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[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)
     {


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]