Imported Upstream version 6.10.0.49

Former-commit-id: 1d6753294b2993e1fbf92de9366bb9544db4189b
This commit is contained in:
Xamarin Public Jenkins (auto-signing)
2020-01-16 16:38:04 +00:00
parent d94e79959b
commit 468663ddbb
48518 changed files with 2789335 additions and 61176 deletions

View File

@@ -0,0 +1,20 @@
; RUN: llc < %s -mtriple=x86_64-unknown-linux-gnu -mcpu=corei7 -mattr=+sse2 -asm-instrumentation=address -asan-instrument-assembly | FileCheck %s
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"
; CHECK-LABEL: mov_no_attr
; CHECK-NOT: callq __asan_report_load8@PLT
; CHECK-NOT: callq __asan_report_store8@PLT
define void @mov_no_attr(i64* %dst, i64* %src) {
tail call void asm sideeffect "movq ($1), %rax \0A\09movq %rax, ($0) \0A\09", "r,r,~{memory},~{rax},~{dirflag},~{fpsr},~{flags}"(i64* %dst, i64* %src)
ret void
}
; CHECK-LABEL: mov_sanitize
; CHECK: callq __asan_report_load8@PLT
; CHECK: callq __asan_report_store8@PLT
define void @mov_sanitize(i64* %dst, i64* %src) sanitize_address {
tail call void asm sideeffect "movq ($1), %rax \0A\09movq %rax, ($0) \0A\09", "r,r,~{memory},~{rax},~{dirflag},~{fpsr},~{flags}"(i64* %dst, i64* %src)
ret void
}

View File

@@ -0,0 +1,54 @@
; RUN: llc < %s -mtriple=x86_64-unknown-linux-gnu -mcpu=corei7 -mattr=+sse2 -asm-instrumentation=address -asan-instrument-assembly | FileCheck %s
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"
; CHECK-LABEL: mov8b_rbp
; CHECK: pushq %rbp
; CHECK-NOT: .cfi_adjust_cfa_offset 8
; CHECK: movq %rbp, %rbp
; CHECK: .cfi_remember_state
; CHECK: .cfi_def_cfa_register %rbp
; CHECK: leaq -128(%rsp)
; CHECK: callq __asan_report_load8@PLT
; CHECK: leaq 128(%rsp)
; CHECK: popq %rbp
; CHECK: .cfi_restore_state
; CHECK-NOT: .cfi_adjust_cfa_offset -8
; CHECK: retq
define void @mov8b_rbp(i64* %dst, i64* %src) #0 {
entry:
tail call void asm sideeffect "movq ($0), %rax \0A\09movq %rax, ($1) \0A\09", "r,r,~{rax},~{memory},~{dirflag},~{fpsr},~{flags}"(i64* %src, i64* %dst)
ret void
}
; CHECK-LABEL: mov8b_rsp
; CHECK: pushq %rbp
; CHECK: .cfi_adjust_cfa_offset 8
; CHECK: movq %rsp, %rbp
; CHECK: .cfi_remember_state
; CHECK: .cfi_def_cfa_register %rbp
; CHECK: leaq -128(%rsp)
; CHECK: callq __asan_report_load8@PLT
; CHECK: leaq 128(%rsp)
; CHECK: popq %rbp
; CHECK: .cfi_restore_state
; CHECK: .cfi_adjust_cfa_offset -8
; CHECK: retq
define void @mov8b_rsp(i64* %dst, i64* %src) #1 {
entry:
tail call void asm sideeffect "movq ($0), %rax \0A\09movq %rax, ($1) \0A\09", "r,r,~{rax},~{memory},~{dirflag},~{fpsr},~{flags}"(i64* %src, i64* %dst)
ret void
}
; CHECK-LABEL: mov8b_rsp_no_cfi
; CHECK-NOT: .cfi{{[a-z_]+}}
define void @mov8b_rsp_no_cfi(i64* %dst, i64* %src) #2 {
entry:
tail call void asm sideeffect "movq ($0), %rax \0A\09movq %rax, ($1) \0A\09", "r,r,~{rax},~{memory},~{dirflag},~{fpsr},~{flags}"(i64* %src, i64* %dst)
ret void
}
attributes #0 = { nounwind sanitize_address uwtable "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" }
attributes #1 = { nounwind sanitize_address uwtable "no-frame-pointer-elim"="false" }
attributes #2 = { nounwind sanitize_address "no-frame-pointer-elim"="false" }

