1 //===- not.cpp - The 'not' testing tool -----------------------------------===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 10 #include "llvm/Support/Path.h" 11 #include "llvm/Support/Program.h" 12 #include "llvm/Support/raw_ostream.h" 13 using namespace llvm; 14 15 int main(int argc, const char **argv) { 16 bool ExpectCrash = false; 17 18 ++argv; 19 --argc; 20 21 if (argc > 0 && StringRef(argv[0]) == "--crash") { 22 ++argv; 23 --argc; 24 ExpectCrash = true; 25 } 26 27 if (argc == 0) 28 return 1; 29 30 std::string Program = sys::FindProgramByName(argv[0]); 31 32 std::string ErrMsg; 33 int Result = sys::ExecuteAndWait(Program, argv, nullptr, nullptr, 0, 0, 34 &ErrMsg); 35 #ifdef _WIN32 36 // Handle abort() in msvcrt -- It has exit code as 3. abort(), aka 37 // unreachable, should be recognized as a crash. However, some binaries use 38 // exit code 3 on non-crash failure paths, so only do this if we expect a 39 // crash. 40 if (ExpectCrash && Result == 3) 41 Result = -3; 42 #endif 43 if (Result < 0) { 44 errs() << "Error: " << ErrMsg << "\n"; 45 if (ExpectCrash) 46 return 0; 47 return 1; 48 } 49 50 if (ExpectCrash) 51 return 1; 52 53 return Result == 0; 54 } 55