On Thu, Dec 24, 2015 at 02:03:16PM +0100, Ard Biesheuvel wrote:
> The tiny code model for AARCH64 is the most efficient model, since its
> symbol references are relative via a single 32-bit ADR instruction. This
> gives us a range of only +/- 1 MB, but this is sufficient for the vast
> majority of the modules that make up a typical EDK2 firmware. Since the
> reference is relative, it does not result in a fixup entry in the PE/COFF
> relocation table. Unlike the small code model, which uses ADRP instructions,
> the tiny model does not impose section alignment requirements.
> 
> However, in some cases, (e.g., the full Shell binary built in DEBUG mode)
> the resulting binary exceeds 1 MB, which may result in build errors if
> code at one end of the image references a symbol at the other end.
> 
> Since the tiny and small code models can coexist in a single binary, we
> can work around this problem by making sure that tiny model .text and
> .data sections are emitted in close proximity to each other, by reducing
> the function alignment for tiny model code (which by itself should also be
> an improvement in terms of code size), and sorting the linker input by
> alignment.

Hmm...

> Contributed-under: TianoCore Contribution Agreement 1.0
> Signed-off-by: Ard Biesheuvel <[email protected]>
> ---
>  BaseTools/Conf/tools_def.template | 4 ++--
>  1 file changed, 2 insertions(+), 2 deletions(-)
> 
> diff --git a/BaseTools/Conf/tools_def.template 
> b/BaseTools/Conf/tools_def.template
> index 0cc85a6f359d..fbf0841fc91f 100644
> --- a/BaseTools/Conf/tools_def.template
> +++ b/BaseTools/Conf/tools_def.template
> @@ -4437,10 +4437,10 @@ DEFINE GCC49_ASM_FLAGS               = 
> DEF(GCC48_ASM_FLAGS)
>  DEFINE GCC49_ARM_ASM_FLAGS           = DEF(GCC48_ARM_ASM_FLAGS)
>  DEFINE GCC49_AARCH64_ASM_FLAGS       = DEF(GCC48_AARCH64_ASM_FLAGS)
>  DEFINE GCC49_ARM_CC_FLAGS            = DEF(GCC48_ARM_CC_FLAGS)
> -DEFINE GCC49_AARCH64_CC_FLAGS        = $(ARCHCC_FLAGS) $(PLATFORM_FLAGS) 
> DEF(GCC44_ALL_CC_FLAGS) -mcmodel=tiny DEF(GCC_AARCH64_CC_FLAGS)
> +DEFINE GCC49_AARCH64_CC_FLAGS        = $(ARCHCC_FLAGS) $(PLATFORM_FLAGS) 
> DEF(GCC44_ALL_CC_FLAGS) -mcmodel=tiny -falign-functions=4 
> DEF(GCC_AARCH64_CC_FLAGS)

My GCC manpage claims that
"-Os disables the following optimization flags: -falign-functions ..."
and -Os is set in GCC_ALL_CC_FLAGS, and as far as I can see not
overridden for AARCH64, except for DEBUG builds.

>  DEFINE GCC49_ARM_DLINK_FLAGS         = DEF(GCC48_ARM_DLINK_FLAGS)
>  DEFINE GCC49_ARM_DLINK2_FLAGS        = DEF(GCC48_ARM_DLINK2_FLAGS)
> -DEFINE GCC49_AARCH64_DLINK_FLAGS     = DEF(GCC48_AARCH64_DLINK_FLAGS)
> +DEFINE GCC49_AARCH64_DLINK_FLAGS     = DEF(GCC48_AARCH64_DLINK_FLAGS) 
> --sort-section=alignment

No objection to this one.

>  DEFINE GCC49_AARCH64_DLINK2_FLAGS    = DEF(GCC48_AARCH64_DLINK2_FLAGS)
>  DEFINE GCC49_ARM_ASLDLINK_FLAGS      = DEF(GCC48_ARM_ASLDLINK_FLAGS)
>  DEFINE GCC49_AARCH64_ASLDLINK_FLAGS  = DEF(GCC48_AARCH64_ASLDLINK_FLAGS)
> -- 
> 2.5.0
> 
_______________________________________________
edk2-devel mailing list
[email protected]
https://lists.01.org/mailman/listinfo/edk2-devel

Reply via email to