llvm.org GIT mirror llvm / e25b385
[sanitizer] [msan] Fix origin store of array types This patch fixes the memory sanitizer origin store instrumentation for array types. This can be triggered by cases where frontend lowers function return to array type instead of aggregation. For instance, the C code: -- struct mypair { int64_t x; int y; }; mypair my_make_pair(int64_t x, int y) { mypair p; p.x = x; p.y = y; return p; } int foo (int p) { mypair z = my_make_pair(p, 0); return z.y + z.x; } -- It will be lowered with target set to aarch64-linux and -O0 to: -- [...] define i32 @_Z3fooi(i32 %p) #0 { [...] %call = call [2 x i64] @_Z12my_make_pairxi(i64 %conv, i32 0) %1 = bitcast %struct.mypair* %z to [2 x i64]* store [2 x i64] %call, [2 x i64]* %1, align 8 [...] -- The origin store will emit a 'icmp' to test each store value again the TLS origin array. However since 'icmp' does not support ArrayType the memory instrumentation phase will bail out with an error. This patch change it by using the same strategy used for struct type on array. It fixes the 'test/msan/insertvalue_origin.cc' for aarch64 (the -O0 case). git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@257375 91177308-0d34-0410-b5e6-96231b3b80d8 Adhemerval Zanella 4 years ago
2 changed file(s) with 24 addition(s) and 1 deletion(s). Raw diff Collapse all Expand all
691691 const DataLayout &DL = F.getParent()->getDataLayout();
692692 unsigned OriginAlignment = std::max(kMinOriginAlignment, Alignment);
693693 unsigned StoreSize = DL.getTypeStoreSize(Shadow->getType());
694 if (isa(Shadow->getType())) {
694 if (Shadow->getType()->isAggregateType()) {
695695 paintOrigin(IRB, updateOrigin(Origin, IRB),
696696 getOriginPtr(Addr, IRB, Alignment), StoreSize,
697697 OriginAlignment);
0 ; RUN: opt < %s -msan -msan-check-access-address=0 -msan-track-origins=2 -S | FileCheck %s
1
2 target datalayout = "e-m:e-i64:64-i128:128-n32:64-S128"
3 target triple = "aarch64-unknown-linux-gnu"
4
5 ; Check origin handling of array types.
6
7 define void @foo([2 x i64] %v, [2 x i64]* %p) sanitize_memory {
8 entry:
9 store [2 x i64] %v, [2 x i64]* %p, align 8
10 ret void
11 }
12
13 ; CHECK-LABEL: @foo
14 ; CHECK: [[PARAM:%[01-9a-z]+]] = load {{.*}} @__msan_param_tls
15 ; CHECK: [[ORIGIN:%[01-9a-z]+]] = load {{.*}} @__msan_param_origin_tls
16
17 ; CHECK: [[TMP1:%[01-9a-z]+]] = ptrtoint
18 ; CHECK: [[TMP2:%[01-9a-z]+]] = xor i64 [[TMP1]]
19 ; CHECK: [[TMP3:%[01-9a-z]+]] = inttoptr i64 [[TMP2]] to [2 x i64]*
20 ; CHECK: store [2 x i64] [[PARAM]], [2 x i64]* [[TMP3]]
21
22 ; CHECK: {{.*}} call i32 @__msan_chain_origin(i32 {{.*}}[[ORIGIN]])