View File

@@ -0,0 +1,52 @@
# The test verifies that correct DWARF directives are emitted when
# assembly files are instrumented.
# RUN: llvm-mc %s -triple=i386-unknown-linux-gnu -asm-instrumentation=address -asan-instrument-assembly | FileCheck %s
# CHECK-LABEL: load4b_cfa_rbp
# CHECK: pushl %ebx
# CHECK-NOT: .cfi_adjust_cfa_offset 8
# CHECK: movl %ebp, %ebx
# CHECK: .cfi_remember_state
# CHECK: .cfi_def_cfa_register %ebx
# CHECK: popl %ebx
# CHECK: .cfi_restore_state
# CHECK-NOT: .cfi_adjust_cfa_offset -8
# CHECK: retl
.text
.globl load4b_cfa_rbp
.type load4b_cfa_rbp,@function
swap_cfa_rbp: # @swap_cfa_rbp
.cfi_startproc
pushl %ebp
.cfi_def_cfa_offset 8
.cfi_offset %ebp, -8
movl %esp, %ebp
.cfi_def_cfa_register %ebp
movl 8(%ebp), %eax
popl %ebp
retl
.cfi_endproc
# CHECK-LABEL: load4b_cfa_rsp
# CHECK: pushl %ebx
# CHECK: .cfi_adjust_cfa_offset 4
# CHECK: movl %esp, %ebx
# CHECK: .cfi_remember_state
# CHECK: .cfi_def_cfa_register %ebx
# CHECK: popl %ebx
# CHECK: .cfi_restore_state
# CHECK: retl
.globl load4b_cfa_rsp
.type load4b_cfa_rsp,@function
swap_cfa_rsp: # @swap_cfa_rsp
.cfi_startproc
pushl %ebp
.cfi_offset %ebp, 0
movl %esp, %ebp
movl 8(%ebp), %eax
popl %ebp
retl
.cfi_endproc

View File

@@ -0,0 +1,53 @@
; RUN: opt < %s -asan -S -o %t.ll
; RUN: FileCheck %s < %t.ll
; RUN: llc < %t.ll | FileCheck %s --check-prefix=ASM
target datalayout = "e-m:x-p:32:32-i64:64-f80:32-n8:16:32-S32"
target triple = "i386-pc-windows-msvc"
define void @MyCPUID(i32 %fxn, i32* %out) sanitize_address {
%fxn.ptr = alloca i32
%a.ptr = alloca i32
%b.ptr = alloca i32
%c.ptr = alloca i32
%d.ptr = alloca i32
store i32 %fxn, i32* %fxn.ptr
call void asm sideeffect inteldialect "xchg ebx, esi\0A\09mov eax, dword ptr $4\0A\09cpuid\0A\09mov dword ptr $0, eax\0A\09mov dword ptr $1, ebx\0A\09mov dword ptr $2, ecx\0A\09mov dword ptr $3, edx\0A\09xchg ebx, esi", "=*m,=*m,=*m,=*m,*m,~{eax},~{ebx},~{ecx},~{edx},~{esi},~{dirflag},~{fpsr},~{flags}"(i32* %a.ptr, i32* %b.ptr, i32* %c.ptr, i32* %d.ptr, i32* %fxn.ptr)
%a = load i32, i32* %a.ptr
%a.out = getelementptr inbounds i32, i32* %out, i32 0
store i32 %a, i32* %a.out
%b = load i32, i32* %b.ptr
%b.out = getelementptr inbounds i32, i32* %out, i32 1
store i32 %b, i32* %b.out
%c = load i32, i32* %c.ptr
%c.out = getelementptr inbounds i32, i32* %out, i32 2
store i32 %c, i32* %c.out
%d = load i32, i32* %d.ptr
%d.out = getelementptr inbounds i32, i32* %out, i32 3
store i32 %d, i32* %d.out
ret void
}
; We used to introduce stack mallocs for UAR detection, but that makes LLVM run
; out of registers on 32-bit platforms. Therefore, we don't do stack malloc on
; such functions.
; CHECK-LABEL: define void @MyCPUID(i32 %fxn, i32* %out)
; CHECK: %MyAlloca = alloca [96 x i8], align 32
; CHECK-NOT: call {{.*}} @__asan_stack_malloc
; The code generator should recognize that all operands are just stack memory.
; This is important with MS inline asm where operand lists are implicit and all
; local variables can be referenced freely.
; ASM-LABEL: MyCPUID:
; ASM: cpuid
; ASM-NEXT: movl %eax, {{[0-9]+}}(%esp)
; ASM-NEXT: movl %ebx, {{[0-9]+}}(%esp)
; ASM-NEXT: movl %ecx, {{[0-9]+}}(%esp)
; ASM-NEXT: movl %edx, {{[0-9]+}}(%esp)

