#include "llvm/Analysis/RegionPass.h"
#include "llvm/Analysis/CallGraph.h"
#include "llvm/Target/TargetData.h"
+#include "llvm/Target/TargetLibraryInfo.h"
#include "llvm/Target/TargetMachine.h"
+#include "llvm/ADT/StringSet.h"
+#include "llvm/ADT/Triple.h"
#include "llvm/Support/PassNameParser.h"
#include "llvm/Support/Signals.h"
#include "llvm/Support/Debug.h"
AnalyzeOnly("analyze", cl::desc("Only perform analysis, no optimization"));
static cl::opt<bool>
-PrintBreakpoints("print-breakpoints-for-testing",
+PrintBreakpoints("print-breakpoints-for-testing",
cl::desc("Print select breakpoints location for testing"));
static cl::opt<std::string>
-DefaultDataLayout("default-data-layout",
+DefaultDataLayout("default-data-layout",
cl::desc("data layout string to use if not specified by module"),
cl::value_desc("layout-string"), cl::init(""));
RegionPassPrinter(const PassInfo *PI, raw_ostream &out) : RegionPass(ID),
PassToPrint(PI), Out(out) {
std::string PassToPrintName = PassToPrint->getPassName();
- PassName = "LoopPass Printer: " + PassToPrintName;
+ PassName = "RegionPass Printer: " + PassToPrintName;
}
virtual bool runOnRegion(Region *R, RGPassManager &RGM) {
return false;
}
- virtual const char *getPassName() const { return "'Pass' Printer"; }
+ virtual const char *getPassName() const { return PassName.c_str(); }
virtual void getAnalysisUsage(AnalysisUsage &AU) const {
AU.addRequiredID(PassToPrint->getTypeInfo());
<< "': Pass " << PassToPrint->getPassName() << ":\n";
// Get and print pass...
- getAnalysisID<Pass>(PassToPrint->getTypeInfo()).print(Out,
+ getAnalysisID<Pass>(PassToPrint->getTypeInfo()).print(Out,
BB.getParent()->getParent());
return false;
}
char BasicBlockPassPrinter::ID = 0;
-struct BreakpointPrinter : public FunctionPass {
+struct BreakpointPrinter : public ModulePass {
raw_ostream &Out;
static char ID;
BreakpointPrinter(raw_ostream &out)
- : FunctionPass(ID), Out(out) {
+ : ModulePass(ID), Out(out) {
}
- virtual bool runOnFunction(Function &F) {
- for (Function::iterator I = F.begin(), E = F.end(); I != E; ++I) {
- BasicBlock::const_iterator BI = I->end();
- --BI;
- do {
- const Instruction *In = BI;
- const DebugLoc DL = In->getDebugLoc();
- if (!DL.isUnknown()) {
- DIScope S(DL.getScope(getGlobalContext()));
- Out << S.getFilename() << " " << DL.getLine() << "\n";
- break;
- }
- --BI;
- } while (BI != I->begin());
- break;
+ void getContextName(DIDescriptor Context, std::string &N) {
+ if (Context.isNameSpace()) {
+ DINameSpace NS(Context);
+ if (!NS.getName().empty()) {
+ getContextName(NS.getContext(), N);
+ N = N + NS.getName().str() + "::";
+ }
+ } else if (Context.isType()) {
+ DIType TY(Context);
+ if (!TY.getName().empty()) {
+ getContextName(TY.getContext(), N);
+ N = N + TY.getName().str() + "::";
+ }
}
- BasicBlock &EntryBB = F.getEntryBlock();
- for (Function::iterator I = F.begin(), E = F.end(); I != E; ++I) {
- BasicBlock *BB = I;
- if (BB == &EntryBB) continue;
- for (BasicBlock::iterator BI = I->begin(), BE = I->end(); BI != BE; ++BI)
- if (CallInst *CI = dyn_cast<CallInst>(BI)) {
- const DebugLoc DL = CI->getDebugLoc();
- if (!DL.isUnknown()) {
- DIScope S(DL.getScope(getGlobalContext()));
- Out << S.getFilename() << " " << DL.getLine() << "\n";
- }
+ }
+
+ virtual bool runOnModule(Module &M) {
+ StringSet<> Processed;
+ if (NamedMDNode *NMD = M.getNamedMetadata("llvm.dbg.sp"))
+ for (unsigned i = 0, e = NMD->getNumOperands(); i != e; ++i) {
+ std::string Name;
+ DISubprogram SP(NMD->getOperand(i));
+ if (SP.Verify())
+ getContextName(SP.getContext(), Name);
+ Name = Name + SP.getDisplayName().str();
+ if (!Name.empty() && Processed.insert(Name)) {
+ Out << Name << "\n";
}
- }
+ }
return false;
}
/*OptimizeSize=*/ false,
/*UnitAtATime=*/ true,
/*UnrollLoops=*/ true,
- /*SimplifyLibCalls=*/ true,
+ !DisableSimplifyLibCalls,
/*HaveExceptions=*/ true,
InliningPass);
}
llvm_shutdown_obj Y; // Call llvm_shutdown() on exit.
LLVMContext &Context = getGlobalContext();
-
+
// Initialize passes
PassRegistry &Registry = *PassRegistry::getPassRegistry();
initializeCore(Registry);
initializeInstCombine(Registry);
initializeInstrumentation(Registry);
initializeTarget(Registry);
-
+
cl::ParseCommandLineOptions(argc, argv,
"llvm .bc -> .bc modular optimizer and analysis printer\n");
NoOutput = true;
// Create a PassManager to hold and optimize the collection of passes we are
- // about to build...
+ // about to build.
//
PassManager Passes;
- // Add an appropriate TargetData instance for this module...
+ // Add an appropriate TargetLibraryInfo pass for the module's triple.
+ TargetLibraryInfo *TLI = new TargetLibraryInfo(Triple(M->getTargetTriple()));
+
+ // The -disable-simplify-libcalls flag actually disables all builtin optzns.
+ if (DisableSimplifyLibCalls)
+ TLI->disableAllFunctions();
+ Passes.add(TLI);
+
+ // Add an appropriate TargetData instance for this module.
TargetData *TD = 0;
const std::string &ModuleDataLayout = M.get()->getDataLayout();
if (!ModuleDataLayout.empty())
if (!Out) {
if (OutputFilename.empty())
OutputFilename = "-";
-
+
std::string ErrorInfo;
Out.reset(new tool_output_file(OutputFilename.c_str(), ErrorInfo,
raw_fd_ostream::F_Binary));
Passes.add(createBitcodeWriterPass(Out->os()));
}
+ // Before executing passes, print the final values of the LLVM options.
+ cl::PrintOptionValues();
+
// Now that we have all of the passes ready, run them.
Passes.run(*M.get());