mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-06-28 06:24:57 +00:00
nothing opt uses can throw, remove the try block and -fexceptions when
building opt. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@84816 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@ -1,4 +1,3 @@
|
|||||||
set(LLVM_REQUIRES_EH 1)
|
|
||||||
set(LLVM_LINK_COMPONENTS bitreader asmparser bitwriter instrumentation scalaropts ipo)
|
set(LLVM_LINK_COMPONENTS bitreader asmparser bitwriter instrumentation scalaropts ipo)
|
||||||
|
|
||||||
add_llvm_tool(opt
|
add_llvm_tool(opt
|
||||||
|
@ -8,7 +8,6 @@
|
|||||||
##===----------------------------------------------------------------------===##
|
##===----------------------------------------------------------------------===##
|
||||||
LEVEL = ../..
|
LEVEL = ../..
|
||||||
TOOLNAME = opt
|
TOOLNAME = opt
|
||||||
REQUIRES_EH := 1
|
|
||||||
|
|
||||||
LINK_COMPONENTS := bitreader bitwriter asmparser instrumentation scalaropts ipo
|
LINK_COMPONENTS := bitreader bitwriter asmparser instrumentation scalaropts ipo
|
||||||
|
|
||||||
|
@ -346,198 +346,187 @@ void AddStandardLinkPasses(PassManager &PM) {
|
|||||||
int main(int argc, char **argv) {
|
int main(int argc, char **argv) {
|
||||||
llvm_shutdown_obj X; // Call llvm_shutdown() on exit.
|
llvm_shutdown_obj X; // Call llvm_shutdown() on exit.
|
||||||
LLVMContext &Context = getGlobalContext();
|
LLVMContext &Context = getGlobalContext();
|
||||||
try {
|
|
||||||
cl::ParseCommandLineOptions(argc, argv,
|
cl::ParseCommandLineOptions(argc, argv,
|
||||||
"llvm .bc -> .bc modular optimizer and analysis printer\n");
|
"llvm .bc -> .bc modular optimizer and analysis printer\n");
|
||||||
sys::PrintStackTraceOnErrorSignal();
|
sys::PrintStackTraceOnErrorSignal();
|
||||||
|
|
||||||
// Allocate a full target machine description only if necessary.
|
// Allocate a full target machine description only if necessary.
|
||||||
// FIXME: The choice of target should be controllable on the command line.
|
// FIXME: The choice of target should be controllable on the command line.
|
||||||
std::auto_ptr<TargetMachine> target;
|
std::auto_ptr<TargetMachine> target;
|
||||||
|
|
||||||
SMDiagnostic Err;
|
SMDiagnostic Err;
|
||||||
|
|
||||||
// Load the input module...
|
// Load the input module...
|
||||||
std::auto_ptr<Module> M;
|
std::auto_ptr<Module> M;
|
||||||
M.reset(ParseIRFile(InputFilename, Err, Context));
|
M.reset(ParseIRFile(InputFilename, Err, Context));
|
||||||
|
|
||||||
if (M.get() == 0) {
|
if (M.get() == 0) {
|
||||||
Err.Print(argv[0], errs());
|
Err.Print(argv[0], errs());
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Figure out what stream we are supposed to write to...
|
||||||
|
// FIXME: outs() is not binary!
|
||||||
|
raw_ostream *Out = &outs(); // Default to printing to stdout...
|
||||||
|
if (OutputFilename != "-") {
|
||||||
|
// Make sure that the Output file gets unlinked from the disk if we get a
|
||||||
|
// SIGINT
|
||||||
|
sys::RemoveFileOnSignal(sys::Path(OutputFilename));
|
||||||
|
|
||||||
|
std::string ErrorInfo;
|
||||||
|
Out = new raw_fd_ostream(OutputFilename.c_str(), ErrorInfo,
|
||||||
|
raw_fd_ostream::F_Binary);
|
||||||
|
if (!ErrorInfo.empty()) {
|
||||||
|
errs() << ErrorInfo << '\n';
|
||||||
|
delete Out;
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Figure out what stream we are supposed to write to...
|
// If the output is set to be emitted to standard out, and standard out is a
|
||||||
// FIXME: outs() is not binary!
|
// console, print out a warning message and refuse to do it. We don't
|
||||||
raw_ostream *Out = &outs(); // Default to printing to stdout...
|
// impress anyone by spewing tons of binary goo to a terminal.
|
||||||
if (OutputFilename != "-") {
|
if (!Force && !NoOutput && !OutputAssembly)
|
||||||
// Make sure that the Output file gets unlinked from the disk if we get a
|
if (CheckBitcodeOutputToConsole(*Out, !Quiet))
|
||||||
// SIGINT
|
NoOutput = true;
|
||||||
sys::RemoveFileOnSignal(sys::Path(OutputFilename));
|
|
||||||
|
|
||||||
std::string ErrorInfo;
|
// Create a PassManager to hold and optimize the collection of passes we are
|
||||||
Out = new raw_fd_ostream(OutputFilename.c_str(), ErrorInfo,
|
// about to build...
|
||||||
raw_fd_ostream::F_Binary);
|
//
|
||||||
if (!ErrorInfo.empty()) {
|
PassManager Passes;
|
||||||
errs() << ErrorInfo << '\n';
|
|
||||||
delete Out;
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// If the output is set to be emitted to standard out, and standard out is a
|
// Add an appropriate TargetData instance for this module...
|
||||||
// console, print out a warning message and refuse to do it. We don't
|
TargetData *TD = 0;
|
||||||
// impress anyone by spewing tons of binary goo to a terminal.
|
const std::string &ModuleDataLayout = M.get()->getDataLayout();
|
||||||
if (!Force && !NoOutput && !OutputAssembly)
|
if (!ModuleDataLayout.empty())
|
||||||
if (CheckBitcodeOutputToConsole(*Out, !Quiet))
|
TD = new TargetData(ModuleDataLayout);
|
||||||
NoOutput = true;
|
else if (!NoDefaultDataLayout)
|
||||||
|
TD = new TargetData(DefaultDataLayout);
|
||||||
|
|
||||||
// Create a PassManager to hold and optimize the collection of passes we are
|
if (TD)
|
||||||
// about to build...
|
Passes.add(TD);
|
||||||
//
|
|
||||||
PassManager Passes;
|
|
||||||
|
|
||||||
// Add an appropriate TargetData instance for this module...
|
|
||||||
TargetData *TD = 0;
|
|
||||||
const std::string &ModuleDataLayout = M.get()->getDataLayout();
|
|
||||||
if (!ModuleDataLayout.empty())
|
|
||||||
TD = new TargetData(ModuleDataLayout);
|
|
||||||
else if (!NoDefaultDataLayout)
|
|
||||||
TD = new TargetData(DefaultDataLayout);
|
|
||||||
|
|
||||||
|
FunctionPassManager *FPasses = NULL;
|
||||||
|
if (OptLevelO1 || OptLevelO2 || OptLevelO3) {
|
||||||
|
FPasses = new FunctionPassManager(new ExistingModuleProvider(M.get()));
|
||||||
if (TD)
|
if (TD)
|
||||||
Passes.add(TD);
|
FPasses->add(new TargetData(*TD));
|
||||||
|
}
|
||||||
|
|
||||||
FunctionPassManager *FPasses = NULL;
|
// If the -strip-debug command line option was specified, add it. If
|
||||||
if (OptLevelO1 || OptLevelO2 || OptLevelO3) {
|
// -std-compile-opts was also specified, it will handle StripDebug.
|
||||||
FPasses = new FunctionPassManager(new ExistingModuleProvider(M.get()));
|
if (StripDebug && !StandardCompileOpts)
|
||||||
if (TD)
|
addPass(Passes, createStripSymbolsPass(true));
|
||||||
FPasses->add(new TargetData(*TD));
|
|
||||||
}
|
|
||||||
|
|
||||||
// If the -strip-debug command line option was specified, add it. If
|
// Create a new optimization pass for each one specified on the command line
|
||||||
// -std-compile-opts was also specified, it will handle StripDebug.
|
for (unsigned i = 0; i < PassList.size(); ++i) {
|
||||||
if (StripDebug && !StandardCompileOpts)
|
// Check to see if -std-compile-opts was specified before this option. If
|
||||||
addPass(Passes, createStripSymbolsPass(true));
|
// so, handle it.
|
||||||
|
if (StandardCompileOpts &&
|
||||||
// Create a new optimization pass for each one specified on the command line
|
StandardCompileOpts.getPosition() < PassList.getPosition(i)) {
|
||||||
for (unsigned i = 0; i < PassList.size(); ++i) {
|
|
||||||
// Check to see if -std-compile-opts was specified before this option. If
|
|
||||||
// so, handle it.
|
|
||||||
if (StandardCompileOpts &&
|
|
||||||
StandardCompileOpts.getPosition() < PassList.getPosition(i)) {
|
|
||||||
AddStandardCompilePasses(Passes);
|
|
||||||
StandardCompileOpts = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (StandardLinkOpts &&
|
|
||||||
StandardLinkOpts.getPosition() < PassList.getPosition(i)) {
|
|
||||||
AddStandardLinkPasses(Passes);
|
|
||||||
StandardLinkOpts = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (OptLevelO1 && OptLevelO1.getPosition() < PassList.getPosition(i)) {
|
|
||||||
AddOptimizationPasses(Passes, *FPasses, 1);
|
|
||||||
OptLevelO1 = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (OptLevelO2 && OptLevelO2.getPosition() < PassList.getPosition(i)) {
|
|
||||||
AddOptimizationPasses(Passes, *FPasses, 2);
|
|
||||||
OptLevelO2 = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (OptLevelO3 && OptLevelO3.getPosition() < PassList.getPosition(i)) {
|
|
||||||
AddOptimizationPasses(Passes, *FPasses, 3);
|
|
||||||
OptLevelO3 = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
const PassInfo *PassInf = PassList[i];
|
|
||||||
Pass *P = 0;
|
|
||||||
if (PassInf->getNormalCtor())
|
|
||||||
P = PassInf->getNormalCtor()();
|
|
||||||
else
|
|
||||||
errs() << argv[0] << ": cannot create pass: "
|
|
||||||
<< PassInf->getPassName() << "\n";
|
|
||||||
if (P) {
|
|
||||||
bool isBBPass = dynamic_cast<BasicBlockPass*>(P) != 0;
|
|
||||||
bool isLPass = !isBBPass && dynamic_cast<LoopPass*>(P) != 0;
|
|
||||||
bool isFPass = !isLPass && dynamic_cast<FunctionPass*>(P) != 0;
|
|
||||||
bool isCGSCCPass = !isFPass && dynamic_cast<CallGraphSCCPass*>(P) != 0;
|
|
||||||
|
|
||||||
addPass(Passes, P);
|
|
||||||
|
|
||||||
if (AnalyzeOnly) {
|
|
||||||
if (isBBPass)
|
|
||||||
Passes.add(new BasicBlockPassPrinter(PassInf));
|
|
||||||
else if (isLPass)
|
|
||||||
Passes.add(new LoopPassPrinter(PassInf));
|
|
||||||
else if (isFPass)
|
|
||||||
Passes.add(new FunctionPassPrinter(PassInf));
|
|
||||||
else if (isCGSCCPass)
|
|
||||||
Passes.add(new CallGraphSCCPassPrinter(PassInf));
|
|
||||||
else
|
|
||||||
Passes.add(new ModulePassPrinter(PassInf));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (PrintEachXForm)
|
|
||||||
Passes.add(createPrintModulePass(&errs()));
|
|
||||||
}
|
|
||||||
|
|
||||||
// If -std-compile-opts was specified at the end of the pass list, add them.
|
|
||||||
if (StandardCompileOpts) {
|
|
||||||
AddStandardCompilePasses(Passes);
|
AddStandardCompilePasses(Passes);
|
||||||
StandardCompileOpts = false;
|
StandardCompileOpts = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (StandardLinkOpts) {
|
if (StandardLinkOpts &&
|
||||||
|
StandardLinkOpts.getPosition() < PassList.getPosition(i)) {
|
||||||
AddStandardLinkPasses(Passes);
|
AddStandardLinkPasses(Passes);
|
||||||
StandardLinkOpts = false;
|
StandardLinkOpts = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (OptLevelO1) {
|
if (OptLevelO1 && OptLevelO1.getPosition() < PassList.getPosition(i)) {
|
||||||
AddOptimizationPasses(Passes, *FPasses, 1);
|
AddOptimizationPasses(Passes, *FPasses, 1);
|
||||||
|
OptLevelO1 = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (OptLevelO2) {
|
if (OptLevelO2 && OptLevelO2.getPosition() < PassList.getPosition(i)) {
|
||||||
AddOptimizationPasses(Passes, *FPasses, 2);
|
AddOptimizationPasses(Passes, *FPasses, 2);
|
||||||
|
OptLevelO2 = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (OptLevelO3) {
|
if (OptLevelO3 && OptLevelO3.getPosition() < PassList.getPosition(i)) {
|
||||||
AddOptimizationPasses(Passes, *FPasses, 3);
|
AddOptimizationPasses(Passes, *FPasses, 3);
|
||||||
|
OptLevelO3 = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (OptLevelO1 || OptLevelO2 || OptLevelO3) {
|
const PassInfo *PassInf = PassList[i];
|
||||||
FPasses->doInitialization();
|
Pass *P = 0;
|
||||||
for (Module::iterator I = M.get()->begin(), E = M.get()->end();
|
if (PassInf->getNormalCtor())
|
||||||
I != E; ++I)
|
P = PassInf->getNormalCtor()();
|
||||||
FPasses->run(*I);
|
else
|
||||||
|
errs() << argv[0] << ": cannot create pass: "
|
||||||
|
<< PassInf->getPassName() << "\n";
|
||||||
|
if (P) {
|
||||||
|
bool isBBPass = dynamic_cast<BasicBlockPass*>(P) != 0;
|
||||||
|
bool isLPass = !isBBPass && dynamic_cast<LoopPass*>(P) != 0;
|
||||||
|
bool isFPass = !isLPass && dynamic_cast<FunctionPass*>(P) != 0;
|
||||||
|
bool isCGSCCPass = !isFPass && dynamic_cast<CallGraphSCCPass*>(P) != 0;
|
||||||
|
|
||||||
|
addPass(Passes, P);
|
||||||
|
|
||||||
|
if (AnalyzeOnly) {
|
||||||
|
if (isBBPass)
|
||||||
|
Passes.add(new BasicBlockPassPrinter(PassInf));
|
||||||
|
else if (isLPass)
|
||||||
|
Passes.add(new LoopPassPrinter(PassInf));
|
||||||
|
else if (isFPass)
|
||||||
|
Passes.add(new FunctionPassPrinter(PassInf));
|
||||||
|
else if (isCGSCCPass)
|
||||||
|
Passes.add(new CallGraphSCCPassPrinter(PassInf));
|
||||||
|
else
|
||||||
|
Passes.add(new ModulePassPrinter(PassInf));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check that the module is well formed on completion of optimization
|
if (PrintEachXForm)
|
||||||
if (!NoVerify && !VerifyEach)
|
Passes.add(createPrintModulePass(&errs()));
|
||||||
Passes.add(createVerifierPass());
|
|
||||||
|
|
||||||
// Write bitcode or assembly out to disk or outs() as the last step...
|
|
||||||
if (!NoOutput && !AnalyzeOnly) {
|
|
||||||
if (OutputAssembly)
|
|
||||||
Passes.add(createPrintModulePass(Out));
|
|
||||||
else
|
|
||||||
Passes.add(createBitcodeWriterPass(*Out));
|
|
||||||
}
|
|
||||||
|
|
||||||
// Now that we have all of the passes ready, run them.
|
|
||||||
Passes.run(*M.get());
|
|
||||||
|
|
||||||
// Delete the raw_fd_ostream.
|
|
||||||
if (Out != &outs())
|
|
||||||
delete Out;
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
} catch (const std::string& msg) {
|
|
||||||
errs() << argv[0] << ": " << msg << "\n";
|
|
||||||
} catch (...) {
|
|
||||||
errs() << argv[0] << ": Unexpected unknown exception occurred.\n";
|
|
||||||
}
|
}
|
||||||
llvm_shutdown();
|
|
||||||
return 1;
|
// If -std-compile-opts was specified at the end of the pass list, add them.
|
||||||
|
if (StandardCompileOpts) {
|
||||||
|
AddStandardCompilePasses(Passes);
|
||||||
|
StandardCompileOpts = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (StandardLinkOpts) {
|
||||||
|
AddStandardLinkPasses(Passes);
|
||||||
|
StandardLinkOpts = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (OptLevelO1)
|
||||||
|
AddOptimizationPasses(Passes, *FPasses, 1);
|
||||||
|
|
||||||
|
if (OptLevelO2)
|
||||||
|
AddOptimizationPasses(Passes, *FPasses, 2);
|
||||||
|
|
||||||
|
if (OptLevelO3)
|
||||||
|
AddOptimizationPasses(Passes, *FPasses, 3);
|
||||||
|
|
||||||
|
if (OptLevelO1 || OptLevelO2 || OptLevelO3) {
|
||||||
|
FPasses->doInitialization();
|
||||||
|
for (Module::iterator I = M.get()->begin(), E = M.get()->end();
|
||||||
|
I != E; ++I)
|
||||||
|
FPasses->run(*I);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check that the module is well formed on completion of optimization
|
||||||
|
if (!NoVerify && !VerifyEach)
|
||||||
|
Passes.add(createVerifierPass());
|
||||||
|
|
||||||
|
// Write bitcode or assembly out to disk or outs() as the last step...
|
||||||
|
if (!NoOutput && !AnalyzeOnly) {
|
||||||
|
if (OutputAssembly)
|
||||||
|
Passes.add(createPrintModulePass(Out));
|
||||||
|
else
|
||||||
|
Passes.add(createBitcodeWriterPass(*Out));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Now that we have all of the passes ready, run them.
|
||||||
|
Passes.run(*M.get());
|
||||||
|
|
||||||
|
// Delete the raw_fd_ostream.
|
||||||
|
if (Out != &outs())
|
||||||
|
delete Out;
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user