From ece02cd5829cea836e9365b0845a8ef042d17b0a Mon Sep 17 00:00:00 2001 From: dim Date: Sun, 12 Jun 2011 15:42:51 +0000 Subject: Vendor import of llvm trunk r132879: http://llvm.org/svn/llvm-project/llvm/trunk@132879 --- tools/bugpoint/ExecutionDriver.cpp | 2 +- tools/bugpoint/Miscompilation.cpp | 5 +- tools/bugpoint/OptimizerDriver.cpp | 2 +- tools/bugpoint/ToolRunner.cpp | 11 +++- tools/bugpoint/bugpoint.cpp | 52 ++++++++++++----- tools/gold/CMakeLists.txt | 6 +- tools/gold/Makefile | 4 +- tools/gold/gold-plugin.cpp | 1 - tools/llc/llc.cpp | 5 -- tools/llvm-ld/Optimize.cpp | 10 ++-- tools/llvm-mc/Disassembler.cpp | 115 +++++++++++++++++++------------------ tools/llvm-mc/Disassembler.h | 4 +- tools/llvm-mc/llvm-mc.cpp | 26 ++++----- tools/llvmc/src/Base.td.in | 2 +- tools/lto/LTOCodeGenerator.cpp | 14 ++--- tools/opt/opt.cpp | 72 +++++++++++------------ 16 files changed, 179 insertions(+), 152 deletions(-) (limited to 'tools') diff --git a/tools/bugpoint/ExecutionDriver.cpp b/tools/bugpoint/ExecutionDriver.cpp index 9be9dfd..77c01ac 100644 --- a/tools/bugpoint/ExecutionDriver.cpp +++ b/tools/bugpoint/ExecutionDriver.cpp @@ -475,7 +475,7 @@ bool BugDriver::createReferenceFile(Module *M, const std::string &Filename) { /// diffProgram - This method executes the specified module and diffs the /// output against the file specified by ReferenceOutputFile. If the output /// is different, 1 is returned. If there is a problem with the code -/// generator (e.g., llc crashes), this will return -1 and set Error. +/// generator (e.g., llc crashes), this will set ErrMsg. /// bool BugDriver::diffProgram(const Module *Program, const std::string &BitcodeFile, diff --git a/tools/bugpoint/Miscompilation.cpp b/tools/bugpoint/Miscompilation.cpp index a9db38f..1834fe1 100644 --- a/tools/bugpoint/Miscompilation.cpp +++ b/tools/bugpoint/Miscompilation.cpp @@ -624,9 +624,10 @@ DebugAMiscompilation(BugDriver &BD, if (!BugpointIsInterrupted) ReduceMiscompilingFunctions(BD, TestFn).reduceList(MiscompiledFunctions, Error); - if (!Error.empty()) + if (!Error.empty()) { + errs() << "\n***Cannot reduce functions: "; return MiscompiledFunctions; - + } outs() << "\n*** The following function" << (MiscompiledFunctions.size() == 1 ? " is" : "s are") << " being miscompiled: "; diff --git a/tools/bugpoint/OptimizerDriver.cpp b/tools/bugpoint/OptimizerDriver.cpp index c6be271..336c83d 100644 --- a/tools/bugpoint/OptimizerDriver.cpp +++ b/tools/bugpoint/OptimizerDriver.cpp @@ -223,7 +223,7 @@ bool BugDriver::runPasses(Module *Program, if (result == -1) outs() << "Execute failed: " << ErrMsg << "\n"; else - outs() << "Crashed with signal #" << abs(result) << "\n"; + outs() << "Crashed: " << ErrMsg << "\n"; } if (result & 0x01000000) outs() << "Dumped core\n"; diff --git a/tools/bugpoint/ToolRunner.cpp b/tools/bugpoint/ToolRunner.cpp index 6c46ef1..0d98262 100644 --- a/tools/bugpoint/ToolRunner.cpp +++ b/tools/bugpoint/ToolRunner.cpp @@ -854,9 +854,18 @@ int GCC::ExecuteProgram(const std::string &ProgramFile, if (RemoteClientPath.isEmpty()) { DEBUG(errs() << ""); - return RunProgramWithTimeout(OutputBinary, &ProgramArgs[0], + int ExitCode = RunProgramWithTimeout(OutputBinary, &ProgramArgs[0], sys::Path(InputFile), sys::Path(OutputFile), sys::Path(OutputFile), Timeout, MemoryLimit, Error); + // Treat a signal (usually SIGSEGV) or timeout as part of the program output + // so that crash-causing miscompilation is handled seamlessly. + if (ExitCode < -1) { + std::ofstream outFile(OutputFile.c_str(), std::ios_base::app); + outFile << *Error << '\n'; + outFile.close(); + Error->clear(); + } + return ExitCode; } else { outs() << ""; outs().flush(); return RunProgramRemotelyWithTimeout(sys::Path(RemoteClientPath), diff --git a/tools/bugpoint/bugpoint.cpp b/tools/bugpoint/bugpoint.cpp index f9c9e18..e25414f 100644 --- a/tools/bugpoint/bugpoint.cpp +++ b/tools/bugpoint/bugpoint.cpp @@ -22,7 +22,7 @@ #include "llvm/Support/ManagedStatic.h" #include "llvm/Support/PluginLoader.h" #include "llvm/Support/PrettyStackTrace.h" -#include "llvm/Support/StandardPasses.h" +#include "llvm/Support/PassManagerBuilder.h" #include "llvm/Support/Process.h" #include "llvm/Support/Signals.h" #include "llvm/Support/Valgrind.h" @@ -69,6 +69,18 @@ static cl::opt StandardLinkOpts("std-link-opts", cl::desc("Include the standard link time optimizations")); +static cl::opt +OptLevelO1("O1", + cl::desc("Optimization level 1. Similar to llvm-gcc -O1")); + +static cl::opt +OptLevelO2("O2", + cl::desc("Optimization level 2. Similar to llvm-gcc -O2")); + +static cl::opt +OptLevelO3("O3", + cl::desc("Optimization level 3. Similar to llvm-gcc -O3")); + static cl::opt OverrideTriple("mtriple", cl::desc("Override target triple for module")); @@ -83,10 +95,10 @@ static void BugpointInterruptFunction() { // Hack to capture a pass list. namespace { - class AddToDriver : public PassManager { + class AddToDriver : public FunctionPassManager { BugDriver &D; public: - AddToDriver(BugDriver &_D) : D(_D) {} + AddToDriver(BugDriver &_D) : FunctionPassManager(0), D(_D) {} virtual void add(Pass *P) { const void *ID = P->getPassID(); @@ -146,20 +158,32 @@ int main(int argc, char **argv) { AddToDriver PM(D); if (StandardCompileOpts) { - createStandardModulePasses(&PM, 3, - /*OptimizeSize=*/ false, - /*UnitAtATime=*/ true, - /*UnrollLoops=*/ true, - /*SimplifyLibCalls=*/ true, - /*HaveExceptions=*/ true, - createFunctionInliningPass()); + PassManagerBuilder Builder; + Builder.OptLevel = 3; + Builder.Inliner = createFunctionInliningPass(); + Builder.populateModulePassManager(PM); } - if (StandardLinkOpts) - createStandardLTOPasses(&PM, /*Internalize=*/true, - /*RunInliner=*/true, - /*VerifyEach=*/false); + if (StandardLinkOpts) { + PassManagerBuilder Builder; + Builder.populateLTOPassManager(PM, /*Internalize=*/true, + /*RunInliner=*/true); + } + if (OptLevelO1 || OptLevelO2 || OptLevelO3) { + PassManagerBuilder Builder; + if (OptLevelO1) + Builder.Inliner = createAlwaysInlinerPass(); + else if (OptLevelO2) + Builder.Inliner = createFunctionInliningPass(225); + else + Builder.Inliner = createFunctionInliningPass(275); + + // Note that although clang/llvm-gcc use two separate passmanagers + // here, it shouldn't normally make a difference. + Builder.populateFunctionPassManager(PM); + Builder.populateModulePassManager(PM); + } for (std::vector::iterator I = PassList.begin(), E = PassList.end(); diff --git a/tools/gold/CMakeLists.txt b/tools/gold/CMakeLists.txt index d8633e6..eb4b6e6 100644 --- a/tools/gold/CMakeLists.txt +++ b/tools/gold/CMakeLists.txt @@ -1,7 +1,9 @@ -set(LLVM_BINUTILS_INCDIR "/usr/include" CACHE PATH +set(LLVM_BINUTILS_INCDIR "" CACHE PATH "PATH to binutils/include containing plugin-api.h for gold plugin.") -if( NOT EXISTS "${LLVM_BINUTILS_INCDIR}/plugin-api.h" ) +if( NOT LLVM_BINUTILS_INCDIR ) + # Nothing to say. +elseif( NOT EXISTS "${LLVM_BINUTILS_INCDIR}/plugin-api.h" ) message(STATUS "plugin-api.h not found. gold plugin excluded from the build.") else() include_directories( ${LLVM_BINUTILS_INCDIR} ) diff --git a/tools/gold/Makefile b/tools/gold/Makefile index 66a0271..759406f 100644 --- a/tools/gold/Makefile +++ b/tools/gold/Makefile @@ -22,10 +22,10 @@ SHARED_LIBRARY = 1 LOADABLE_MODULE = 1 LINK_COMPONENTS := support -LIBS += -llto # Because off_t is used in the public API, the largefile parts are required for # ABI compatibility. -CXXFLAGS+=-I$(BINUTILS_INCDIR) -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -lLTO +CXXFLAGS+=-I$(BINUTILS_INCDIR) -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 +CXXFLAGS+=$(SharedLibDir)/$(SharedPrefix)LTO$(SHLIBEXT) include $(LEVEL)/Makefile.common diff --git a/tools/gold/gold-plugin.cpp b/tools/gold/gold-plugin.cpp index dd66eae..9e43bef 100644 --- a/tools/gold/gold-plugin.cpp +++ b/tools/gold/gold-plugin.cpp @@ -408,7 +408,6 @@ static ld_plugin_status all_symbols_read_hook(void) { if (options::generate_bc_file == options::BC_ONLY) exit(0); } - size_t bufsize = 0; const char *objPath; if (lto_codegen_compile_to_file(code_gen, &objPath)) { (*message)(LDPL_ERROR, "Could not produce a combined object file\n"); diff --git a/tools/llc/llc.cpp b/tools/llc/llc.cpp index a36b6d7..162d6c8 100644 --- a/tools/llc/llc.cpp +++ b/tools/llc/llc.cpp @@ -107,11 +107,6 @@ DisableRedZone("disable-red-zone", cl::desc("Do not emit code that uses the red zone."), cl::init(false)); -static cl::opt -NoImplicitFloats("no-implicit-float", - cl::desc("Don't generate implicit floating point instructions (x86-only)"), - cl::init(false)); - // GetFileNameRoot - Helper function to get the basename of a filename. static inline std::string GetFileNameRoot(const std::string &InputFilename) { diff --git a/tools/llvm-ld/Optimize.cpp b/tools/llvm-ld/Optimize.cpp index ef4502b..ca6a477 100644 --- a/tools/llvm-ld/Optimize.cpp +++ b/tools/llvm-ld/Optimize.cpp @@ -12,9 +12,8 @@ //===----------------------------------------------------------------------===// #include "llvm/Module.h" -#include "llvm/PassManager.h" #include "llvm/Support/CommandLine.h" -#include "llvm/Support/StandardPasses.h" +#include "llvm/Support/PassManagerBuilder.h" #include "llvm/Support/raw_ostream.h" #include "llvm/Support/DynamicLibrary.h" #include "llvm/Target/TargetData.h" @@ -71,11 +70,10 @@ static inline void addPass(PassManager &PM, Pass *P) { } namespace llvm { - /// Optimize - Perform link time optimizations. This will run the scalar /// optimizations, any loaded plugin-optimization modules, and then the /// inter-procedural optimizations if applicable. -void Optimize(Module* M) { +void Optimize(Module *M) { // Instantiate the pass manager to organize the passes. PassManager Passes; @@ -88,8 +86,8 @@ void Optimize(Module* M) { addPass(Passes, new TargetData(M)); if (!DisableOptimizations) - createStandardLTOPasses(&Passes, !DisableInternalize, !DisableInline, - VerifyEach); + PassManagerBuilder().populateLTOPassManager(Passes, !DisableInternalize, + !DisableInline); // If the -s or -S command line options were specified, strip the symbols out // of the resulting program to make it smaller. -s and -S are GNU ld options diff --git a/tools/llvm-mc/Disassembler.cpp b/tools/llvm-mc/Disassembler.cpp index cdd1892..93b9723 100644 --- a/tools/llvm-mc/Disassembler.cpp +++ b/tools/llvm-mc/Disassembler.cpp @@ -39,7 +39,7 @@ private: const ByteArrayTy &Bytes; public: VectorMemoryObject(const ByteArrayTy &bytes) : Bytes(bytes) {} - + uint64_t getBase() const { return 0; } uint64_t getExtent() const { return Bytes.size(); } @@ -57,15 +57,15 @@ static bool PrintInsts(const MCDisassembler &DisAsm, SourceMgr &SM, raw_ostream &Out) { // Wrap the vector in a MemoryObject. VectorMemoryObject memoryObject(Bytes); - + // Disassemble it to strings. uint64_t Size; uint64_t Index; - + for (Index = 0; Index < Bytes.size(); Index += Size) { MCInst Inst; - - if (DisAsm.getInstruction(Inst, Size, memoryObject, Index, + + if (DisAsm.getInstruction(Inst, Size, memoryObject, Index, /*REMOVE*/ nulls())) { Printer.printInst(&Inst, Out); Out << "\n"; @@ -76,12 +76,12 @@ static bool PrintInsts(const MCDisassembler &DisAsm, Size = 1; // skip illegible bytes } } - + return false; } -static bool ByteArrayFromString(ByteArrayTy &ByteArray, - StringRef &Str, +static bool ByteArrayFromString(ByteArrayTy &ByteArray, + StringRef &Str, SourceMgr &SM) { while (!Str.empty()) { // Strip horizontal whitespace. @@ -89,7 +89,7 @@ static bool ByteArrayFromString(ByteArrayTy &ByteArray, Str = Str.substr(Pos); continue; } - + // If this is the end of a line or start of a comment, remove the rest of // the line. if (Str[0] == '\n' || Str[0] == '#') { @@ -104,11 +104,11 @@ static bool ByteArrayFromString(ByteArrayTy &ByteArray, } continue; } - + // Get the current token. size_t Next = Str.find_first_of(" \t\n\r#"); StringRef Value = Str.substr(0, Next); - + // Convert to a byte and add to the byte vector. unsigned ByteVal; if (Value.getAsInteger(0, ByteVal) || ByteVal > 255) { @@ -119,11 +119,11 @@ static bool ByteArrayFromString(ByteArrayTy &ByteArray, ByteArray.clear(); continue; } - + ByteArray.push_back(std::make_pair((unsigned char)ByteVal, Value.data())); Str = Str.substr(Next); } - + return false; } @@ -133,18 +133,18 @@ int Disassembler::disassemble(const Target &T, TargetMachine &TM, raw_ostream &Out) { // Set up disassembler. OwningPtr AsmInfo(T.createAsmInfo(Triple)); - + if (!AsmInfo) { errs() << "error: no assembly info for target " << Triple << "\n"; return -1; } - + OwningPtr DisAsm(T.createMCDisassembler()); if (!DisAsm) { errs() << "error: no disassembler for target " << Triple << "\n"; return -1; } - + int AsmPrinterVariant = AsmInfo->getAssemblerDialect(); OwningPtr IP(T.createMCInstPrinter(TM, AsmPrinterVariant, *AsmInfo)); @@ -152,67 +152,67 @@ int Disassembler::disassemble(const Target &T, TargetMachine &TM, errs() << "error: no instruction printer for target " << Triple << '\n'; return -1; } - + bool ErrorOccurred = false; - + SourceMgr SM; SM.AddNewSourceBuffer(&Buffer, SMLoc()); - + // Convert the input to a vector for disassembly. ByteArrayTy ByteArray; StringRef Str = Buffer.getBuffer(); - + ErrorOccurred |= ByteArrayFromString(ByteArray, Str, SM); - + if (!ByteArray.empty()) ErrorOccurred |= PrintInsts(*DisAsm, *IP, ByteArray, SM, Out); - + return ErrorOccurred; } static int byteArrayReader(uint8_t *B, uint64_t A, void *Arg) { ByteArrayTy &ByteArray = *((ByteArrayTy*)Arg); - + if (A >= ByteArray.size()) return -1; - + *B = ByteArray[A].first; - + return 0; } static int verboseEvaluator(uint64_t *V, unsigned R, void *Arg) { EDDisassembler &disassembler = *(EDDisassembler *)((void **)Arg)[0]; raw_ostream &Out = *(raw_ostream *)((void **)Arg)[1]; - + if (const char *regName = disassembler.nameWithRegisterID(R)) Out << "[" << regName << "/" << R << "]"; - + if (disassembler.registerIsStackPointer(R)) Out << "(sp)"; if (disassembler.registerIsProgramCounter(R)) Out << "(pc)"; - + *V = 0; return 0; } -int Disassembler::disassembleEnhanced(const std::string &TS, +int Disassembler::disassembleEnhanced(const std::string &TS, MemoryBuffer &Buffer, raw_ostream &Out) { ByteArrayTy ByteArray; StringRef Str = Buffer.getBuffer(); SourceMgr SM; - + SM.AddNewSourceBuffer(&Buffer, SMLoc()); - + if (ByteArrayFromString(ByteArray, Str, SM)) { return -1; } - + Triple T(TS); EDDisassembler::AssemblySyntax AS; - + switch (T.getArch()) { default: errs() << "error: no default assembly syntax for " << TS.c_str() << "\n"; @@ -226,53 +226,53 @@ int Disassembler::disassembleEnhanced(const std::string &TS, AS = EDDisassembler::kEDAssemblySyntaxX86ATT; break; } - + EDDisassembler::initialize(); OwningPtr disassembler(EDDisassembler::getDisassembler(TS.c_str(), AS)); - + if (disassembler == 0) { errs() << "error: couldn't get disassembler for " << TS << '\n'; return -1; } - + while (ByteArray.size()) { OwningPtr inst(disassembler->createInst(byteArrayReader, 0, &ByteArray)); - + if (inst == 0) { errs() << "error: Didn't get an instruction\n"; return -1; } ByteArray.erase (ByteArray.begin(), ByteArray.begin() + inst->byteSize()); - + unsigned numTokens = inst->numTokens(); if ((int)numTokens < 0) { errs() << "error: couldn't count the instruction's tokens\n"; return -1; } - + for (unsigned tokenIndex = 0; tokenIndex != numTokens; ++tokenIndex) { EDToken *token; - + if (inst->getToken(token, tokenIndex)) { errs() << "error: Couldn't get token\n"; return -1; } - + const char *buf; if (token->getString(buf)) { errs() << "error: Couldn't get string for token\n"; return -1; } - + Out << '['; int operandIndex = token->operandID(); - + if (operandIndex >= 0) Out << operandIndex << "-"; - + switch (token->type()) { default: Out << "?"; break; case EDToken::kTokenWhitespace: Out << "w"; break; @@ -281,9 +281,9 @@ int Disassembler::disassembleEnhanced(const std::string &TS, case EDToken::kTokenLiteral: Out << "l"; break; case EDToken::kTokenRegister: Out << "r"; break; } - + Out << ":" << buf; - + if (token->type() == EDToken::kTokenLiteral) { Out << "="; if (token->literalSign()) @@ -303,33 +303,34 @@ int Disassembler::disassembleEnhanced(const std::string &TS, } Out << "r" << regID; } - + Out << "]"; } - + Out << " "; - + if (inst->isBranch()) Out << "
"; if (inst->isMove()) Out << " "; - + unsigned numOperands = inst->numOperands(); - + if ((int)numOperands < 0) { errs() << "error: Couldn't count operands\n"; return -1; } - - for (unsigned operandIndex = 0; operandIndex != numOperands; ++operandIndex) { + + for (unsigned operandIndex = 0; operandIndex != numOperands; + ++operandIndex) { Out << operandIndex << ":"; - + EDOperand *operand; if (inst->getOperand(operand, operandIndex)) { errs() << "error: couldn't get operand\n"; return -1; } - + uint64_t evaluatedResult; void *Arg[] = { disassembler.get(), &Out }; if (operand->evaluate(evaluatedResult, verboseEvaluator, Arg)) { @@ -338,10 +339,10 @@ int Disassembler::disassembleEnhanced(const std::string &TS, } Out << "=" << evaluatedResult << " "; } - + Out << '\n'; } - + return 0; } diff --git a/tools/llvm-mc/Disassembler.h b/tools/llvm-mc/Disassembler.h index aaf77b5..d738ee7 100644 --- a/tools/llvm-mc/Disassembler.h +++ b/tools/llvm-mc/Disassembler.h @@ -31,12 +31,12 @@ public: const std::string &tripleString, MemoryBuffer &buffer, raw_ostream &Out); - + static int disassembleEnhanced(const std::string &tripleString, MemoryBuffer &buffer, raw_ostream &Out); }; - + } // namespace llvm #endif diff --git a/tools/llvm-mc/llvm-mc.cpp b/tools/llvm-mc/llvm-mc.cpp index 24cc263..eb23a1a 100644 --- a/tools/llvm-mc/llvm-mc.cpp +++ b/tools/llvm-mc/llvm-mc.cpp @@ -183,10 +183,10 @@ static int AsLexInput(const char *ProgName) { MemoryBuffer *Buffer = BufferPtr.take(); SourceMgr SrcMgr; - + // Tell SrcMgr about this buffer, which is what TGParser will pick up. SrcMgr.AddNewSourceBuffer(Buffer, SMLoc()); - + // Record the location of the include directories so that the lexer can find // it later. SrcMgr.setIncludeDirs(IncludeDirs); @@ -279,7 +279,7 @@ static int AsLexInput(const char *ProgName) { // Keep output if no errors. if (Error == 0) Out->keep(); - + return Error; } @@ -294,20 +294,20 @@ static int AssembleInput(const char *ProgName) { return 1; } MemoryBuffer *Buffer = BufferPtr.take(); - + SourceMgr SrcMgr; - + // Tell SrcMgr about this buffer, which is what the parser will pick up. SrcMgr.AddNewSourceBuffer(Buffer, SMLoc()); - + // Record the location of the include directories so that the lexer can find // it later. SrcMgr.setIncludeDirs(IncludeDirs); - - + + llvm::OwningPtr MAI(TheTarget->createAsmInfo(TripleName)); assert(MAI && "Unable to create target asm info!"); - + // Package up features to be passed to target/subtarget std::string FeaturesStr; if (MCPU.size()) { @@ -378,7 +378,7 @@ static int AssembleInput(const char *ProgName) { *Str.get(), *MAI)); OwningPtr TAP(TheTarget->createAsmParser(*Parser, *TM)); if (!TAP) { - errs() << ProgName + errs() << ProgName << ": error: this target does not support assembly parsing.\n"; return 1; } @@ -404,7 +404,7 @@ static int DisassembleInput(const char *ProgName, bool Enhanced) { errs() << ProgName << ": " << ec.message() << '\n'; return 1; } - + OwningPtr Out(GetOutputStream()); if (!Out) return 1; @@ -459,7 +459,7 @@ int main(int argc, char **argv) { llvm::InitializeAllAsmPrinters(); llvm::InitializeAllAsmParsers(); llvm::InitializeAllDisassemblers(); - + cl::ParseCommandLineOptions(argc, argv, "llvm machine code playground\n"); TripleName = Triple::normalize(TripleName); @@ -474,7 +474,7 @@ int main(int argc, char **argv) { case AC_EDisassemble: return DisassembleInput(argv[0], true); } - + return 0; } diff --git a/tools/llvmc/src/Base.td.in b/tools/llvmc/src/Base.td.in index 527913c..84e39e7 100644 --- a/tools/llvmc/src/Base.td.in +++ b/tools/llvmc/src/Base.td.in @@ -301,7 +301,7 @@ def llc : Tool< [(in_language "llvm-bitcode", "llvm-assembler"), (out_language "assembler"), (output_suffix "s"), - (command "llc"), + (command "llc -disable-cfi"), (actions (case (switch_on "S"), (stop_compilation), (switch_on "O0"), (forward "O0"), diff --git a/tools/lto/LTOCodeGenerator.cpp b/tools/lto/LTOCodeGenerator.cpp index d95f354..3abd641 100644 --- a/tools/lto/LTOCodeGenerator.cpp +++ b/tools/lto/LTOCodeGenerator.cpp @@ -14,7 +14,6 @@ #include "LTOModule.h" #include "LTOCodeGenerator.h" - #include "llvm/Constants.h" #include "llvm/DerivedTypes.h" #include "llvm/Linker.h" @@ -37,7 +36,7 @@ #include "llvm/Support/CommandLine.h" #include "llvm/Support/FormattedStream.h" #include "llvm/Support/MemoryBuffer.h" -#include "llvm/Support/StandardPasses.h" +#include "llvm/Support/PassManagerBuilder.h" #include "llvm/Support/SystemUtils.h" #include "llvm/Support/ToolOutputFile.h" #include "llvm/Support/Host.h" @@ -355,9 +354,8 @@ void LTOCodeGenerator::applyScopeRestrictions() { } /// Optimize merged modules using various IPO passes -bool LTOCodeGenerator::generateObjectFile(raw_ostream& out, - std::string& errMsg) -{ +bool LTOCodeGenerator::generateObjectFile(raw_ostream &out, + std::string &errMsg) { if ( this->determineTarget(errMsg) ) return true; @@ -380,13 +378,13 @@ bool LTOCodeGenerator::generateObjectFile(raw_ostream& out, // Add an appropriate TargetData instance for this module... passes.add(new TargetData(*_target->getTargetData())); - createStandardLTOPasses(&passes, /*Internalize=*/ false, !DisableInline, - /*VerifyEach=*/ false); + PassManagerBuilder().populateLTOPassManager(passes, /*Internalize=*/ false, + !DisableInline); // Make sure everything is still good. passes.add(createVerifierPass()); - FunctionPassManager* codeGenPasses = new FunctionPassManager(mergedModule); + FunctionPassManager *codeGenPasses = new FunctionPassManager(mergedModule); codeGenPasses->add(new TargetData(*_target->getTargetData())); diff --git a/tools/opt/opt.cpp b/tools/opt/opt.cpp index 25474c4..aa375c5 100644 --- a/tools/opt/opt.cpp +++ b/tools/opt/opt.cpp @@ -35,7 +35,7 @@ #include "llvm/Support/ManagedStatic.h" #include "llvm/Support/PluginLoader.h" #include "llvm/Support/PrettyStackTrace.h" -#include "llvm/Support/StandardPasses.h" +#include "llvm/Support/PassManagerBuilder.h" #include "llvm/Support/SystemUtils.h" #include "llvm/Support/ToolOutputFile.h" #include "llvm/LinkAllPasses.h" @@ -387,10 +387,12 @@ struct BreakpointPrinter : public ModulePass { AU.setPreservesAll(); } }; + +} // anonymous namespace char BreakpointPrinter::ID = 0; -inline void addPass(PassManagerBase &PM, Pass *P) { +static inline void addPass(PassManagerBase &PM, Pass *P) { // Add the pass to the pass manager... PM.add(P); @@ -403,31 +405,30 @@ inline void addPass(PassManagerBase &PM, Pass *P) { /// duplicates llvm-gcc behaviour. /// /// OptLevel - Optimization Level -void AddOptimizationPasses(PassManagerBase &MPM, PassManagerBase &FPM, - unsigned OptLevel) { - createStandardFunctionPasses(&FPM, OptLevel); +static void AddOptimizationPasses(PassManagerBase &MPM,FunctionPassManager &FPM, + unsigned OptLevel) { + PassManagerBuilder Builder; + Builder.OptLevel = OptLevel; - llvm::Pass *InliningPass = 0; if (DisableInline) { // No inlining pass - } else if (OptLevel) { + } else if (OptLevel > 1) { unsigned Threshold = 225; if (OptLevel > 2) Threshold = 275; - InliningPass = createFunctionInliningPass(Threshold); + Builder.Inliner = createFunctionInliningPass(Threshold); } else { - InliningPass = createAlwaysInlinerPass(); + Builder.Inliner = createAlwaysInlinerPass(); } - createStandardModulePasses(&MPM, OptLevel, - /*OptimizeSize=*/ false, - UnitAtATime, - /*UnrollLoops=*/ OptLevel > 1, - !DisableSimplifyLibCalls, - /*HaveExceptions=*/ true, - InliningPass); + Builder.DisableUnitAtATime = !UnitAtATime; + Builder.DisableUnrollLoops = OptLevel == 0; + Builder.DisableSimplifyLibCalls = DisableSimplifyLibCalls; + + Builder.populateFunctionPassManager(FPM); + Builder.populateModulePassManager(MPM); } -void AddStandardCompilePasses(PassManagerBase &PM) { +static void AddStandardCompilePasses(PassManagerBase &PM) { PM.add(createVerifierPass()); // Verify that input is correct addPass(PM, createLowerSetJmpPass()); // Lower llvm.setjmp/.longjmp @@ -438,19 +439,16 @@ void AddStandardCompilePasses(PassManagerBase &PM) { if (DisableOptimizations) return; - llvm::Pass *InliningPass = !DisableInline ? createFunctionInliningPass() : 0; - // -std-compile-opts adds the same module passes as -O3. - createStandardModulePasses(&PM, 3, - /*OptimizeSize=*/ false, - /*UnitAtATime=*/ true, - /*UnrollLoops=*/ true, - !DisableSimplifyLibCalls, - /*HaveExceptions=*/ true, - InliningPass); + PassManagerBuilder Builder; + if (!DisableInline) + Builder.Inliner = createFunctionInliningPass(); + Builder.OptLevel = 3; + Builder.DisableSimplifyLibCalls = DisableSimplifyLibCalls; + Builder.populateModulePassManager(PM); } -void AddStandardLinkPasses(PassManagerBase &PM) { +static void AddStandardLinkPasses(PassManagerBase &PM) { PM.add(createVerifierPass()); // Verify that input is correct // If the -strip-debug command line option was specified, do it. @@ -459,13 +457,11 @@ void AddStandardLinkPasses(PassManagerBase &PM) { if (DisableOptimizations) return; - createStandardLTOPasses(&PM, /*Internalize=*/ !DisableInternalize, - /*RunInliner=*/ !DisableInline, - /*VerifyEach=*/ VerifyEach); + PassManagerBuilder Builder; + Builder.populateLTOPassManager(PM, /*Internalize=*/ !DisableInternalize, + /*RunInliner=*/ !DisableInline); } -} // anonymous namespace - //===----------------------------------------------------------------------===// // main for opt @@ -566,9 +562,9 @@ int main(int argc, char **argv) { if (TD) Passes.add(TD); - OwningPtr FPasses; + OwningPtr FPasses; if (OptLevelO1 || OptLevelO2 || OptLevelO3) { - FPasses.reset(new PassManager()); + FPasses.reset(new FunctionPassManager(M.get())); if (TD) FPasses->add(new TargetData(*TD)); } @@ -686,8 +682,12 @@ int main(int argc, char **argv) { if (OptLevelO3) AddOptimizationPasses(Passes, *FPasses, 3); - if (OptLevelO1 || OptLevelO2 || OptLevelO3) - FPasses->run(*M.get()); + if (OptLevelO1 || OptLevelO2 || OptLevelO3) { + FPasses->doInitialization(); + for (Module::iterator F = M->begin(), E = M->end(); F != E; ++F) + FPasses->run(*F); + FPasses->doFinalization(); + } // Check that the module is well formed on completion of optimization if (!NoVerify && !VerifyEach) -- cgit v1.1