View File

@@ -0,0 +1,56 @@
; RUN: opt < %s -asan -S -o %t.ll
; RUN: FileCheck %s < %t.ll
; Don't do stack malloc on functions containing inline assembly on 64-bit
; platforms. It makes LLVM run out of registers.
; CHECK-LABEL: define void @TestAbsenceOfStackMalloc(i8* %S, i32 %pS, i8* %D, i32 %pD, i32 %h)
; CHECK: %MyAlloca
; CHECK-NOT: call {{.*}} @__asan_stack_malloc
target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-apple-macosx10.10.0"
define void @TestAbsenceOfStackMalloc(i8* %S, i32 %pS, i8* %D, i32 %pD, i32 %h) #0 {
entry:
%S.addr = alloca i8*, align 8
%pS.addr = alloca i32, align 4
%D.addr = alloca i8*, align 8
%pD.addr = alloca i32, align 4
%h.addr = alloca i32, align 4
%sr = alloca i32, align 4
%pDiffD = alloca i32, align 4
%pDiffS = alloca i32, align 4
%flagSA = alloca i8, align 1
%flagDA = alloca i8, align 1
store i8* %S, i8** %S.addr, align 8
store i32 %pS, i32* %pS.addr, align 4
store i8* %D, i8** %D.addr, align 8
store i32 %pD, i32* %pD.addr, align 4
store i32 %h, i32* %h.addr, align 4
store i32 4, i32* %sr, align 4
%0 = load i32, i32* %pD.addr, align 4
%sub = sub i32 %0, 5
store i32 %sub, i32* %pDiffD, align 4
%1 = load i32, i32* %pS.addr, align 4
%shl = shl i32 %1, 1
%sub1 = sub i32 %shl, 5
store i32 %sub1, i32* %pDiffS, align 4
%2 = load i32, i32* %pS.addr, align 4
%and = and i32 %2, 15
%cmp = icmp eq i32 %and, 0
%conv = zext i1 %cmp to i32
%conv2 = trunc i32 %conv to i8
store i8 %conv2, i8* %flagSA, align 1
%3 = load i32, i32* %pD.addr, align 4
%and3 = and i32 %3, 15
%cmp4 = icmp eq i32 %and3, 0
%conv5 = zext i1 %cmp4 to i32
%conv6 = trunc i32 %conv5 to i8
store i8 %conv6, i8* %flagDA, align 1
call void asm sideeffect "mov\09\09\09$0,\09\09\09\09\09\09\09\09\09\09%rsi\0Amov\09\09\09$2,\09\09\09\09\09\09\09\09\09\09%rcx\0Amov\09\09\09$1,\09\09\09\09\09\09\09\09\09\09%rdi\0Amov\09\09\09$8,\09\09\09\09\09\09\09\09\09\09%rax\0A", "*m,*m,*m,*m,*m,*m,*m,*m,*m,~{rsi},~{rdi},~{rax},~{rcx},~{rdx},~{memory},~{dirflag},~{fpsr},~{flags}"(i8** %S.addr, i8** %D.addr, i32* %pS.addr, i32* %pDiffS, i32* %pDiffD, i32* %sr, i8* %flagSA, i8* %flagDA, i32* %h.addr) #1
ret void
}
attributes #0 = { nounwind sanitize_address }
attributes #1 = { nounwind }

View File

