[PATCH] Segmented stack support ARM iOS

Valerii Hiora valerii.hiora at gmail.com
Mon May 5 06:41:20 PDT 2014


Ping
http://reviews.llvm.org/D3473


On Wed, Apr 23, 2014 at 9:32 PM, Valerii Hiora <valerii.hiora at gmail.com>wrote:

> Patch enables support of segmented stacks on armv7 iOS.
>
> Although it seems to work fine, it relies on a couple of assumptions made
> about iOS internals which could be wrong so input from Apple engineers is
> really important.
>
> To be precise, it uses Apple-specific implementation of
> _pthread_{get,set}specific_direct taken from
> http://www.opensource.apple.com/source/Libc/Libc-825.40.1/pthreads/pthread_machdep.hand uses static key #149.  While it is not in Apple-reserved range (0..119
> as of libc 825.40.1), it still unclear if it is smaller than total count of
> reserved slots.
>
> http://reviews.llvm.org/D3473
>
> Files:
>   lib/Target/ARM/ARMFrameLowering.cpp
>
> Index: lib/Target/ARM/ARMFrameLowering.cpp
> ===================================================================
> --- lib/Target/ARM/ARMFrameLowering.cpp
> +++ lib/Target/ARM/ARMFrameLowering.cpp
> @@ -1671,13 +1671,13 @@
>    bool Thumb = ST->isThumb();
>
>    // Sadly, this currently doesn't support varargs, platforms other than
> -  // android/linux. Note that thumb1/thumb2 are support for android/linux.
> -  if (MF.getFunction()->isVarArg())
> -    report_fatal_error("Segmented stacks do not support vararg
> functions.");
> -  if (!ST->isTargetAndroid() && !ST->isTargetLinux())
> -    report_fatal_error("Segmented stacks not supported on this
> platform.");
> -
> -  MachineBasicBlock &prologueMBB = MF.front();
> +  // android/linux. Note that thumb1/thumb2 are support for android/linux.
> +  if (MF.getFunction()->isVarArg())
> +    report_fatal_error("Segmented stacks do not support vararg
> functions.");
> +  if (!ST->isTargetAndroid() && !ST->isTargetLinux() &&
> !ST->isTargetIOS())
> +    report_fatal_error("Segmented stacks not supported on this
> platform.");
> +
> +  MachineBasicBlock &prologueMBB = MF.front();
>    MachineFrameInfo *MFI = MF.getFrameInfo();
>    MachineModuleInfo &MMI = MF.getMMI();
>    MCContext &Context = MMI.getContext();
> @@ -1795,16 +1795,45 @@
>                       .addImm(15)
>                       .addImm(0)
>                       .addImm(13)
> -                     .addImm(0)
> -                     .addImm(3));
> -
> -    // Use the last tls slot on android and a private field of the TCP on
> linux.
> -    assert(ST->isTargetAndroid() || ST->isTargetLinux());
> -    unsigned TlsOffset = ST->isTargetAndroid() ? 63 : 1;
> -
> -    // Get the stack limit from the right offset
> -    // ldr SR0, [sr0, #4 * TlsOffset]
> -    AddDefaultPred(BuildMI(GetMBB, DL, TII.get(ARM::LDRi12), ScratchReg0)
> +                     .addImm(0)
> +                     .addImm(3));
> +
> +    unsigned TlsOffset = 0;
> +    if (ST->isTargetAndroid() || ST->isTargetLinux()) {
> +      // Use the last tls slot on android and a private field of the TCP
> on linux.
> +      TlsOffset = ST->isTargetAndroid() ? 63 : 1;
> +    } else if (ST->isTargetIOS()) {
> +      // Idea for iOS was taken from
> +      //
> http://www.opensource.apple.com/source/Libc/Libc-825.40.1/pthreads/pthread_machdep.h
> +      //
> +      // In short: _pthread_{get,set}_specific_direct allows extremely
> fast
> +      // access, exactly what is required for segmented stack
> +      // There is a pool of reserved slots for Apple internal use (0..119)
> +      // First dynamic allocated pthread key starts with 257 (on iOS7)
> +      // So using slot 149 should be pretty safe ASSUMING space is
> reserved
> +      // for every key < first dynamic key
> +      // But it's just assumption...
> +      //
> +      // There is also an opportunity to steal keys reserved for Garbage
> Collection
> +      // ranges 80..89 and 110..119, especially considering the fact
> Garbage Collection
> +      // never supposed to work on iOS. But as everybody knows it - there
> is a chance
> +      // that those slots will be re-used, like it happened with key 95
> (moved from
> +      // JavaScriptCore to CoreText)
> +      //
> +      // It will be great if slot for segmented stack will be officially
> reserved
> +      // by Apple to avoid any clashes or misuse by other compilers.
> +      // Good example is the key for SJ/LJ exceptions
> +
> +      // Bic SR0, SR0, #3
> +      AddDefaultCC(AddDefaultPred(BuildMI(GetMBB, DL,
> TII.get(ARM::BICri), ScratchReg0)
> +                                    .addReg(ScratchReg0, RegState::Kill)
> +                                    .addImm(3)));
> +      TlsOffset = 149;
> +    }
> +
> +    // Get the stack limit from the right offset
> +    // ldr SR0, [sr0, #4 * TlsOffset]
> +    AddDefaultPred(BuildMI(GetMBB, DL, TII.get(ARM::LDRi12), ScratchReg0)
>                        .addReg(ScratchReg0).addImm(4 * TlsOffset));
>    }
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20140505/92948fbf/attachment.html>


More information about the llvm-commits mailing list