On 4 August 2016 at 21:18, Ard Biesheuvel <[email protected]> wrote: > On 4 August 2016 at 20:08, Cohen, Eugene <[email protected]> wrote: >> Ard and Leif, >> >> I've been too backlogged to provide a real patchset at this point but wanted >> to get your approval on this proposal... >> >> >> As you know we have some code size sensitive uncompressed XIP stuff going >> on. For C code we get dead code stripping thanks to the >> "-ffunction-sections" switch which places each function in its own section >> so the linker can strip unreferenced sections. >> >> For assembly there is not a solution that's as easy. For RVCT we handled >> this with an assembler macro that combined the procedure label definition, >> export of global symbols and placement of the procedure in its own section. >> For GCC I haven't found a way to fully do this because we rely on the C >> preprocessor for assembly which means you cannot expand to multi-line >> macros. (The label and assembler directives require their own lines but the >> preprocessor collapses stuff onto one line because in the C language >> newlines don't matter.) >> >> So the solution I've settled on is to do this: >> >> in MdePkg\Include\AArch64\ProcessorBind.h define: >> >> /// Macro to place a function in its own section for dead code elimination >> /// This must be placed directly before the corresponding code since the >> /// .section directive applies to the code that follows it. >> #define GCC_ASM_EXPORT_SECTION(func__) \ >> .global _CONCATENATE (__USER_LABEL_PREFIX__, func__) ;\ >> .section .text._CONCATENATE (__USER_LABEL_PREFIX__, func__) ;\ >> .type ASM_PFX(func__), %function; \ >> >> This has the effect of placing the function in a section called >> .text.<func__> so the linker can do its dead code stripping stuff. It also >> absorbs the making the symbol globally visible so the corresponding >> GCC_ASM_EXPORT statement can be removed. >> >> then for every single assembly procedure change from this: >> >> [top of file] >> GCC_ASM_EXPORT (ArmInvalidateDataCacheEntryByMVA) >> >> [lower down] >> ASM_PFX(ArmInvalidateDataCacheEntryByMVA): >> dc ivac, x0 // Invalidate single data cache line >> ret >> >> to this: >> >> GCC_ASM_EXPORT_SECTION(ArmInvalidateDataCacheEntryByMVA) >> ASM_PFX(ArmInvalidateDataCacheEntryByMVA): >> dc ivac, x0 // Invalidate single data cache line >> ret >> >> Because the assembly label must appear in column 1 I couldn't find a way to >> use the C preprocessor to absorb it so hence the two lines. If you can find >> a way to improve on this it would be great. >> > > What about GAS macros (.macro / .endm). I prefer those over cpp macros > in assembler anyway. >
FYI there is a null token \() for GAS which you can use to concatenate a string with a macro argument, e.g., .macro func, x .globl \x .type \x, %function .section .text.\x \x\(): .endm >> I'm not sure what impacts this might have to other toolchains - can this be >> translated to CLANG and ARM Compiler? >> > > The asm dialect is 99% aligned between CLANG and GNU as, so this > shouldn't be a problem > >> I'd like to get your OK on this conceptually and then I could upstream some >> patches that modify the AArch64 *.S files to use this approach. >> Unfortunately it won't be complete because I only updated the libraries that >> we use. My hope is that long term all assembly (or at least assembly in >> libraries) adopt this approach so we are positioned for maximum dead code >> stripping. >> > > I think this would be an improvement, so go for it. The only thing to > be wary of is routines that fall through into the subsequent one. > Those need to remain in the same section. _______________________________________________ edk2-devel mailing list [email protected] https://lists.01.org/mailman/listinfo/edk2-devel

