[sanitizer] [msan] Fix origin store of array types
authorAdhemerval Zanella <adhemerval.zanella@linaro.org>
Mon, 11 Jan 2016 19:55:27 +0000 (19:55 +0000)
committerAdhemerval Zanella <adhemerval.zanella@linaro.org>
Mon, 11 Jan 2016 19:55:27 +0000 (19:55 +0000)
commite25b385a34be602f567ff14e1c322cb015706317
tree783e870a02e9bf03ebda2785272bbbe036650c89
parentb843a2acf7dd13bf75d36005715600046c0ce278
[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
lib/Transforms/Instrumentation/MemorySanitizer.cpp
test/Instrumentation/MemorySanitizer/origin-array.ll [new file with mode: 0644]