[PATCH] D70895: [asan] Remove debug locations from alloca prologue instrumentation

Johannes Altmanninger via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Mon Dec 2 04:48:30 PST 2019


johannes created this revision.
Herald added subscribers: llvm-commits, hiraditya, aprantl.
Herald added a project: LLVM.
johannes abandoned this revision.
johannes added a comment.
Herald added a subscriber: ormris.

duplicate of https://reviews.llvm.org/D70894


This fixes https://llvm.org/PR26673

> Wrong debugging information with -fsanitize=address

where asan instrumentation causes the prologue end to be computed
incorrectly: findPrologueEndLoc, looks for the first instruction
with a debug location to determine the prologue end.  Since the asan
instrumentation instructions had debug locations, that prologue end was
at some instrumentation instructions, where the stack frame is still
being initialized.

I did not yet find any reason why extra debug locations are needed for
the asan instrumentations that set up the frame, they don't have a
true source location.  In the debugger they are simply located at the
start of the function.

For certain other instrumentations like -fsanitize-coverage=trace-pc-guard
the same problem persists - for coverage it might be more work to fix,
since it looks like they rely on locatios of the tracee functions.

This partly reverts aaf4bb239487e0a3b20a8eaf94fc641235ba2c29

> [asan] Set debug location in ASan function prologue

whose motivation was to give debug location info to the coverage callback.
Its test only ensures that the call to @__sanitizer_cov_trace_pc_guard is
given the correct source location; as the debug location is still set in
ModuleSanitizerCoverage::InjectCoverageAtBlock, the test does not break.
So -fsanitize-coverage is hopefully unaffected - I don't think it should
rely on the debug locations of asan-generated allocas.

Related revision: 3c6c14d14b40adfb581940859ede1ac7d8ceae7a

> ASAN: Provide reliable debug info for local variables at -O0.

I didn't test whether this reintroduces the motivating
issue, should be OK: http://openradar.appspot.com/30433661

Below is how the X86 assembly version of the added test case changes.
It seems like a reasonable change in this case to get rid of all
those funky .loc lines and put prologue_end where user code starts.

  diff
  --- 2.master.s	2019-12-02 12:32:38.982959053 +0100
  +++ 2.patch.s	2019-12-02 12:32:41.106246674 +0100
  @@ -45,8 +45,6 @@
   	.cfi_offset %rbx, -24
   	xorl	%eax, %eax
   	movl	%eax, %ecx
  - .Ltmp2:
  - 	.loc	1 3 0 prologue_end      # 2.c:3:0
   	cmpl	$0, __asan_option_detect_stack_use_after_return
   	movl	%edi, 92(%rbx)          # 4-byte Spill
   	movq	%rsi, 80(%rbx)          # 8-byte Spill
  @@ -57,9 +55,7 @@
   	callq	__asan_stack_malloc_0
   	movq	%rax, 72(%rbx)          # 8-byte Spill
   .LBB1_2:
  - 	.loc	1 0 0 is_stmt 0         # 2.c:0:0
   	movq	72(%rbx), %rax          # 8-byte Reload
  - 	.loc	1 3 0                   # 2.c:3:0
   	cmpq	$0, %rax
   	movq	%rax, %rcx
   	movq	%rax, 64(%rbx)          # 8-byte Spill
  @@ -72,9 +68,7 @@
   	movq	%rax, %rsp
   	movq	%rax, 56(%rbx)          # 8-byte Spill
   .LBB1_4:
  - 	.loc	1 0 0                   # 2.c:0:0
   	movq	56(%rbx), %rax          # 8-byte Reload
  - 	.loc	1 3 0                   # 2.c:3:0
   	movq	%rax, 120(%rbx)
   	movq	%rax, %rcx
   	addq	$32, %rcx
  @@ -99,7 +93,6 @@
   	movb	%r8b, 31(%rbx)          # 1-byte Spill
   	je	.LBB1_7
   # %bb.5:
  - 	.loc	1 0 0                   # 2.c:0:0
   	movq	40(%rbx), %rax          # 8-byte Reload
   	andq	$7, %rax
   	addq	$3, %rax
  @@ -118,7 +111,8 @@
   	movl	%ecx, (%rax)
   	movq	80(%rbx), %rdx          # 8-byte Reload
   	movq	%rdx, 128(%rbx)
  -	.loc	1 4 3 is_stmt 1         # 2.c:4:3
  +.Ltmp2:
  +	.loc	1 4 3 prologue_end      # 2.c:4:3
   	movq	%rax, %rdi
   	callq	f
   	movq	48(%rbx), %rax          # 8-byte Reload


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D70895

Files:
  llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp
  llvm/test/Instrumentation/AddressSanitizer/debug-info-alloca.ll
  llvm/test/Instrumentation/AddressSanitizer/local_stack_base.ll

-------------- next part --------------
A non-text attachment was scrubbed...
Name: D70895.231676.patch
Type: text/x-patch
Size: 7632 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20191202/838e19bb/attachment.bin>


More information about the llvm-commits mailing list