Skip to content
  • Gordon Henriksen's avatar
    With this patch, the LowerGC transformation becomes the · 6047b6e1
    Gordon Henriksen authored
    ShadowStackCollector, which additionally has reduced overhead with
    no sacrifice in portability.
    
    Considering a function @fun with 8 loop-local roots,
    ShadowStackCollector introduces the following overhead
    (x86):
    
    ; shadowstack prologue
            movl    L_llvm_gc_root_chain$non_lazy_ptr, %eax
            movl    (%eax), %ecx
            movl    $___gc_fun, 20(%esp)
            movl    $0, 24(%esp)
            movl    $0, 28(%esp)
            movl    $0, 32(%esp)
            movl    $0, 36(%esp)
            movl    $0, 40(%esp)
            movl    $0, 44(%esp)
            movl    $0, 48(%esp)
            movl    $0, 52(%esp)
            movl    %ecx, 16(%esp)
            leal    16(%esp), %ecx
            movl    %ecx, (%eax)
    
    ; shadowstack loop overhead
            (none)
    
    ; shadowstack epilogue
            movl    48(%esp), %edx
            movl    %edx, (%ecx)
    
    ; shadowstack metadata
            .align  3
    ___gc_fun:                              # __gc_fun
            .long   8
            .space  4
    
    In comparison to LowerGC:
    
    ; lowergc prologue
            movl    L_llvm_gc_root_chain$non_lazy_ptr, %eax
            movl    (%eax), %ecx
            movl    %ecx, 48(%esp)
            movl    $8, 52(%esp)
            movl    $0, 60(%esp)
            movl    $0, 56(%esp)
            movl    $0, 68(%esp)
            movl    $0, 64(%esp)
            movl    $0, 76(%esp)
            movl    $0, 72(%esp)
            movl    $0, 84(%esp)
            movl    $0, 80(%esp)
            movl    $0, 92(%esp)
            movl    $0, 88(%esp)
            movl    $0, 100(%esp)
            movl    $0, 96(%esp)
            movl    $0, 108(%esp)
            movl    $0, 104(%esp)
            movl    $0, 116(%esp)
            movl    $0, 112(%esp)
    
    ; lowergc loop overhead
            leal    44(%esp), %eax
            movl    %eax, 56(%esp)
            leal    40(%esp), %eax
            movl    %eax, 64(%esp)
            leal    36(%esp), %eax
            movl    %eax, 72(%esp)
            leal    32(%esp), %eax
            movl    %eax, 80(%esp)
            leal    28(%esp), %eax
            movl    %eax, 88(%esp)
            leal    24(%esp), %eax
            movl    %eax, 96(%esp)
            leal    20(%esp), %eax
            movl    %eax, 104(%esp)
            leal    16(%esp), %eax
            movl    %eax, 112(%esp)
    
    ; lowergc epilogue
            movl    48(%esp), %edx
            movl    %edx, (%ecx)
    
    ; lowergc metadata
            (none)
    
    llvm-svn: 45670
    6047b6e1
Loading