@@ -0,0 +1,152 @@
; RUN: llc < %s -mtriple=x86_64-unknown-linux-gnu -mcpu=corei7 -mattr=+sse2 -asm-instrumentation=address -asan-instrument-assembly | FileCheck %s
target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"
; CHECK-LABEL: mov1b
; CHECK: leaq -128(%rsp), %rsp
; CHECK-NEXT: pushq %rax
; CHECK-NEXT: pushq %rdi
; CHECK-NEXT: pushq %rcx
; CHECK-NEXT: pushfq
; CHECK-NEXT: leaq {{.*}}, %rdi
; CHECK-NEXT: movq %rdi, %rax
; CHECK-NEXT: shrq $3, %rax
; CHECK-NEXT: movb 2147450880(%rax), %al
; CHECK-NEXT: testb %al, %al
; CHECK-NEXT: je [[A:.*]]
; CHECK-NEXT: movl %edi, %ecx
; CHECK-NEXT: andl $7, %ecx
; CHECK-NEXT: movsbl %al, %eax
; CHECK-NEXT: cmpl %eax, %ecx
; CHECK-NEXT: jl {{.*}}
; CHECK-NEXT: cld
; CHECK-NEXT: emms
; CHECK-NEXT: andq $-16, %rsp
; CHECK-NEXT: callq __asan_report_load1@PLT
; CHECK-NEXT: [[A]]:
; CHECK-NEXT: popfq
; CHECK-NEXT: popq %rcx
; CHECK-NEXT: popq %rdi
; CHECK-NEXT: popq %rax
; CHECK-NEXT: leaq 128(%rsp), %rsp
; CHECK: leaq -128(%rsp), %rsp
; CHECK: callq __asan_report_store1@PLT
; CHECK: leaq 128(%rsp), %rsp
; CHECK: movb {{.*}}, {{.*}}
define void @mov1b(i8* %dst, i8* %src) #0 {
entry:
tail call void asm sideeffect "movb ($1), %al \0A\09movb %al, ($0) \0A\09", "r,r,~{memory},~{rax},~{dirflag},~{fpsr},~{flags}"(i8* %dst, i8* %src) #1, !srcloc !0
ret void
}
; CHECK-LABEL: mov2b
; CHECK: leaq -128(%rsp), %rsp
; CHECK: leal 1(%ecx), %ecx
; CHECK: callq __asan_report_load2@PLT
; CHECK: leaq 128(%rsp), %rsp
; CHECK: leaq -128(%rsp), %rsp
; CHECK: leal 1(%ecx), %ecx
; CHECK: callq __asan_report_store2@PLT
; CHECK: leaq 128(%rsp), %rsp
; CHECK: movw {{.*}}, {{.*}}
define void @mov2b(i16* %dst, i16* %src) #0 {
entry:
tail call void asm sideeffect "movw ($1), %ax \0A\09movw %ax, ($0) \0A\09", "r,r,~{memory},~{rax},~{dirflag},~{fpsr},~{flags}"(i16* %dst, i16* %src) #1, !srcloc !1
ret void
}
; CHECK-LABEL: mov4b
; CHECK: leaq -128(%rsp), %rsp
; CHECK: addl $3, %ecx
; CHECK: callq __asan_report_load4@PLT
; CHECK: leaq 128(%rsp), %rsp
; CHECK: leaq -128(%rsp), %rsp
; CHECK: addl $3, %ecx
; CHECK: callq __asan_report_store4@PLT
; CHECK: leaq 128(%rsp), %rsp
; CHECK: movl {{.*}}, {{.*}}
define void @mov4b(i32* %dst, i32* %src) #0 {
entry:
tail call void asm sideeffect "movl ($1), %eax \0A\09movl %eax, ($0) \0A\09", "r,r,~{memory},~{rax},~{dirflag},~{fpsr},~{flags}"(i32* %dst, i32* %src) #1, !srcloc !2
ret void
}
; CHECK-LABEL: mov8b
; CHECK: leaq -128(%rsp), %rsp
; CHECK-NEXT: pushq %rax
; CHECK-NEXT: pushq %rdi
; CHECK-NEXT: pushfq
; CHECK-NEXT: leaq {{.*}}, %rdi
; CHECK-NEXT: movq %rdi, %rax
; CHECK-NEXT: shrq $3, %rax
; CHECK-NEXT: cmpb $0, 2147450880(%rax)
; CHECK-NEXT: je [[A:.*]]
; CHECK-NEXT: cld
; CHECK-NEXT: emms
; CHECK-NEXT: andq $-16, %rsp
; CHECK-NEXT: callq __asan_report_load8@PLT
; CHECK-NEXT: [[A]]:
; CHECK-NEXT: popfq
; CHECK-NEXT: popq %rdi
; CHECK-NEXT: popq %rax
; CHECK-NEXT: leaq 128(%rsp), %rsp
; CHECK: leaq -128(%rsp), %rsp
; CHECK-NEXT: pushq %rax
; CHECK-NEXT: pushq %rdi
; CHECK-NEXT: pushfq
; CHECK-NEXT: leaq {{.*}}, %rdi
; CHECK-NEXT: movq %rdi, %rax
; CHECK-NEXT: shrq $3, %rax
; CHECK-NEXT: cmpb $0, 2147450880(%rax)
; CHECK-NEXT: je [[A:.*]]
; CHECK-NEXT: cld
; CHECK-NEXT: emms
; CHECK-NEXT: andq $-16, %rsp
; CHECK-NEXT: callq __asan_report_store8@PLT
; CHECK-NEXT: [[A]]:
; CHECK-NEXT: popfq
; CHECK-NEXT: popq %rdi
; CHECK-NEXT: popq %rax
; CHECK-NEXT: leaq 128(%rsp), %rsp
; CHECK: movq {{.*}}, {{.*}}
define void @mov8b(i64* %dst, i64* %src) #0 {
entry:
tail call void asm sideeffect "movq ($1), %rax \0A\09movq %rax, ($0) \0A\09", "r,r,~{memory},~{rax},~{dirflag},~{fpsr},~{flags}"(i64* %dst, i64* %src) #1, !srcloc !3
ret void
}
; CHECK-LABEL: mov16b
; CHECK: leaq -128(%rsp), %rsp
; CHECK: cmpw $0, 2147450880(%rax)
; CHECK: callq __asan_report_load16@PLT
; CHECK: leaq 128(%rsp), %rsp
; CHECK: leaq -128(%rsp), %rsp
; CHECK: cmpw $0, 2147450880(%rax)
; CHECK: callq __asan_report_store16@PLT
; CHECK: leaq 128(%rsp), %rsp
; CHECK: movaps {{.*}}, {{.*}}
define void @mov16b(<2 x i64>* %dst, <2 x i64>* %src) #0 {
entry:
tail call void asm sideeffect "movaps ($1), %xmm0 \0A\09movaps %xmm0, ($0) \0A\09", "r,r,~{memory},~{xmm0},~{dirflag},~{fpsr},~{flags}"(<2 x i64>* %dst, <2 x i64>* %src) #1, !srcloc !4
ret void
}
attributes #0 = { nounwind uwtable sanitize_address "less-precise-fpmad"="false" "no-frame-pointer-elim"="false" "no-frame-pointer-elim-non-leaf"="false" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "unsafe-fp-math"="false" "use-soft-float"="false" }
attributes #1 = { nounwind }
!0 = !{i32 98, i32 122, i32 160}
!1 = !{i32 305, i32 329, i32 367}
!2 = !{i32 512, i32 537, i32 576}
!3 = !{i32 721, i32 746, i32 785}
!4 = !{i32 929, i32 957, i32 999}

