[PATCH] D15607: [sanitizer] [msan] Fix origin store of array types

Adhemerval Zanella via llvm-commits llvm-commits at lists.llvm.org
Thu Dec 17 06:42:00 PST 2015


zatrazz created this revision.
zatrazz added reviewers: pcc, rengolin, samsonov, eugenis.
zatrazz added a subscriber: llvm-commits.
Herald added a subscriber: aemerson.

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 extracting and applying the 'icmp' operation on
each array element.

It fixes the 'test/msan/insertvalue_origin.cc' for aarch64 (the -O0 case).

http://reviews.llvm.org/D15607

Files:
  lib/Transforms/Instrumentation/MemorySanitizer.cpp
  test/Instrumentation/MemorySanitizer/origin-array.ll

-------------- next part --------------
A non-text attachment was scrubbed...
Name: D15607.43130.patch
Type: text/x-patch
Size: 5599 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20151217/ebd0909b/attachment.bin>


More information about the llvm-commits mailing list