1*d21b3d34SFangrui Song // MSAN re-execs on unlimited stacks. We use that to verify ReExec() uses the
2*d21b3d34SFangrui Song // right path.
3*d21b3d34SFangrui Song // RUN: %clangxx_msan -O0 %s -o %t && ulimit -s unlimited && %run %t | FileCheck %s
4*d21b3d34SFangrui Song 
5*d21b3d34SFangrui Song #include <stdio.h>
6*d21b3d34SFangrui Song 
7*d21b3d34SFangrui Song #if !defined(__GLIBC_PREREQ)
8*d21b3d34SFangrui Song #define __GLIBC_PREREQ(a, b) 0
9*d21b3d34SFangrui Song #endif
10*d21b3d34SFangrui Song 
11*d21b3d34SFangrui Song #if __GLIBC_PREREQ(2, 16)
12*d21b3d34SFangrui Song #include <sys/auxv.h>
13*d21b3d34SFangrui Song #endif
14*d21b3d34SFangrui Song 
main()15*d21b3d34SFangrui Song int main() {
16*d21b3d34SFangrui Song #if __GLIBC_PREREQ(2, 16)
17*d21b3d34SFangrui Song   // Make sure AT_EXECFN didn't get overwritten by re-exec.
18*d21b3d34SFangrui Song   puts(reinterpret_cast<const char *>(getauxval(AT_EXECFN)));
19*d21b3d34SFangrui Song #else
20*d21b3d34SFangrui Song   puts("No getauxval");
21*d21b3d34SFangrui Song #endif
22*d21b3d34SFangrui Song   // CHECK-NOT: /proc/self/exe
23*d21b3d34SFangrui Song }
24