Maciej W. Rozycki fe152e64f6 MIPS/BFD: Actually produce short microMIPS LA25 stubs
For the case where a function which requires an LA25 stub is at the
beginning of a section we use a short sequence comprised of a LUI/ADDIU
instruction pair only and prepended to the associated function rather
than using a trailing jump to reach the function.  This works by
checking for the offset into section of the function symbol being 0.

This is however never the case for microMIPS function symbols, which
have the ISA bit set.  Consequently the short LA25 sequence is never
produced for microMIPS functions, like with the following example:

$ cat la25a.s
	.abicalls

	.global	f1
	.ent	f1
f1:
	.set	noreorder
	.cpload	$25
	.set	reorder
	.option	pic0
	jal	f2
	.option	pic2
	jr	$31
	.end	f1

	.global	f2
	.ent	f2
f2:
	jr	$31
	.end	f2
$ cat la25b.s
	.abicalls
	.option	pic0

	.global	__start
	.ent	__start
__start:
	jal	f1
	jal	f2
	.end	__start
$ as -mmicromips -32 -EB -o la25a.o la25a.s
$ as -mmicromips -32 -EB -o la25b.o la25b.s
$ ld -melf32btsmip -o la25 la25a.o la25b.o
$ objdump -d la25

la25:     file format elf32-tradbigmips

Disassembly of section .text:

004000d0 <.pic.f2>:
  4000d0:	41b9 0040 	lui	t9,0x40
  4000d4:	d420 0083 	j	400106 <f2>
  4000d8:	3339 0107 	addiu	t9,t9,263
  4000dc:	0000 0000 	nop

004000e0 <.pic.f1>:
  4000e0:	41b9 0040 	lui	t9,0x40
  4000e4:	d420 0078 	j	4000f0 <f1>
  4000e8:	3339 00f1 	addiu	t9,t9,241
  4000ec:	0000 0000 	nop

004000f0 <f1>:
  4000f0:	41bc 0002 	lui	gp,0x2
  4000f4:	339c 801f 	addiu	gp,gp,-32737
  4000f8:	033c e150 	addu	gp,gp,t9
  4000fc:	f420 0083 	jal	400106 <f2>
  400100:	0000 0000 	nop
  400104:	45bf      	jrc	ra

00400106 <f2>:
  400106:	45bf      	jrc	ra
	...

00400110 <__start>:
  400110:	f420 0070 	jal	4000e0 <.pic.f1>
  400114:	0000 0000 	nop
  400118:	f420 0068 	jal	4000d0 <.pic.f2>
  40011c:	0000 0000 	nop
$

where `.pic.f1' could omit the trailing jump and the filler NOP and just
fall through to `f1'.

Correct the problem by masking out the ISA bit from microMIPS functions,
which fixes the earlier example:

$ objdump -d la25

la25:     file format elf32-tradbigmips

Disassembly of section .text:

004000d0 <.pic.f2>:
  4000d0:	41b9 0040 	lui	t9,0x40
  4000d4:	d420 0083 	j	400106 <f2>
  4000d8:	3339 0107 	addiu	t9,t9,263
	...

004000e8 <.pic.f1>:
  4000e8:	41b9 0040 	lui	t9,0x40
  4000ec:	3339 00f1 	addiu	t9,t9,241

004000f0 <f1>:
  4000f0:	41bc 0002 	lui	gp,0x2
  4000f4:	339c 801f 	addiu	gp,gp,-32737
  4000f8:	033c e150 	addu	gp,gp,t9
  4000fc:	f420 0083 	jal	400106 <f2>
  400100:	0000 0000 	nop
  400104:	45bf      	jrc	ra

00400106 <f2>:
  400106:	45bf      	jrc	ra
	...

00400110 <__start>:
  400110:	f420 0074 	jal	4000e8 <.pic.f1>
  400114:	0000 0000 	nop
  400118:	f420 0068 	jal	4000d0 <.pic.f2>
  40011c:	0000 0000 	nop
$

There is no need to do anything for MIPS16 functions, because if any
LA25 stub has been generated for such a function, then it is only
required for an associated call thunk only, which is regular MIPS code
and the address of which, with the ISA bit clear, is returned by
`mips_elf_get_la25_target'.

This problem has been there since the beginning of microMIPS support:

commit df58fc944dbc6d5efd8d3826241b64b6af22f447
Author: Richard Sandiford <rdsandiford@googlemail.com>
Date:   Sun Jul 24 14:20:15 2011 +0000

<https://sourceware.org/ml/binutils/2011-07/msg00198.html>, ("MIPS:
microMIPS ASE support").

	bfd/
	* elfxx-mips.c (mips_elf_add_la25_stub): Clear the ISA bit of
	the stub address retrieved if associated with a microMIPS
	function.
2016-08-10 22:22:50 +01:00
2016-02-10 10:54:29 +00:00
2016-03-03 12:55:30 +10:30
2016-07-21 15:22:13 -07:00
2015-08-31 12:53:36 +09:30
2016-08-09 16:41:29 -07:00
2016-05-09 17:24:30 +09:30
2014-11-16 13:43:48 +01:00
2015-07-27 07:49:05 -07:00
2014-11-16 13:43:48 +01:00
2014-11-16 13:43:48 +01:00
2016-01-12 08:44:52 -08:00
2014-02-06 11:01:57 +01:00
2016-05-28 22:36:04 +09:30
2014-11-16 13:43:48 +01:00
2014-11-16 13:43:48 +01:00
2014-11-16 13:43:48 +01:00

		   README for GNU development tools

This directory contains various GNU compilers, assemblers, linkers, 
debuggers, etc., plus their support routines, definitions, and documentation.

If you are receiving this as part of a GDB release, see the file gdb/README.
If with a binutils release, see binutils/README;  if with a libg++ release,
see libg++/README, etc.  That'll give you info about this
package -- supported targets, how to use it, how to report bugs, etc.

It is now possible to automatically configure and build a variety of
tools with one command.  To build all of the tools contained herein,
run the ``configure'' script here, e.g.:

	./configure 
	make

To install them (by default in /usr/local/bin, /usr/local/lib, etc),
then do:
	make install

(If the configure script can't determine your type of computer, give it
the name as an argument, for instance ``./configure sun4''.  You can
use the script ``config.sub'' to test whether a name is recognized; if
it is, config.sub translates it to a triplet specifying CPU, vendor,
and OS.)

If you have more than one compiler on your system, it is often best to
explicitly set CC in the environment before running configure, and to
also set CC when running make.  For example (assuming sh/bash/ksh):

	CC=gcc ./configure
	make

A similar example using csh:

	setenv CC gcc
	./configure
	make

Much of the code and documentation enclosed is copyright by
the Free Software Foundation, Inc.  See the file COPYING or
COPYING.LIB in the various directories, for a description of the
GNU General Public License terms under which you can copy the files.

REPORTING BUGS: Again, see gdb/README, binutils/README, etc., for info
on where and how to report problems.
Description
Unofficial mirror of sourceware binutils-gdb repository. Updated daily.
Readme 780 MiB
Languages
C 51.8%
Makefile 22.4%
Assembly 12.3%
C++ 6%
Roff 1.4%
Other 5.4%