X-Git-Url: http://plrg.eecs.uci.edu/git/?a=blobdiff_plain;f=lib%2FVMCore%2FPass.cpp;h=5079b4ea65eba147829be64ad571ffa4bbd4b3da;hb=551ccae044b0ff658fe629dd67edd5ffe75d10e8;hp=ddee390e50938fc894cae897859c46c49044ab81;hpb=69c856aa6d42c2bf25730c04c24988658ec3ae24;p=oota-llvm.git diff --git a/lib/VMCore/Pass.cpp b/lib/VMCore/Pass.cpp index ddee390e509..5079b4ea65e 100644 --- a/lib/VMCore/Pass.cpp +++ b/lib/VMCore/Pass.cpp @@ -1,4 +1,11 @@ //===- Pass.cpp - LLVM Pass Infrastructure Implementation -----------------===// +// +// 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 file implements the LLVM Pass infrastructure. It is primarily // responsible with ensuring that passes are executed and batched together @@ -10,9 +17,11 @@ #include "PassManagerT.h" // PassManagerT implementation #include "llvm/Module.h" #include "llvm/ModuleProvider.h" -#include "Support/STLExtras.h" -#include "Support/TypeInfo.h" +#include "llvm/ADT/STLExtras.h" +#include "llvm/Support/TypeInfo.h" +#include #include +using namespace llvm; // IncludeFile - Stub function used to help linking out. IncludeFile::IncludeFile(void*) {} @@ -83,9 +92,15 @@ FunctionPassManager::~FunctionPassManager() { delete PM; } void FunctionPassManager::add(FunctionPass *P) { PM->add(P); } void FunctionPassManager::add(ImmutablePass *IP) { PM->add(IP); } bool FunctionPassManager::run(Function &F) { - Function *mF = MP->getModule()->getNamedFunction(F.getName()); - assert((&F == mF) && "ModuleProvider does not contain this function!"); - MP->materializeFunction(&F); + try { + MP->materializeFunction(&F); + } catch (std::string& errstr) { + std::cerr << "Error reading bytecode file: " << errstr << "\n"; + abort(); + } catch (...) { + std::cerr << "Error reading bytecode file!\n"; + abort(); + } return PM->run(F); } @@ -95,15 +110,16 @@ bool FunctionPassManager::run(Function &F) { // amount of time each pass takes to execute. This only happens with // -time-passes is enabled on the command line. // -static cl::opt -EnableTiming("time-passes", +bool llvm::TimePassesIsEnabled = false; +static cl::opt +EnableTiming("time-passes", cl::location(TimePassesIsEnabled), cl::desc("Time each pass, printing elapsed time for each on exit")); // createTheTimeInfo - This method either initializes the TheTimeInfo pointer to // a non null value (if the -time-passes option is enabled) or it leaves it // null. It may be called multiple times. void TimingInfo::createTheTimeInfo() { - if (!EnableTiming || TheTimeInfo) return; + if (!TimePassesIsEnabled || TheTimeInfo) return; // Constructed the first time this is called, iff -time-passes is enabled. // This guarantees that the object will be constructed before static globals, @@ -127,22 +143,31 @@ void PMDebug::PrintArgumentInformation(const Pass *P) { } void PMDebug::PrintPassInformation(unsigned Depth, const char *Action, - Pass *P, Annotable *V) { + Pass *P, Module *M) { if (PassDebugging >= Executions) { std::cerr << (void*)P << std::string(Depth*2+1, ' ') << Action << " '" << P->getPassName(); - if (V) { - std::cerr << "' on "; - - if (dynamic_cast(V)) { - std::cerr << "Module\n"; return; - } else if (Function *F = dynamic_cast(V)) - std::cerr << "Function '" << F->getName(); - else if (BasicBlock *BB = dynamic_cast(V)) - std::cerr << "BasicBlock '" << BB->getName(); - else if (Value *Val = dynamic_cast(V)) - std::cerr << typeid(*Val).name() << " '" << Val->getName(); - } + if (M) std::cerr << "' on Module '" << M->getModuleIdentifier() << "'\n"; + std::cerr << "'...\n"; + } +} + +void PMDebug::PrintPassInformation(unsigned Depth, const char *Action, + Pass *P, Function *F) { + if (PassDebugging >= Executions) { + std::cerr << (void*)P << std::string(Depth*2+1, ' ') << Action << " '" + << P->getPassName(); + if (F) std::cerr << "' on Function '" << F->getName(); + std::cerr << "'...\n"; + } +} + +void PMDebug::PrintPassInformation(unsigned Depth, const char *Action, + Pass *P, BasicBlock *BB) { + if (PassDebugging >= Executions) { + std::cerr << (void*)P << std::string(Depth*2+1, ' ') << Action << " '" + << P->getPassName(); + if (BB) std::cerr << "' on BasicBlock '" << BB->getName(); std::cerr << "'...\n"; } } @@ -176,7 +201,7 @@ void Pass::dumpPassStructure(unsigned Offset) { std::cerr << std::string(Offset*2, ' ') << getPassName() << "\n"; } -// getPassName - Use C++ RTTI to get a SOMEWHAT intelligable name for the pass. +// getPassName - Use C++ RTTI to get a SOMEWHAT intelligible name for the pass. // const char *Pass::getPassName() const { if (const PassInfo *PI = getPassInfo())