View File

@@ -0,0 +1,64 @@
# RUN: llvm-mc %s -triple=x86_64-unknown-linux-gnu -mcpu=corei7 -mattr=+sse2 -asm-instrumentation=address -asan-instrument-assembly | FileCheck %s
.text
.globl mov1b
.align 16, 0x90
.type mov1b,@function
# CHECK-LABEL: mov1b:
#
# CHECK: leaq -128(%rsp), %rsp
# CHECK: callq __asan_report_load1@PLT
# CHECK: leaq 128(%rsp), %rsp
#
# CHECK: movb (%rsi), %al
#
# CHECK: leaq -128(%rsp), %rsp
# CHECK: callq __asan_report_store1@PLT
# CHECK: leaq 128(%rsp), %rsp
#
# CHECK: movb %al, (%rdi)
mov1b: # @mov1b
.cfi_startproc
# %bb.0:
#APP
movb (%rsi), %al
movb %al, (%rdi)
#NO_APP
retq
.Ltmp0:
.size mov1b, .Ltmp0-mov1b
.cfi_endproc
.globl mov16b
.align 16, 0x90
.type mov16b,@function
# CHECK-LABEL: mov16b:
#
# CHECK: leaq -128(%rsp), %rsp
# CHECK: callq __asan_report_load16@PLT
# CHECK: leaq 128(%rsp), %rsp
#
# CHECK: movaps (%rsi), %xmm0
#
# CHECK: leaq -128(%rsp), %rsp
# CHECK: callq __asan_report_store16@PLT
# CHECK: leaq 128(%rsp), %rsp
#
# CHECK: movaps %xmm0, (%rdi)
mov16b: # @mov16b
.cfi_startproc
# %bb.0:
#APP
movaps (%rsi), %xmm0
movaps %xmm0, (%rdi)
#NO_APP
retq
.Ltmp1:
.size mov16b, .Ltmp1-mov16b
.cfi_endproc
.ident "clang version 3.5 "
.section ".note.GNU-stack","",@progbits

