29 Jan, 2018

1 commit

  • Several host-tools use "bool" type without including .
    This relies on the crappy header inclusion chain.

    tools/Makefile has the following line:

    HOST_EXTRACFLAGS += -include $(srctree)/include/libfdt_env.h \

    All host-tools are forced to include libfdt_env.h even if they are
    totally unrelated to FDT. Then, is indirectly included
    as follows:

    include/libfdt_env.h
    -> include/linux/types.h
    ->

    I am fixing this horrible crap. In advance, I need to add necessary
    include directives explicitly. tools/fdtgrep.c needs more;
    for open() and for errno.

    Signed-off-by: Masahiro Yamada
    Reviewed-by: Joe Hershberger
    Reviewed-by: Simon Glass

    Masahiro Yamada
     

26 Jul, 2017

2 commits

  • It seems that gcc 6.3 at least is smart enough to warn about the _val
    variable being unassigned in the default case in the set_hdr_field()
    macro, but not smart enough to figure out that the default case is never
    taken. This results in warnings such as the following:

    pfx##hdr32[idx].field = _val; \
    ^
    ../tools/mips-relocs.c:51:11: note: _val was declared here
    uint64_t _val; \
    ^
    ../tools/mips-relocs.c:88:2: note: in expansion of macro set_hdr_field
    set_hdr_field(p, idx, field, val)
    ^~~~~~~~~~~~~
    ../tools/mips-relocs.c:408:3: note: in expansion of macro set_phdr_field
    set_phdr_field(i, p_filesz, load_sz);
    ^~~~~~~~~~~~~~
    ../tools/mips-relocs.c: In function main:
    ../tools/mips-relocs.c:77:25: warning: _val may be used uninitialized
    in this function [-Wmaybe-uninitialized]

    Avoid this by assigning _val = 0 in the default case, and asserting that
    we didn't actually hit it for good measure.

    For reference gcc 7.1.1 seems to be smart enough to not hit the above
    warning without this patch.

    Signed-off-by: Paul Burton
    Fixes: 011dd93ca97a ("MIPS: Stop building position independent code")
    Cc: Daniel Schwierzeck
    Cc: Tom Rini
    Cc: u-boot@lists.denx.de

    Paul Burton
     
  • 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

    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
    Cc: Daniel Schwierzeck
    Cc: u-boot@lists.denx.de
    Reviewed-by: Daniel Schwierzeck
    Tested-by: Daniel Schwierzeck

    Paul Burton