[PATCH] D23107: [MSAN][MIPS] Fix fork.cc test on MIPS

Evgeniy Stepanov via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Tue Dec 6 13:59:05 PST 2016


eugenis accepted this revision.
eugenis added a comment.
This revision is now accepted and ready to land.

LGTM w/ 2 minor comments



================
Comment at: lib/msan/msan.h:340
+    if (!SANITIZER_CAN_FAST_UNWIND)                                            \
+      GetStackTrace(&stack, 1, pc, bp,                                         \
+                    common_flags()->fast_unwind_on_malloc);                    \
----------------
slthakur wrote:
> eugenis wrote:
> > max(1, flags()->store_context_size)
> max(1, flags()->store_context_size) will return the value of flags()->store_context_size which is 1000 in the test case fork.cc. This will invoke the slow unwinder and cause deadlock.
Sorry, I meant min().
store_context_size = 0 should keep working.



================
Comment at: test/msan/chained_origin_limits.cc:157
+// CHECK-NON-MIPS-FRAMES-PER-STACK: Uninitialized value was stored to memory at
+// CHECK-NON-MIPS-FRAMES-PER-STACK: in fn1
 // CHECK-PER-STACK: Uninitialized value was created
----------------
slthakur wrote:
> eugenis wrote:
> > Hm, this test expects three instances of "Uninitialized value was stored to memory at" on non-mips, and only one instance on mips. Why is that?
> > 
> On architectures with short stack, due to reduced origin context, all the stacks in the chain are same because the stack trace contains only 1 frame and does not contain frames upto the functions (fn1, fn2, fn3) from where the uninitialized stores actually originate. And since origin_history_per_stack_limit is set to 1 we only get 1 instance of "Uninitialized value was stored to memory at" per stack. Therefore even though the uninitialized stores come from 3 different functions we only have one stack trace. In case of architectures having full stack, there are 3 different stacks because the uninitialized stores originate from 3 different functions in the chain and therefore we can see 1  instance (per stack) of "Uninitialized value was stored to memory at".
> 
> The full stack (for architectures with full origin context) which is different from the 2 other stacks in the chain is :
> 
> >Uninitialized value was stored to memory at
> >    #0 0xaaaef00f10 in __msan_memmove /home/slt/LLVM/llvm/projects/compiler-rt/lib/msan/msan_interceptors.cc:1480:3
> >    #1 0xaaaef9ccd4 in line_flush /home/slt/LLVM/llvm/projects/compiler-rt/test/msan/chained_origin_limits.cc:90:5
> >    #2 0xaaaef9ccd4 in buffered_write /home/slt/LLVM/llvm/projects/compiler-rt/test/msan/chained_origin_limits.cc:102
> >    #3 0xaaaef9ccd4 in fn3 /home/slt/LLVM/llvm/projects/compiler-rt/test/msan/chained_origin_limits.cc:115
> >    #4 0xaaaef9ccd4 in main /home/slt/LLVM/llvm/projects/compiler-rt/test/msan/chained_origin_limits.cc:123
> 
> Whereas the short stack (for architectures with short origin context) which is same as all other stacks in the chain is :
> 
> >Uninitialized value was stored to memory at
> >    #0 0xaab04dcf20 in __msan_memmove /home/slt/LLVM/llvm/projects/compiler-rt/lib/msan/msan_interceptors.cc:1480:3
Yeah, I've completely forgot about this feature. Please add a short comment to the test case to avoid future questions.


================
Comment at: test/msan/lit.cfg:42
+# check the first frame since store_context size is 1.
+if config.host_arch in ['mips64', 'mips64el']:
+  config.substitutions.append( ('CHECK-%unwind', ("CHECK-MIPS-FRAMES")))
----------------
slthakur wrote:
> eugenis wrote:
> > fast unwinder is also unavailable on sparc, please include that here
> Msan is not supported on sparc architecture. Do you still want me to include it ?
No, that's fine.



================
Comment at: test/msan/lit.cfg:45
+else:
+  config.substitutions.append( ('CHECK-%unwind', ("CHECK-NON-MIPS-FRAMES")))
----------------
slthakur wrote:
> eugenis wrote:
> > Instead of mips and non-mips, let's call it something neutral, like
> > %short-stack -> "SHORT-STACK" on mips and sparc, and "" on other platforms.
> > Then any affected CHECK can be given a -%short-stack suffix.
> If we use ""  in place of %short-stack for architectures which have full stack, then we will have to check the output lines for the full stack with the "CHECK" prefix . And these full stack frame lines will also be checked for architectures which have short stack because most of the tests have "--check-prefix=CHECK" for checking output lines other than stack frames.
> 
> Therefore it is important to distinguish between architectures having short stack and architectures having full stack context. So I have used
> %short-stack -> "CHECK-FULL-STACK" substitution for architectures having full stack size. Please let me know if this should be done in a different way.
agreed.


Repository:
  rL LLVM

https://reviews.llvm.org/D23107





More information about the llvm-commits mailing list