Below is my Clang3.8 output. The Clang3.8 simply does not permit use mix use 
_ms_va_list related builtins with System V ABI, only for Win64 ABI.

$ clang -flto -Wl,-Os ms_abi.c
ms_abi.c:19:3: error: '__builtin_ms_va_start' used in System V ABI function
  VA_START (Marker, len);
  ^
ms_abi.c:6:38: note: expanded from macro 'VA_START'
#define VA_START(Marker, Parameter)  __builtin_ms_va_start (Marker, Parameter)
                                     ^
1 error generated.

$ cat ms_abi.c
#include <stdio.h>

typedef __builtin_ms_va_list VA_LIST;
typedef unsigned long long  UINTN;

#define VA_START(Marker, Parameter)  __builtin_ms_va_start (Marker, Parameter)

#define VA_ARG(Marker, TYPE)         ((sizeof (TYPE) < sizeof (UINTN)) ? 
(TYPE)(__builtin_va_arg (Marker, UINTN)) : (TYPE)(__builtin_va_arg (Marker, 
TYPE)))

#define VA_END(Marker)               __builtin_ms_va_end (Marker)

#define VA_COPY(Dest, Start)         __builtin_ms_va_copy (Dest, Start)

int EFI_printf(const int len, ...)
{
  VA_LIST Marker;
  int i;

  VA_START (Marker, len);
  for (i=0; i < len; i++) {
    printf ("%d - %d\n", i, VA_ARG(Marker, int));
  }

  VA_END(Marker);
  return len;
}

int
main ()
{
  EFI_printf (8, 10, 11, 12, 12, 14, 15, 16, 17);
  return 0;
}


BTW, if current XCODE has the ms_abi va_list issue, how the XCODE built X64 
debug OVMF tip could really boot (it should hang when DEBUG print)?  Does Mac 
support qemu? If not, and if you need, I can help you to test it in my ubuntu. 
Please build X64 debug OVMF tip with below command and send me the OVMF.fd.
build -a X64 -t XCODE -p OvmfPkg/OvmfPkgX64.dsc -n 5 -b DEBUG 
-DDEBUG_ON_SERIAL_PORT

I usually test OVMF firmware with below command:
qemu-system-x86_64.exe  -bios OVMF.fd -serial file:serial.log -m 512 -hda fat:.




Steven Shi
Intel\SSG\STO\UEFI Firmware

Tel: +86 021-61166522
iNet: 821-6522


