diff options
author | Evgeniy Stepanov <eugeni.stepanov@gmail.com> | 2014-03-13 13:17:11 +0000 |
---|---|---|
committer | Evgeniy Stepanov <eugeni.stepanov@gmail.com> | 2014-03-13 13:17:11 +0000 |
commit | 2da418712cd0b93517221e26c3a1487b16bff0e2 (patch) | |
tree | e9ce46be0e5de632a9d466bbefea8432aebbcc86 /test/Instrumentation | |
parent | b9aefe6d09ed9f99982316055d39152f53c01f02 (diff) | |
download | llvm-2da418712cd0b93517221e26c3a1487b16bff0e2.tar.gz llvm-2da418712cd0b93517221e26c3a1487b16bff0e2.tar.bz2 llvm-2da418712cd0b93517221e26c3a1487b16bff0e2.tar.xz |
[msan] Fix handling of byval arguments in VarArg calls.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@203794 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'test/Instrumentation')
-rw-r--r-- | test/Instrumentation/MemorySanitizer/msan_basic.ll | 42 |
1 files changed, 42 insertions, 0 deletions
diff --git a/test/Instrumentation/MemorySanitizer/msan_basic.ll b/test/Instrumentation/MemorySanitizer/msan_basic.ll index ec756161ef..69e5c18465 100644 --- a/test/Instrumentation/MemorySanitizer/msan_basic.ll +++ b/test/Instrumentation/MemorySanitizer/msan_basic.ll @@ -765,3 +765,45 @@ entry: ; Second element app value ; CHECK-ORIGINS: insertvalue { i64, i32 } {{.*}}, i32 {{.*}}, 1 ; CHECK-ORIGINS: ret { i64, i32 } + + +; Test shadow propagation for aggregates passed through ellipsis. + +%struct.StructByVal = type { i32, i32, i32, i32 } + +declare void @VAArgStructFn(i32 %guard, ...) + +define void @VAArgStruct(%struct.StructByVal* nocapture %s) sanitize_memory { +entry: + %agg.tmp2 = alloca %struct.StructByVal, align 8 + %0 = bitcast %struct.StructByVal* %s to i8* + %agg.tmp.sroa.0.0..sroa_cast = bitcast %struct.StructByVal* %s to i64* + %agg.tmp.sroa.0.0.copyload = load i64* %agg.tmp.sroa.0.0..sroa_cast, align 4 + %agg.tmp.sroa.2.0..sroa_idx = getelementptr inbounds %struct.StructByVal* %s, i64 0, i32 2 + %agg.tmp.sroa.2.0..sroa_cast = bitcast i32* %agg.tmp.sroa.2.0..sroa_idx to i64* + %agg.tmp.sroa.2.0.copyload = load i64* %agg.tmp.sroa.2.0..sroa_cast, align 4 + %1 = bitcast %struct.StructByVal* %agg.tmp2 to i8* + call void @llvm.memcpy.p0i8.p0i8.i64(i8* %1, i8* %0, i64 16, i32 4, i1 false) + call void (i32, ...)* @VAArgStructFn(i32 undef, i64 %agg.tmp.sroa.0.0.copyload, i64 %agg.tmp.sroa.2.0.copyload, i64 %agg.tmp.sroa.0.0.copyload, i64 %agg.tmp.sroa.2.0.copyload, %struct.StructByVal* byval align 8 %agg.tmp2) + ret void +} + +; "undef" and the first 2 structs go to general purpose registers; +; the third struct goes to the overflow area byval + +; CHECK: @VAArgStruct +; undef +; CHECK: store i32 -1, i32* {{.*}}@__msan_va_arg_tls {{.*}}, align 8 +; first struct through general purpose registers +; CHECK: store i64 {{.*}}, i64* {{.*}}@__msan_va_arg_tls{{.*}}, i64 8){{.*}}, align 8 +; CHECK: store i64 {{.*}}, i64* {{.*}}@__msan_va_arg_tls{{.*}}, i64 16){{.*}}, align 8 +; second struct through general purpose registers +; CHECK: store i64 {{.*}}, i64* {{.*}}@__msan_va_arg_tls{{.*}}, i64 24){{.*}}, align 8 +; CHECK: store i64 {{.*}}, i64* {{.*}}@__msan_va_arg_tls{{.*}}, i64 32){{.*}}, align 8 +; third struct through the overflow area byval +; CHECK: ptrtoint %struct.StructByVal* {{.*}} to i64 +; CHECK: bitcast { i32, i32, i32, i32 }* {{.*}}@__msan_va_arg_tls {{.*}}, i64 176 +; CHECK: call void @llvm.memcpy.p0i8.p0i8.i64 +; CHECK: store i64 16, i64* @__msan_va_arg_overflow_size_tls +; CHECK: call void (i32, ...)* @VAArgStructFn +; CHECK: ret void |