[dfsan] Support passing non-i16 shadow values in TLS mode
authorJianzhou Zhao <jianzhouzh@google.com>
Wed, 2 Dec 2020 01:14:31 +0000 (01:14 +0000)
committerJianzhou Zhao <jianzhouzh@google.com>
Fri, 4 Dec 2020 02:45:07 +0000 (02:45 +0000)
commit80e326a8c4cfae770c10d7bb3d0ae291011bd91f
treed7aa557ef3366e0b8a50ea2a94142f9d83d22f96
parentc98a7ab1b1d647492554872e395b2ae5763fd23e
[dfsan] Support passing non-i16 shadow values in TLS mode

This is a child diff of D92261.

It extended TLS arg/ret to work with aggregate types.

For a function
  t foo(t1 a1, t2 a2, ... tn an)
Its arguments shadow are saved in TLS args like
  a1_s, a2_s, ..., an_s
TLS ret simply includes r_s. By calculating the type size of each shadow
value, we can get their offset.

This is similar to what MSan does. See __msan_retval_tls and __msan_param_tls
from llvm/lib/Transforms/Instrumentation/MemorySanitizer.cpp.

Note that this change does not add test cases for overflowed TLS
arg/ret because this is hard to test w/o supporting aggregate shdow
types. We will be adding them after supporting that.

Reviewed-by: morehouse
Differential Revision: https://reviews.llvm.org/D92440
compiler-rt/lib/dfsan/dfsan.cpp
llvm/lib/Transforms/Instrumentation/DataFlowSanitizer.cpp
llvm/test/Instrumentation/DataFlowSanitizer/arith.ll
llvm/test/Instrumentation/DataFlowSanitizer/call.ll
llvm/test/Instrumentation/DataFlowSanitizer/callback.ll
llvm/test/Instrumentation/DataFlowSanitizer/fast16labels.ll
llvm/test/Instrumentation/DataFlowSanitizer/load.ll
llvm/test/Instrumentation/DataFlowSanitizer/phi.ll
llvm/test/Instrumentation/DataFlowSanitizer/select.ll