Home | History | Annotate | Download | only in not
      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