mirror of
https://github.com/RPCS3/llvm.git
synced 2024-12-14 23:48:56 +00:00
c4bb052ecc
Generally, remove use of fork/exec from bugpoint in favor of the portable sys::Program::ExecuteAndWait method. This change requires two new options to bugpoint to tell it that it is running in "child" mode. In this mode, it reads its input and runs the passes. The result code signals to the parent instance of bugpoint what happened (success, fail, crash). This change should make bugpoint usable on Win32 systems. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@24961 91177308-0d34-0410-b5e6-96231b3b80d8
79 lines
2.9 KiB
C++
79 lines
2.9 KiB
C++
//===- bugpoint.cpp - The LLVM Bugpoint utility ---------------------------===//
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file was developed by the LLVM research group and is distributed under
|
|
// the University of Illinois Open Source License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
// This program is an automated compiler debugger tool. It is used to narrow
|
|
// down miscompilations and crash problems to a specific pass in the compiler,
|
|
// and the specific Module or Function input that is causing the problem.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "BugDriver.h"
|
|
#include "llvm/Analysis/LinkAllAnalyses.h"
|
|
#include "llvm/Transforms/LinkAllPasses.h"
|
|
#include "llvm/Support/PassNameParser.h"
|
|
#include "llvm/Support/ToolRunner.h"
|
|
#include "llvm/Support/CommandLine.h"
|
|
#include "llvm/Support/PluginLoader.h"
|
|
#include "llvm/System/Process.h"
|
|
#include "llvm/System/Signals.h"
|
|
using namespace llvm;
|
|
|
|
// AsChild - Specifies that this invocation of bugpoint is being generated
|
|
// from a parent process. It is not intended to be used by users so the
|
|
// option is hidden.
|
|
static cl::opt<bool>
|
|
AsChild("as-child", cl::desc("Run bugpoint as child process"),
|
|
cl::ReallyHidden);
|
|
|
|
static cl::list<std::string>
|
|
InputFilenames(cl::Positional, cl::OneOrMore,
|
|
cl::desc("<input llvm ll/bc files>"));
|
|
|
|
// The AnalysesList is automatically populated with registered Passes by the
|
|
// PassNameParser.
|
|
//
|
|
static cl::list<const PassInfo*, bool, PassNameParser>
|
|
PassList(cl::desc("Passes available:"), cl::ZeroOrMore);
|
|
|
|
/// BugpointIsInterrupted - Set to true when the user presses ctrl-c.
|
|
bool llvm::BugpointIsInterrupted = false;
|
|
|
|
static void BugpointInterruptFunction() {
|
|
BugpointIsInterrupted = true;
|
|
}
|
|
|
|
int main(int argc, char **argv) {
|
|
cl::ParseCommandLineOptions(argc, argv,
|
|
" LLVM automatic testcase reducer. See\nhttp://"
|
|
"llvm.cs.uiuc.edu/docs/CommandGuide/bugpoint.html"
|
|
" for more information.\n");
|
|
sys::PrintStackTraceOnErrorSignal();
|
|
sys::SetInterruptFunction(BugpointInterruptFunction);
|
|
|
|
BugDriver D(argv[0],AsChild);
|
|
if (D.addSources(InputFilenames)) return 1;
|
|
D.addPasses(PassList.begin(), PassList.end());
|
|
|
|
// Bugpoint has the ability of generating a plethora of core files, so to
|
|
// avoid filling up the disk, we prevent it
|
|
sys::Process::PreventCoreFiles();
|
|
|
|
try {
|
|
return D.run();
|
|
} catch (ToolExecutionError &TEE) {
|
|
std::cerr << "Tool execution error: " << TEE.what() << '\n';
|
|
} catch (const std::string& msg) {
|
|
std::cerr << argv[0] << ": " << msg << "\n";
|
|
} catch (...) {
|
|
std::cerr << "Whoops, an exception leaked out of bugpoint. "
|
|
<< "This is a bug in bugpoint!\n";
|
|
}
|
|
return 1;
|
|
}
|