1. Jun 22, 2016
  2. Jun 21, 2016
    • Jonathan Peyton's avatar
      Addition of debugger comments and whitespace · 8c61c597
      Jonathan Peyton authored
      The removal of legacy code to support long-deprecated debugger support library
      resulted in some whitespace changes. Comments from that legacy code were made
      public as they may be useful for other debuggers.
      
      Patch by Olga Malysheva.
      
      Differential Revision: http://reviews.llvm.org/D21391
      
      llvm-svn: 273282
      8c61c597
    • Etienne Bergeron's avatar
      [StackProtector] Fix computation of GSCookieOffset and EHCookieOffset with SEH4 · f6be62f2
      Etienne Bergeron authored
      Summary:
      Fix the computation of the offsets present in the scopetable when using the
      SEH (__except_handler4).
      
      This patch added an intrinsic to track the position of the allocation on the
      stack of the EHGuard. This position is needed when producing the ScopeTable.
      
      ```
          struct _EH4_SCOPETABLE {
              DWORD GSCookieOffset;
              DWORD GSCookieXOROffset;
              DWORD EHCookieOffset;
              DWORD EHCookieXOROffset;
              _EH4_SCOPETABLE_RECORD ScopeRecord[1];
          };
      
          struct _EH4_SCOPETABLE_RECORD {
              DWORD EnclosingLevel;
              long (*FilterFunc)();
                  union {
                  void (*HandlerAddress)();
                  void (*FinallyFunc)();
              };
          };
      ```
      
      The code to generate the EHCookie is added in `X86WinEHState.cpp`.
      Which is adding these instructions when using SEH4.
      
      ```
      Lfunc_begin0:
      # BB#0:                                 # %entry
      	pushl	%ebp
      	movl	%esp, %ebp
      	pushl	%ebx
      	pushl	%edi
      	pushl	%esi
      	subl	$28, %esp
      	movl	%ebp, %eax                <<-- Loading FramePtr
      	movl	%esp, -36(%ebp)
      	movl	$-2, -16(%ebp)
      	movl	$L__ehtable$use_except_handler4_ssp, %ecx
      	xorl	___security_cookie, %ecx
      	movl	%ecx, -20(%ebp)
      	xorl	___security_cookie, %eax  <<-- XOR FramePtr and Cookie
      	movl	%eax, -40(%ebp)           <<-- Storing EHGuard
      	leal	-28(%ebp), %eax
      	movl	$__except_handler4, -24(%ebp)
      	movl	%fs:0, %ecx
      	movl	%ecx, -28(%ebp)
      	movl	%eax, %fs:0
      	movl	$0, -16(%ebp)
      	calll	_may_throw_or_crash
      LBB1_1:                                 # %cont
      	movl	-28(%ebp), %eax
      	movl	%eax, %fs:0
      	addl	$28, %esp
      	popl	%esi
      	popl	%edi
      	popl	%ebx
      	popl	%ebp
      	retl
      
      ```
      
      And the corresponding offset is computed:
      ```
      Luse_except_handler4_ssp$parent_frame_offset = -36
      	.p2align	2
      L__ehtable$use_except_handler4_ssp:
      	.long	-2                      # GSCookieOffset
      	.long	0                       # GSCookieXOROffset
      	.long	-40                     # EHCookieOffset    <<----
      	.long	0                       # EHCookieXOROffset
      	.long	-2                      # ToState
      	.long	_catchall_filt          # FilterFunction
      	.long	LBB1_2                  # ExceptionHandler
      
      ```
      
      Clang is not yet producing function using SEH4, but it's a work in progress.
      This patch is a step toward having a valid implementation of SEH4.
      Unfortunately, it is not yet fully working. The EH registration block is not
      allocated at the right offset on the stack.
      
      Reviewers: rnk, majnemer
      
      Subscribers: llvm-commits, chrisha
      
      Differential Revision: http://reviews.llvm.org/D21231
      
      llvm-svn: 273281
      f6be62f2
    • Evandro Menezes's avatar
      04abc14f