12d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// RUN: %clangxx_msan -fsanitize-memory-track-origins=2 -m64 -O3 %s -o %t && \
22d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// RUN:     not %run %t >%t.out 2>&1
32d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// RUN: FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-STACK < %t.out
42d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
52d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// RUN: %clangxx_msan -fsanitize-memory-track-origins=2 -DHEAP=1 -m64 -O3 %s -o %t && \
62d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// RUN:     not %run %t >%t.out 2>&1
72d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// RUN: FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-HEAP < %t.out
82d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
95d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines
105d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines// RUN: %clangxx_msan -mllvm -msan-instrumentation-with-call-threshold=0 -fsanitize-memory-track-origins=2 -m64 -O3 %s -o %t && \
115d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines// RUN:     not %run %t >%t.out 2>&1
125d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines// RUN: FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-STACK < %t.out
135d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines
145d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines// RUN: %clangxx_msan -mllvm -msan-instrumentation-with-call-threshold=0 -fsanitize-memory-track-origins=2 -DHEAP=1 -m64 -O3 %s -o %t && \
155d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines// RUN:     not %run %t >%t.out 2>&1
165d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines// RUN: FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-HEAP < %t.out
175d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines
185d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines
192d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#include <stdio.h>
202d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
212d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesvolatile int x, y;
222d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
232d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines__attribute__((noinline))
242d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesvoid fn_g(int a) {
252d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  x = a;
262d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines}
272d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
282d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines__attribute__((noinline))
292d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesvoid fn_f(int a) {
302d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  fn_g(a);
312d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines}
322d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
332d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines__attribute__((noinline))
342d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesvoid fn_h() {
352d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  y = x;
362d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines}
372d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
382d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesint main(int argc, char *argv[]) {
392d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#ifdef HEAP
402d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  int * volatile zz = new int;
412d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  int z = *zz;
422d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#else
432d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  int volatile z;
442d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#endif
452d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  fn_f(z);
462d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  fn_h();
472d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  return y;
482d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines}
492d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
502d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// CHECK: WARNING: MemorySanitizer: use-of-uninitialized-value
515d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines// CHECK: {{#0 .* in main.*chained_origin.cc:47}}
522d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
532d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// CHECK: Uninitialized value was stored to memory at
545d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines// CHECK: {{#0 .* in fn_h.*chained_origin.cc:35}}
555d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines// CHECK: {{#1 .* in main.*chained_origin.cc:46}}
562d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
572d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// CHECK: Uninitialized value was stored to memory at
585d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines// CHECK: {{#0 .* in fn_g.*chained_origin.cc:25}}
595d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines// CHECK: {{#1 .* in fn_f.*chained_origin.cc:30}}
605d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines// CHECK: {{#2 .* in main.*chained_origin.cc:45}}
612d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
622d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// CHECK-STACK: Uninitialized value was created by an allocation of 'z' in the stack frame of function 'main'
635d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines// CHECK-STACK: {{#0 .* in main.*chained_origin.cc:38}}
642d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
652d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// CHECK-HEAP: Uninitialized value was created by a heap allocation
665d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines// CHECK-HEAP: {{#1 .* in main.*chained_origin.cc:40}}
67