> -----Original Message-----
> From: af...@apple.com [mailto:af...@apple.com]
> Sent: Thursday, May 12, 2016 11:15 PM
> To: Shi, Steven <steven....@intel.com>
> Cc: edk2-devel@lists.01.org
> Subject: Re: [edk2] edk2 llvm branch
> 
> 
> > On May 12, 2016, at 7:51 AM, Shi, Steven <steven....@intel.com> wrote:
> >
> > Hi Andrew,
> > Below is my clang3.8 output:
> > $ clang --version
> > clang version 3.8.0 (tags/RELEASE_380/final)
> > Target: x86_64-unknown-linux-gnu
> > Thread model: posix
> > InstalledDir: /usr/local/bin
> >
> > $ clang -Os -flto ms_abi.c
> > ms_abi.c:19:3: error: 'va_start' used in Win64 ABI function
> >  VA_START (Marker, len);
> >  ^
> > ms_abi.c:6:38: note: expanded from macro 'VA_START'
> > #define VA_START(Marker, Parameter)  __builtin_va_start (Marker,
> Parameter)
> >                                     ^
> > 1 error generated.
> >
> > You can see the ms_abi va_list issue has been simply solved in LLVM3.8.
> Now both LLVM and GCC have a workaround to support va_list with MS ABI
> on x64 platform.
> >
> > Use
> >  __builtin_ms_va_list ap;
> >  __builtin_ms_va_start (ap, n);
> >  __builtin_ms_va_end (ap);
> >
> > instead of
> >
> >  __builtin_va_list ap;
> >  __builtin_va_start (ap, n);
> >  __builtin_va_end (ap);
> >
> 
> Steven,
> 
> I don't think that fixed the problem it moved the problem.  Before int call 
> (int
> a, ...) worked and __attribute__((ms_abi))  call (int a, ...)  did not. I 
> think you
> just flipped it so that  int call (int a, ...) no longer works, but
> __attribute__((ms_abi))  call (int a, ...)  does. That has the side effect of
> making the libs work as they are all EFIAPI. If an application/driver had an
> internal var arg function that was NOT EFIAPI it might fail?
> 
> Try my example with your fix (__builtin_ms_va_start) but remove
> __attribute__((ms_abi)) and see if you get the correct answer.
> 
> I'll ping our compiler team to see if there is a better answer.
> 
> Thanks,
> 
> Andrew Fish
> 
> > In my current edk2 llvm branch, I've already use above workaround. See it
> in lines 494~502 of
> https://github.com/shijunjing/edk2/blob/llvm/MdePkg/Include/Base.h , and
> it works. You can see how I push to fix this issue in below links:
> > Clang: http://lists.llvm.org/pipermail/llvm-dev/2016-January/093778.html
> > GCC: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=50818
> > CLANG3.8 is better than GCC7.0 on this issue because CLANG3.8 will give a
> compiler error message like above to explicitly ban the va_list builtins with
> MS ABI, but GCC has no warning and continue to confuse user.
> >
> > Maybe XCode need sync the clang3.8 fix for the ms_abi va_list issue.
> >
> > Below is to apply the ms_va_list workaround in your code, and it looks
> work now.
> > $ cat ms_abi.c
> > #include <stdio.h>
> >
> > typedef __builtin_ms_va_list VA_LIST;
> > typedef unsigned long long  UINTN;
> >
> > #define VA_START(Marker, Parameter)  __builtin_ms_va_start (Marker,
> Parameter)
> >
> > #define VA_ARG(Marker, TYPE)         ((sizeof (TYPE) < sizeof (UINTN)) ?
> (TYPE)(__builtin_va_arg (Marker, UINTN)) : (TYPE)(__builtin_va_arg (Marker,
> TYPE)))
> >
> > #define VA_END(Marker)               __builtin_ms_va_end (Marker)
> >
> > #define VA_COPY(Dest, Start)         __builtin_ms_va_copy (Dest, Start)
> >
> > __attribute__((ms_abi)) int EFI_printf(const int len, ...)
> > {
> >  VA_LIST Marker;
> >  int i;
> >
> >  VA_START (Marker, len);
> >  for (i=0; i < len; i++) {
> >    printf ("%d - %d\n", i, VA_ARG(Marker, int));
> >  }
> >
> >  VA_END(Marker);
> >  return len;
> > }
> >
> > int
> > main ()
> > {
> >  EFI_printf (8, 10, 11, 12, 12, 14, 15, 16, 17);
> >  return 0;
> > }
> >
> > $ clang -flto -Wl,-Os ms_abi.c
> > $ ./a.out
> > 0 - 10
> > 1 - 11
> > 2 - 12
> > 3 - 12
> > 4 - 14
> > 5 - 15
> > 6 - 16
> > 7 - 17
> >
> > So, I believe my current Clang3.8 LTO not stable issue is a new one, and I
> will continue to debug it. I will let you know if I make progress.
> >
> >
> > Steven Shi
> > Intel\SSG\STO\UEFI Firmware
> >
> > Tel: +86 021-61166522
> > iNet: 821-6522
> >
> >> -----Original Message-----
> >> From: af...@apple.com [mailto:af...@apple.com]
> >> Sent: Thursday, May 12, 2016 2:42 AM
> >> To: Shi, Steven <steven....@intel.com>
> >> Cc: edk2-devel@lists.01.org
> >> Subject: Re: [edk2] edk2 llvm branch
> >>
> >>
> >>> On May 11, 2016, at 9:38 AM, Shi, Steven <steven....@intel.com> wrote:
> >>>
> >>> Hi Andrew,
> >>>
> >>> Attachment and below are my build map files and code size for your
> >> suggested two modules with CLANGLTO38 and VS2013x86. Maybe I
> should
> >> use latest VS2015x86 for the comparing next time.
> >>>
> >>
> >> Steven,
> >>
> >> Thanks for the data.
> >>
> >>>
> >>>
> >>> *         CLANGLTO38:
> >>>
> >>>> build -a IA32 -t CLANGLTO38 -p OvmfPkg/OvmfPkgIa32.dsc -n 5 -m
> >> IntelFrameworkModulePkg/Universal/StatusCode/Pei/StatusCodePei.inf -
> b
> >> RELEASE
> >>>
> >>> 1,184
> >>>
> >>>> build -a IA32 -t CLANGLTO38 -p OvmfPkg/OvmfPkgIa32.dsc -n 5 -m
> >> IntelFrameworkModulePkg/Universal/StatusCode/Pei/StatusCodePei.inf -
> b
> >> DEBUG -DDEBUG_ON_SERIAL_PORT
> >>>
> >>> 7,648
> >>>
> >>>> build -a X64 -t CLANGLTO38 -p OvmfPkg/OvmfPkgX64.dsc -n 5 -m
> >> PcAtChipsetPkg/8254TimerDxe/8254Timer.inf -b RELEASE
> >>>
> >>> 1,600
> >>>
> >>>> build -a X64 -t CLANGLTO38 -p OvmfPkg/OvmfPkgX64.dsc -n 5 -m
> >> PcAtChipsetPkg/8254TimerDxe/8254Timer.inf -b DEBUG -
> >> DDEBUG_ON_SERIAL_PORT
> >>>
> >>> 11,712 (with -fno-lto to disable lto in
> >> MdePkg\Library\BasePrintLib\BasePrintLib.inf, which is to work around
> CPU
> >> exception in PrintLib during boot time)
> >>>
> >>> 8,736 (with lto enalbed in BasePrintLib.inf)
> >>>
> >>>
> >>>
> >>> *         VS2013x86:
> >>>
> >>>> build -a IA32 -t VS2013x86 -p OvmfPkg/OvmfPkgIa32.dsc -n 5 -m
> >> IntelFrameworkModulePkg/Universal/StatusCode/Pei/StatusCodePei.inf -
> b
> >> RELEASE
> >>>
> >>> 1,280
> >>>
> >>>> build -a IA32 -t VS2013x86 -p OvmfPkg/OvmfPkgIa32.dsc -n 5 -m
> >> IntelFrameworkModulePkg/Universal/StatusCode/Pei/StatusCodePei.inf -
> b
> >> DEBUG -DDEBUG_ON_SERIAL_PORT
> >>>
> >>> 8,576
> >>>
> >>>> build -a X64 -t VS2013x86 -p OvmfPkg/OvmfPkgX64.dsc -n 5 -m
> >> PcAtChipsetPkg/8254TimerDxe/8254Timer.inf -b RELEASE
> >>>
> >>> 1,760
> >>>
> >>>> build -a X64 -t VS2013x86 -p OvmfPkg/OvmfPkgX64.dsc -n 5 -m
> >> PcAtChipsetPkg/8254TimerDxe/8254Timer.inf -b DEBUG -
> >> DDEBUG_ON_SERIAL_PORT
> >>>
> >>> 9,760
> >>>
> >>>
> >>>
> >>> I believe the clang3.8 with LTO enabled is good enough on code size. My
> >> current biggest trouble is the Clang3.8 LTO not stable on GNU ld when
> >> generate X64 code, and worse on gold (even cannot finish build). I've
> >> reported two bugs about LTO against GNU ld and gold in below, FYI.
> >>>
> >>> https://sourceware.org/bugzilla/show_bug.cgi?id=20062
> >>>
> >>> https://sourceware.org/bugzilla/show_bug.cgi?id=20070
> >>>
> >>>
> >>
> >> Are those the linker command line failures? What about the code
> generation
> >> issues?
> >>
> >> On the code gen issues I would guess they have to do with
> >> __attribute__((ms_abi)) (call x86_64_win64cc in bit code)and var args.
> You
> >> might try building some simple examples at the command line and see if
> you
> >> can find an error. So for example you could write a simple Unix command
> >> line app to test calling a __attribute__((ms_abi)) var arg function that
> prints
> >> out information.
> >>
> >> What I usually do is try to make the simplest EFI case possible and then I
> >> locally define the EFI types. That makes it really easy to reproduce the
> issue
> >> for the compiler team.
> >>
> >> ~/work/Compiler>cat ms_abi.c
> >> #include <stdio.h>
> >>
> >> typedef __builtin_va_list VA_LIST;
> >> typedef unsigned long long  UINTN;
> >>
> >> #define VA_START(Marker, Parameter)  __builtin_va_start (Marker,
> >> Parameter)
> >>
> >> #define VA_ARG(Marker, TYPE)         ((sizeof (TYPE) < sizeof (UINTN)) ?
> >> (TYPE)(__builtin_va_arg (Marker, UINTN)) : (TYPE)(__builtin_va_arg
> (Marker,
> >> TYPE)))
> >>
> >> #define VA_END(Marker)               __builtin_va_end (Marker)
> >>
> >> #define VA_COPY(Dest, Start)         __builtin_va_copy (Dest, Start)
> >>
> >> __attribute__((ms_abi)) int EFI_printf(const int len, ...)
> >> {
> >>  VA_LIST Marker;
> >>  int i;
> >>
> >>  VA_START (Marker, len);
> >>  for (i=0; i < len; i++) {
> >>    printf ("%d - %d\n", i, VA_ARG(Marker, int));
> >>  }
> >>
> >>  VA_END(Marker);
> >>  return len;
> >> }
> >>
> >> int
> >> main ()
> >> {
> >>  EFI_printf (8, 10, 11, 12, 12, 14, 15, 16, 17);
> >>  return 0;
> >> }~/work/Compiler>clang -Os -flto ms_abi.c
> >> ~/work/Compiler>./a.out
> >> 0 - 10
> >> 1 - 11
> >> 2 - 12
> >> 3 - 12
> >> 4 - 14
> >> 5 - 15
> >> 6 - 10
> >> 7 - 11
> >> ~/work/Compiler>
> >>
> >> Yikes I think I just reproduced your bug in the Xcode clang. Can you try 
> >> this
> >> example on your toolchain and report the issue if you see it.
> >>
> >>>
> >>> BTW, does XCODE linker have linux version? If yes, I'd like to try it to 
> >>> co-
> >> work with clang 3.8 as CC compiler.
> >>>
> >>>
> >>
> >> No it is Mac only, and only supports Mach-O not ELF. It is my
> understanding
> >> that the Xcode  linker just links the bit code like normal (pulls in the
> symbols
> >> that are needed).  Then this linked bit code blob is sent to an LLVM
> dynamic
> >> library to do the code gen. Maybe different version of LLVM are used by
> the
> >> different linkers in your case, or maybe the LLVM stuff is compiled in?
> >>
> >>
> >>
> >> Thanks,
> >>
> >> Andrew Fish
> >>
> >>>
> >>>
> >>>
> >>> Steven Shi
> >>>
> >>> Intel\SSG\STO\UEFI Firmware
> >>>
> >>>
> >>>
> >>> Tel: +86 021-61166522
> >>>
> >>> iNet: 821-6522
> >>>
> >>>
> >>>
> >>>> -----Original Message-----
> >>>
> >>>> From: af...@apple.com [mailto:af...@apple.com]
> >>>
> >>>> Sent: Wednesday, May 11, 2016 11:09 PM
> >>>
> >>>> To: Shi, Steven <steven....@intel.com>
> >>>
> >>>> Cc: edk2-devel@lists.01.org
> >>>
> >>>> Subject: Re: [edk2] edk2 llvm branch
> >>>
> >>>>
> >>>
> >>>>
> >>>
> >>>>> On May 11, 2016, at 5:08 AM, Shi, Steven
> >> <steven....@intel.com<mailto:steven....@intel.com>> wrote:
> >>>
> >>>>>
> >>>
> >>>>> Hi Andrew,
> >>>
> >>>>> From your data, it looks the XCode LTO is not enabled correctly for
> IA32,
> >>>
> >>>> but correct for X64. Attachment has my build map files, and below are
> my
> >>>
> >>>> build commands. FYI.
> >>>
> >>>>>
> >>>
> >>>>
> >>>
> >>>> Sorry had a typo in the tools_def.txt, here are the numbers with -flto
> >>>
> >>>> correctly added to the CC_FLAGS:
> >>>
> >>>>
> >>>
> >>>>> build -a IA32 -t XCODE5 -p OvmfPkg/OvmfPkgIa32.dsc -n 5 -m
> >>>
> >>>> MdeModulePkg/Core/Pei/PeiMain.inf -b RELEASE
> >>>
> >>>> 25K
> >>>
> >>>>> build -a IA32 -t XCODE5 -p OvmfPkg/OvmfPkgIa32.dsc -n 5 -m
> >>>
> >>>> MdeModulePkg/Core/Pei/PeiMain.inf -b DEBUG -
> >>>
> >>>> DDEBUG_ON_SERIAL_PORT
> >>>
> >>>> 45K
> >>>
> >>>>> build -a X64 -t XCODE5 -p OvmfPkg/OvmfPkgX64.dsc -n 5 -m
> >>>
> >>>> MdeModulePkg/Core/Dxe/DxeMain.inf -b RELEASE
> >>>
> >>>> 103K
> >>>
> >>>>> build -a X64  -t XCODE5 -p OvmfPkg/OvmfPkgX64.dsc -n 5 -m
> >>>
> >>>> MdeModulePkg/Core/Dxe/DxeMain.inf -b DEBUG -
> >>>
> >>>> DDEBUG_ON_SERIAL_PORT
> >>>
> >>>> 133K
> >>>
> >>>>
> >>>
> >>>> When doing size optimizations it is often easier to start with smaller
> >> drivers.
> >>>
> >>>> Can you send the sizes/map files for:
> >>>
> >>>>> build -a IA32 -t XCODE5 -p OvmfPkg/OvmfPkgIa32.dsc -n 5 -m
> >>>
> >>>>
> IntelFrameworkModulePkg/Universal/StatusCode/Pei/StatusCodePei.inf -
> >> b
> >>>
> >>>> RELEASE
> >>>
> >>>> 1220
> >>>
> >>>>> build -a IA32 -t XCODE5 -p OvmfPkg/OvmfPkgIa32.dsc -n 5 -m
> >>>
> >>>>
> IntelFrameworkModulePkg/Universal/StatusCode/Pei/StatusCodePei.inf -
> >> b
> >>>
> >>>> DEBUG -DDEBUG_ON_SERIAL_PORT
> >>>
> >>>> 8228
> >>>
> >>>>> build -a X64 -t XCODE5 -p OvmfPkg/OvmfPkgX64.dsc -n 5 -m
> >>>
> >>>> PcAtChipsetPkg/8254TimerDxe/8254Timer.inf -b RELEASE
> >>>
> >>>> 2464
> >>>
> >>>>> build -a X64 -t XCODE5 -p OvmfPkg/OvmfPkgX64.dsc -n 5 -m
> >>>
> >>>> PcAtChipsetPkg/8254TimerDxe/8254Timer.inf -b DEBUG -
> >>>
> >>>> DDEBUG_ON_SERIAL_PORT
> >>>
> >>>> 9088
> >>>
> >>>>
> >>>
> >>>>
> >>>
> >>>>
> >>>
> >>>> I forgot to mention that X64 XCODE5/clang has a 5 byte overhead per
> >>>
> >>>> function vs.VS2013x86 due to supporting stack unwind. The upside is
> the
> >>>
> >>>> unexpected exception handler can print out a stack trace. VS2013x86
> >>>
> >>>> requires the debugger with symbols to unwind the stack.
> >>>
> >>>>
> >>>
> >>>> ~/work/Compiler>cat call.c
> >>>
> >>>> int main ()
> >>>
> >>>> {
> >>>
> >>>> return 0;
> >>>
> >>>> }
> >>>
> >>>> ~/work/Compiler>clang -Os call.c
> >>>
> >>>> ~/work/Compiler>lldb a.out
> >>>
> >>>> (lldb) target create "a.out"
> >>>
> >>>> Current executable set to 'a.out' (x86_64).
> >>>
> >>>> (lldb) dis -m -b -n main
> >>>
> >>>> a.out`main
> >>>
> >>>> a.out`main:
> >>>
> >>>> a.out[0x100000f98] <+0>: 55        pushq  %rbp
> >>>
> >>>> a.out[0x100000f99] <+1>: 48 89 e5  movq   %rsp, %rbp
> >>>
> >>>> a.out[0x100000f9c] <+4>: 31 c0     xorl   %eax, %eax
> >>>
> >>>> a.out[0x100000f9e] <+6>: 5d        popq   %rbp
> >>>
> >>>> a.out[0x100000f9f] <+7>: c3        retq
> >>>
> >>>>
> >>>
> >>>> Thanks,
> >>>
> >>>>
> >>>
> >>>> Andrew Fish
> >>>
> >>>>
> >>>
> >>>>> VS2013x86:
> >>>
> >>>>> build -a IA32 -t VS2013x86 -p OvmfPkg\OvmfPkgIa32.dsc -n 5 -m
> >>>
> >>>> MdeModulePkg\Core\Pei\PeiMain.inf -b RELEASE
> >>>
> >>>>> build -a IA32 -t VS2013x86 -p OvmfPkg\OvmfPkgIa32.dsc -n 5 -m
> >>>
> >>>> MdeModulePkg\Core\Pei\PeiMain.inf -b DEBUG -
> >>>
> >>>> DDEBUG_ON_SERIAL_PORT
> >>>
> >>>>> build -a X64 -t VS2013x86 -p OvmfPkg\OvmfPkgX64.dsc -n 5 -m
> >>>
> >>>> MdeModulePkg\Core\Dxe\DxeMain.inf  -b RELEASE
> >>>
> >>>>> build -a X64 -t VS2013x86 -p OvmfPkg\OvmfPkgX64.dsc -n 5 -m
> >>>
> >>>> MdeModulePkg\Core\Dxe\DxeMain.inf  -b DEBUG -
> >>>
> >>>> DDEBUG_ON_SERIAL_PORT
> >>>
> >>>>>
> >>>
> >>>>> CLANGLTO38:
> >>>
> >>>>> build -a IA32 -t CLANGLTO38 -p OvmfPkg/OvmfPkgIa32.dsc -n 5 -m
> >>>
> >>>> MdeModulePkg/Core/Pei/PeiMain.inf  -b RELEASE
> >>>
> >>>>> build -a IA32 -t CLANGLTO38 -p OvmfPkg/OvmfPkgIa32.dsc -n 5 -m
> >>>
> >>>> MdeModulePkg/Core/Pei/PeiMain.inf  -b DEBUG -
> >>>
> >>>> DDEBUG_ON_SERIAL_PORT
> >>>
> >>>>> build -a X64 -t CLANGLTO38 -p OvmfPkg/OvmfPkgX64.dsc -n 5 -m
> >>>
> >>>> MdeModulePkg/Core/Dxe/DxeMain.inf  -b RELEASE
> >>>
> >>>>> build -a X64 -t CLANGLTO38 -p OvmfPkg/OvmfPkgX64.dsc -n 5 -m
> >>>
> >>>> MdeModulePkg/Core/Dxe/DxeMain.inf  -b DEBUG -
> >>>
> >>>> DDEBUG_ON_SERIAL_PORT
> >>>
> >>>>>
> >>>
> >>>>>
> >>>
> >>>>>
> >>>
> >>>>> Steven Shi
> >>>
> >>>>> Intel\SSG\STO\UEFI Firmware
> >>>
> >>>>>
> >>>
> >>>>> Tel: +86 021-61166522
> >>>
> >>>>> iNet: 821-6522
> >>>
> >>>>>
> >>>
> >>>>> From: af...@apple.com<mailto:af...@apple.com>
> >> [mailto:af...@apple.com]
> >>>
> >>>>> Sent: Wednesday, May 11, 2016 2:03 AM
> >>>
> >>>>> To: Shi, Steven <steven....@intel.com<mailto:steven....@intel.com>>
> >>>
> >>>>> Cc: edk2-devel@lists.01.org<mailto:edk2-devel@lists.01.org>
> >>>
> >>>>> Subject: Re: [edk2] edk2 llvm branch
> >>>
> >>>>>
> >>>
> >>>>>
> >>>
> >>>>> On May 10, 2016, at 8:05 AM, Shi, Steven
> >>>
> >>>>
> >>
> <steven....@intel.com<mailto:steven....@intel.com<mailto:steven.shi@int
> >> el.com%3cmailto:steven....@intel.com>>> wrote:
> >>>
> >>>>>
> >>>
> >>>>> Hi Andrew,
> >>>
> >>>>> Thank you for the suggestion. I will try your suggestion and response
> >> other
> >>>
> >>>> questions in your email later. I don't have XCODE5 environment, but
> could
> >> do
> >>>
> >>>> me a favor and  let me know what current XCODE5 code size for
> >> PeiCore.efi
> >>>
> >>>> and DxeCore.efi in your side? In my side, as below data show, I see the
> >> LTO
> >>>
> >>>> can bring big code size improvement which is quite important for
> >> firmware in
> >>>
> >>>> many scenarios.
> >>>
> >>>>>
> >>>
> >>>>> I forgot to mention. LTO or not it is good to check to make sure the
> >>>
> >>>> assembly files are getting dead stripped. For example check to make
> sure
> >> you
> >>>
> >>>> are not getting all the assembly functions in the BaseLib included in
> your
> >>>
> >>>> executable.  Some of the assembly is .S and some is .nasm so you may
> see
> >>>
> >>>> different behavior depending on which assembler was used.
> >>>
> >>>>>
> >>>
> >>>>> It is also useful to start looking at the smallest PEIM/DXE drivers 1st 
> >>>>> as
> it
> >>>
> >>>> may be easier to spot what is different.
> >>>
> >>>>>
> >>>
> >>>>>
> >>>
> >>>>> Maybe it is also a good idea to enable LTO in XCODE.
> >>>
> >>>>>
> >>>
> >>>>> For Xcode you add -object_path_lto
> >>>
> >>>> $(DEST_DIR_DEBUG)/$(BASE_NAME).lto to
> *_XCODE5_*_DLINK_FLAGS.
> >>>
> >>>> This places the intermediate link code gen in the Build/ director vs. a
> temp
> >>>
> >>>> director and is important for source level debugging. To turn LTO on
> and
> >> off
> >>>
> >>>> you add -flto to *_XCODE5_*_CC_FLAGS .
> >>>
> >>>>>
> >>>
> >>>>> We ended up making LTO a configurable build option, so we control it
> in
> >>>
> >>>> the DSC file. git
> >>>
> >>>>>
> >>>
> >>>>> [BuildOptions]
> >>>
> >>>>> !if $(PEI_LTO_ENABLE)
> >>>
> >>>>> XCODE:*_*_IA32_PLATFORM_FLAGS = -flto
> >>>
> >>>>> !endif
> >>>
> >>>>>
> >>>
> >>>>> !if $(DXE_LTO_ENABLE)
> >>>
> >>>>> XCODE:*_*_X64_PLATFORM_FLAGS = -flto
> >>>
> >>>>> !endif
> >>>
> >>>>>
> >>>
> >>>>> I included the Xcode 6.3.2 Numbers:
> >>>
> >>>>>
> >>>
> >>>>>
> >>>
> >>>>>
> >>>
> >>>>>
> >>>
> >>>>> IA32 DEBUG PeiCore.efi on Ovmf build code size example:
> >>>
> >>>>> ToolChainName                      PeiCore.efi file size
> >>>
> >>>>> VS2013x86:                                         40KB
> >>>
> >>>>> CLANGLTO38:                                    42KB
> >>>
> >>>>> Xcode                                                      61K
> >>>
> >>>>>
> >>>
> >>>>>
> >>>
> >>>>> GCCLTO53:                                          44KB
> >>>
> >>>>> GCC49:                                                  55KB
> >>>
> >>>>> CLANG38:                                            60KB
> >>>
> >>>>>
> >>>
> >>>>>
> >>>
> >>>>> IA32 RELEASE PeiCore.efi on Ovmf build code size example:
> >>>
> >>>>> ToolChainName                      PeiCore.efi file size
> >>>
> >>>>> VS2013x86:                                         20KB
> >>>
> >>>>> GCCLTO53:                                          23KB
> >>>
> >>>>> CLANGLTO38:                                    24KB
> >>>
> >>>>> Xcode                            31K
> >>>
> >>>>>
> >>>
> >>>>>
> >>>
> >>>>>
> >>>
> >>>>> GCC49:                                27KB
> >>>
> >>>>> Clang38:                               29KB
> >>>
> >>>>>
> >>>
> >>>>>
> >>>
> >>>>> X64 DEBUG DxeCore.efi on Ovmf build code size example:
> >>>
> >>>>> ToolChainName                      .efi file size                  LZMA 
> >>>>> Compressed
> size
> >>>
> >>>>> VS2013x86:                                          137KB               
> >>>>>          57KB
> >>>
> >>>>> CLANGLTO38:                                    145KB                    
> >>>>>     61KB
> >>>
> >>>>> Xcode                            157K              68K
> >>>
> >>>>>
> >>>
> >>>>>
> >>>
> >>>>> GCCLTO53:                                          161KB                
> >>>>>         63KB
> >>>
> >>>>> GCC49:                                273KB                        69KB
> >>>
> >>>>> CLANG38:                                            205KB               
> >>>>>          72KB
> >>>
> >>>>>
> >>>
> >>>>>
> >>>
> >>>>>
> >>>
> >>>>> X64 RELEASE DxeCore.efi on Ovmf build code size example:
> >>>
> >>>>> ToolChainName                      .efi file size                  LZMA 
> >>>>> Compressed
> size
> >>>
> >>>>> VS2013x86:                                         95KB                 
> >>>>>          44KB
> >>>
> >>>>> GCCLTO53:                                          101KB                
> >>>>>         46KB
> >>>
> >>>>> CLANGLTO38:                                    107KB                    
> >>>>>     48KB
> >>>
> >>>>> Xcode                            104K              49K
> >>>
> >>>>>
> >>>
> >>>>>
> >>>
> >>>>> GCC49:                                184KB                        52KB
> >>>
> >>>>> CLANG38:                                            133KB               
> >>>>>          53KB
> >>>
> >>>>>
> >>>
> >>>>>
> >>>
> >>>>> Can you send my linker map files for VS2013 & CLANGLTO38 off list.
> >>>
> >>>>>
> >>>
> >>>>> Thanks,
> >>>
> >>>>>
> >>>
> >>>>> Andrew Fish
> >>>
> >>>>>
> >>>
> >>>>>
> >>>
> >>>>> Steven Shi
> >>>
> >>>>> Intel\SSG\STO\UEFI Firmware
> >>>
> >>>>>
> >>>
> >>>>> Tel: +86 021-61166522
> >>>
> >>>>> iNet: 821-6522
> >>>
> >>>>>
> >>>
> >>>>>> -----Original Message-----
> >>>
> >>>>>> From:
> >>
> af...@apple.com<mailto:af...@apple.com<mailto:af...@apple.com%3cmai
> >> lto:af...@apple.com>>
> >>>
> >>>> [mailto:af...@apple.com]
> >>>
> >>>>>> Sent: Tuesday, May 10, 2016 1:12 PM
> >>>
> >>>>>> To: Shi, Steven
> >>
> <steven....@intel.com<mailto:steven....@intel.com<mailto:steven.shi@int
> >> el.com%3cmailto:steven....@intel.com>>>
> >>>
> >>>>>> Cc: edk2-devel@lists.01.org<mailto:edk2-
> >> de...@lists.01.org<mailto:edk2-devel@lists.01.org%3cmailto:edk2-
> >> de...@lists.01.org>>
> >>>
> >>>>>> Subject: Re: [edk2] edk2 llvm branch
> >>>
> >>>>>>
> >>>
> >>>>>>
> >>>
> >>>>>
> >>>
> >>>>> _______________________________________________
> >>>
> >>>>> edk2-devel mailing list
> >>>
> >>>>> edk2-devel@lists.01.org<mailto:edk2-devel@lists.01.org>
> >>>
> >>>>> https://lists.01.org/mailman/listinfo/edk2-devel
> >>>
> >>>
> >>> _______________________________________________
> >>> edk2-devel mailing list
> >>> edk2-devel@lists.01.org
> >>> https://lists.01.org/mailman/listinfo/edk2-devel
> >
> > _______________________________________________
> > edk2-devel mailing list
> > edk2-devel@lists.01.org
> > https://lists.01.org/mailman/listinfo/edk2-devel

_______________________________________________
edk2-devel mailing list
edk2-devel@lists.01.org
https://lists.01.org/mailman/listinfo/edk2-devel

Reply via email to