View File

@@ -0,0 +1,26 @@
# RUN: llvm-mc %s -triple=x86_64-unknown-linux-gnu -mcpu=corei7 -mattr=+sse2 | FileCheck %s
.text
.globl mov1b
.align 16, 0x90
.type mov1b,@function
# CHECK-LABEL: mov1b
# CHECK: movb (%rsi), %al
# CHECK: movb %al, (%rdi)
# CHECK-NOT: callq __asan_report_load1@PLT
# CHECK-NOT: callq __asan_report_store1@PLT
mov1b: # @mov1b
.cfi_startproc
# %bb.0:
#APP
movb (%rsi), %al
movb %al, (%rdi)
#NO_APP
retq
.Ltmp0:
.size mov1b, .Ltmp0-mov1b
.cfi_endproc
.ident "clang version 3.5 "
.section ".note.GNU-stack","",@progbits

View File

@@ -0,0 +1,85 @@
; RUN: llc < %s -mtriple=x86_64-unknown-linux-gnu -mcpu=corei7 -mattr=+sse2 -asm-instrumentation=address -asan-instrument-assembly | FileCheck %s
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"
; CHECK-LABEL: rep_movs_1b
; CHECK: pushfq
; CHECK-NEXT: testq %rcx, %rcx
; CHECK-NEXT: je [[B:.*]]
; CHECK: leaq -128(%rsp), %rsp
; CHECK-NEXT: pushq %rax
; CHECK-NEXT: pushq %rdx
; CHECK-NEXT: pushq %rbx
; CHECK-NEXT: pushfq
; CHECK: leaq (%rsi), %rdx
; CHECK: movq %rdx, %rdi
; CHECK-NEXT: callq __asan_report_load1@PLT
; CHECK: leaq -1(%rsi,%rcx), %rdx
; CHECK: movq %rdx, %rdi
; CHECK-NEXT: callq __asan_report_load1@PLT
; CHECK: leaq (%rdi), %rdx
; CHECK: movq %rdx, %rdi
; CHECK-NEXT: callq __asan_report_store1@PLT
; CHECK: leaq -1(%rdi,%rcx), %rdx
; CHECK: movq %rdx, %rdi
; CHECK-NEXT: callq __asan_report_store1@PLT
; CHECK: popfq
; CHECK-NEXT: popq %rbx
; CHECK-NEXT: popq %rdx
; CHECK-NEXT: popq %rax
; CHECK-NEXT: leaq 128(%rsp), %rsp
; CHECK: [[B]]:
; CHECK-NEXT: popfq
; CHECK: rep movsb (%rsi), %es:(%rdi)
; Function Attrs: nounwind sanitize_address uwtable
define void @rep_movs_1b(i8* %dst, i8* %src, i64 %n) #0 {
entry:
tail call void asm sideeffect "rep movsb \0A\09", "{si},{di},{cx},~{memory},~{dirflag},~{fpsr},~{flags}"(i8* %src, i8* %dst, i64 %n) #1
ret void
}
; CHECK-LABEL: rep_movs_8b
; CHECK: pushfq
; CHECK-NEXT: testq %rcx, %rcx
; CHECK-NEXT: je [[Q:.*]]
; CHECK: leaq (%rsi), %rdx
; CHECK: movq %rdx, %rdi
; CHECK-NEXT: callq __asan_report_load8@PLT
; CHECK: leaq -1(%rsi,%rcx,8), %rdx
; CHECK: movq %rdx, %rdi
; CHECK-NEXT: callq __asan_report_load8@PLT
; CHECK: leaq (%rdi), %rdx
; CHECK: movq %rdx, %rdi
; CHECK-NEXT: callq __asan_report_store8@PLT
; CHECK: leaq -1(%rdi,%rcx,8), %rdx
; CHECK: movq %rdx, %rdi
; CHECK-NEXT: callq __asan_report_store8@PLT
; CHECK: [[Q]]:
; CHECK-NEXT: popfq
; CHECK: rep movsq (%rsi), %es:(%rdi)
; Function Attrs: nounwind sanitize_address uwtable
define void @rep_movs_8b(i64* %dst, i64* %src, i64 %n) #0 {
entry:
tail call void asm sideeffect "rep movsq \0A\09", "{si},{di},{cx},~{memory},~{dirflag},~{fpsr},~{flags}"(i64* %src, i64* %dst, i64 %n) #1
ret void
}
attributes #0 = { nounwind sanitize_address uwtable "less-precise-fpmad"="false" "no-frame-pointer-elim"="false" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" }
attributes #1 = { nounwind }

