u-boot-brain/arch/mips/include/asm
Paul Burton 703ec9ddf9 MIPS: Stop building position independent code
U-Boot has up until now built with -fpic for the MIPS architecture,
producing position independent code which uses indirection through a
global offset table, making relocation fairly straightforward as it
simply involves patching up GOT entries.

Using -fpic does however have some downsides. The biggest of these is
that generated code is bloated in various ways. For example, function
calls are indirected through the GOT & the t9 register:

  8f998064   lw     t9,-32668(gp)
  0320f809   jalr   t9

Without -fpic the call is simply:

  0f803f01   jal    be00fc04 <puts>

This is more compact & faster (due to the lack of the load & the
dependency the jump has on its result). It is also easier to read &
debug because the disassembly shows what function is being called,
rather than just an offset from gp which would then have to be looked up
in the ELF to discover the target function.

Another disadvantage of -fpic is that each function begins with a
sequence to calculate the value of the gp register, for example:

  3c1c0004   lui    gp,0x4
  279c3384   addiu  gp,gp,13188
  0399e021   addu   gp,gp,t9

Without using -fpic this sequence no longer appears at the start of each
function, reducing code size considerably.

This patch switches U-Boot from building with -fpic to building with
-fno-pic, in order to gain the benefits described above. The cost of
this is an extra step during the build process to extract relocation
data from the ELF & write it into a new .rel section in a compact
format, plus the added complexity of dealing with multiple types of
relocation rather than the single type that applied to the GOT. The
benefit is smaller, cleaner, more debuggable code. The relocate_code()
function is reimplemented in C to handle the new relocation scheme,
which also makes it easier to read & debug.

Taking maltael_defconfig as an example the size of u-boot.bin built
using the Codescape MIPS 2016.05-06 toolchain (gcc 4.9.2, binutils
2.24.90) shrinks from 254KiB to 224KiB.

Signed-off-by: Paul Burton <paul.burton@imgtec.com>
Cc: Daniel Schwierzeck <daniel.schwierzeck@gmail.com>
Cc: u-boot@lists.denx.de
Reviewed-by: Daniel Schwierzeck <daniel.schwierzeck@gmail.com>
Tested-by: Daniel Schwierzeck <daniel.schwierzeck@gmail.com>
2017-07-25 20:44:00 +02:00
..
mach-generic MIPS: sync I/O related header files with linux-4.4 2016-01-16 21:06:46 +01:00
addrspace.h MIPS: fix SPDX license identifier in remaining arch header files 2016-01-16 21:06:46 +01:00
asm-offsets.h MIPS: add asm-offsets for struct pt_regs 2016-11-30 16:11:46 +01:00
asm.h MIPS: sync processor and register definitions with linux-4.4 2016-01-16 21:06:46 +01:00
bitops.h MIPS: fix SPDX license identifier in remaining arch header files 2016-01-16 21:06:46 +01:00
byteorder.h MIPS: fix SPDX license identifier in remaining arch header files 2016-01-16 21:06:46 +01:00
cache.h mips: Let cache.h be included from assembly source 2016-11-30 16:13:17 +01:00
cachectl.h MIPS: fix SPDX license identifier in remaining arch header files 2016-01-16 21:06:46 +01:00
cacheops.h MIPS: fix mips_cache fallback without __builtin_mips_cache 2016-03-09 11:00:40 +01:00
cm.h MIPS: Join the coherent domain when a CM is present 2016-09-21 15:04:04 +02:00
config.h MIPS: add support for pre-relocation malloc 2015-01-21 14:07:23 +01:00
const.h mips: Use common _AC macro now. 2017-01-10 08:19:26 -05:00
cpu-features.h MIPS: sync I/O related header files with linux-4.4 2016-01-16 21:06:46 +01:00
global_data.h MIPS: L2 cache support 2016-09-21 15:04:04 +02:00
gpio.h MIPS: add asm/gpio.h to fix compilation error with CONFIG_CMD_GPIO. 2016-01-16 21:06:45 +01:00
io.h MIPS: Fix map_physmem for cached mappings 2016-11-30 16:18:19 +01:00
isadep.h MIPS: sync processor and register definitions with linux-4.4 2016-01-16 21:06:46 +01:00
linkage.h efi: Use asmlinkage for EFIAPI 2016-10-19 09:01:53 +02:00
malta.h malta: IDE support 2015-01-29 13:11:02 +01:00
mipsregs.h MIPS: fix iand optimize setup of CP0 registers 2016-11-30 16:11:46 +01:00
pgtable-bits.h MIPS: sync I/O related header files with linux-4.4 2016-01-16 21:06:46 +01:00
posix_types.h MIPS: fix SPDX license identifier in remaining arch header files 2016-01-16 21:06:46 +01:00
processor.h MIPS: sync processor and register definitions with linux-4.4 2016-01-16 21:06:46 +01:00
ptrace.h MIPS: sync processor and register definitions with linux-4.4 2016-01-16 21:06:46 +01:00
reboot.h MIPS: fix SPDX license identifier in remaining arch header files 2016-01-16 21:06:46 +01:00
reg.h MIPS: fix SPDX license identifier in remaining arch header files 2016-01-16 21:06:46 +01:00
regdef.h MIPS: sync processor and register definitions with linux-4.4 2016-01-16 21:06:46 +01:00
relocs.h MIPS: Stop building position independent code 2017-07-25 20:44:00 +02:00
sections.h MIPS: Stop building position independent code 2017-07-25 20:44:00 +02:00
sgidefs.h MIPS: fix SPDX license identifier in remaining arch header files 2016-01-16 21:06:46 +01:00
string.h MIPS: fix SPDX license identifier in remaining arch header files 2016-01-16 21:06:46 +01:00
system.h MIPS: add handling for generic and EJTAG exceptions 2016-11-30 16:12:17 +01:00
types.h MIPS: fix SPDX license identifier in remaining arch header files 2016-01-16 21:06:46 +01:00
u-boot-mips.h MIPS: add handling for generic and EJTAG exceptions 2016-11-30 16:12:17 +01:00
u-boot.h mips: Make u-boot-mips.h a private header 2017-06-05 11:02:33 -04:00
unaligned.h MIPS: fix SPDX license identifier in remaining arch header files 2016-01-16 21:06:46 +01:00