View File

@@ -0,0 +1,45 @@
# The test verifies that memory references through %rsp are correctly
# adjusted after instrumentation.
# RUN: llvm-mc %s -triple=x86_64-unknown-linux-gnu -asm-instrumentation=address -asan-instrument-assembly | FileCheck %s
# CHECK-LABEL: rsp_access
# CHECK: leaq -128(%rsp), %rsp
# CHECK: pushq %rax
# CHECK: pushq %rdi
# CHECK: pushfq
# CHECK: leaq 160(%rsp), %rdi
# CHECK: callq __asan_report_load8@PLT
# CHECK: popfq
# CHECK: popq %rdi
# CHECK: popq %rax
# CHECK: leaq 128(%rsp), %rsp
# CHECK: movq 8(%rsp), %rax
# CHECK: retq
.text
.globl rsp_access
.type rsp_access,@function
rsp_access:
movq 8(%rsp), %rax
retq
# CHECK-LABEL: rsp_32bit_access
# CHECK: leaq -128(%rsp), %rsp
# CHECK: pushq %rax
# CHECK: pushq %rdi
# CHECK: pushfq
# CHECK: leaq 2147483647(%rsp), %rdi
# CHECK: leaq 145(%rdi), %rdi
# CHECK: callq __asan_report_load8@PLT
# CHECK: popfq
# CHECK: popq %rdi
# CHECK: popq %rax
# CHECK: leaq 128(%rsp), %rsp
# CHECK: movq 2147483640(%rsp), %rax
# CHECK: retq
.globl rsp_32bit_access
.type rsp_32bit_access,@function
rsp_32bit_access:
movq 2147483640(%rsp), %rax
retq

View File

@@ -0,0 +1,59 @@
# RUN: llvm-mc %s -x86-asm-syntax=intel -triple=x86_64-unknown-linux-gnu -asm-instrumentation=address -asan-instrument-assembly | FileCheck %s
.text
.globl swap
.align 16, 0x90
.type swap,@function
# CHECK-LABEL: swap:
#
# CHECK: leaq -128(%rsp), %rsp
# CHECK: callq __asan_report_load8@PLT
# CHECK: leaq 128(%rsp), %rsp
#
# CHECK: movq (%rcx), %rax
#
# CHECK: leaq -128(%rsp), %rsp
# CHECK: callq __asan_report_load8@PLT
# CHECK: leaq 128(%rsp), %rsp
#
# CHECK: movq (%rdx), %rbx
#
# CHECK: leaq -128(%rsp), %rsp
# CHECK: callq __asan_report_store8@PLT
# CHECK: leaq 128(%rsp), %rsp
#
# CHECK: movq %rbx, (%rcx)
#
# CHECK: leaq -128(%rsp), %rsp
# CHECK: callq __asan_report_store8@PLT
# CHECK: leaq 128(%rsp), %rsp
#
# CHECK: movq %rax, (%rdx)
swap: # @swap
.cfi_startproc
# %bb.0:
push rbx
.Ltmp0:
.cfi_def_cfa_offset 16
.Ltmp1:
.cfi_offset rbx, -16
mov rcx, rdi
mov rdx, rsi
#APP
mov rax, qword ptr [rcx]
mov rbx, qword ptr [rdx]
mov qword ptr [rcx], rbx
mov qword ptr [rdx], rax
#NO_APP
pop rbx
ret
.Ltmp2:
.size swap, .Ltmp2-swap
.cfi_endproc
.ident "clang version 3.5.0 "
.section ".note.GNU-stack","",@progbits

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,3 @@
if not 'X86' in config.root.targets:
config.unsupported = True