mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-17 18:31:04 +00:00
7724e8efa2
produce it. This adds a function to the TargetMachine that produces this analysis via a callback for each function. This in turn faves the way to produce a *different* TTI per-function with the correct subtarget cached. I've also done the necessary wiring in the opt tool to thread the target machine down and make it available to the pass registry so that we can construct this analysis from a target machine when available. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@227721 91177308-0d34-0410-b5e6-96231b3b80d8
98 lines
3.1 KiB
C++
98 lines
3.1 KiB
C++
//===- NewPMDriver.cpp - Driver for opt with new PM -----------------------===//
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
/// \file
|
|
///
|
|
/// This file is just a split of the code that logically belongs in opt.cpp but
|
|
/// that includes the new pass manager headers.
|
|
///
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "NewPMDriver.h"
|
|
#include "Passes.h"
|
|
#include "llvm/ADT/StringRef.h"
|
|
#include "llvm/Analysis/CGSCCPassManager.h"
|
|
#include "llvm/Bitcode/BitcodeWriterPass.h"
|
|
#include "llvm/IR/Dominators.h"
|
|
#include "llvm/IR/IRPrintingPasses.h"
|
|
#include "llvm/IR/LLVMContext.h"
|
|
#include "llvm/IR/Module.h"
|
|
#include "llvm/IR/PassManager.h"
|
|
#include "llvm/IR/Verifier.h"
|
|
#include "llvm/Support/CommandLine.h"
|
|
#include "llvm/Support/ErrorHandling.h"
|
|
#include "llvm/Support/ToolOutputFile.h"
|
|
#include "llvm/Target/TargetMachine.h"
|
|
|
|
using namespace llvm;
|
|
using namespace opt_tool;
|
|
|
|
static cl::opt<bool>
|
|
DebugPM("debug-pass-manager", cl::Hidden,
|
|
cl::desc("Print pass management debugging information"));
|
|
|
|
bool llvm::runPassPipeline(StringRef Arg0, LLVMContext &Context, Module &M,
|
|
TargetMachine *TM, tool_output_file *Out,
|
|
StringRef PassPipeline, OutputKind OK,
|
|
VerifierKind VK) {
|
|
Passes P(TM);
|
|
|
|
FunctionAnalysisManager FAM(DebugPM);
|
|
CGSCCAnalysisManager CGAM(DebugPM);
|
|
ModuleAnalysisManager MAM(DebugPM);
|
|
|
|
// Register all the basic analyses with the managers.
|
|
P.registerModuleAnalyses(MAM);
|
|
P.registerCGSCCAnalyses(CGAM);
|
|
P.registerFunctionAnalyses(FAM);
|
|
|
|
// Cross register the analysis managers through their proxies.
|
|
MAM.registerPass(FunctionAnalysisManagerModuleProxy(FAM));
|
|
MAM.registerPass(CGSCCAnalysisManagerModuleProxy(CGAM));
|
|
CGAM.registerPass(FunctionAnalysisManagerCGSCCProxy(FAM));
|
|
CGAM.registerPass(ModuleAnalysisManagerCGSCCProxy(MAM));
|
|
FAM.registerPass(CGSCCAnalysisManagerFunctionProxy(CGAM));
|
|
FAM.registerPass(ModuleAnalysisManagerFunctionProxy(MAM));
|
|
|
|
ModulePassManager MPM(DebugPM);
|
|
if (VK > VK_NoVerifier)
|
|
MPM.addPass(VerifierPass());
|
|
|
|
if (!P.parsePassPipeline(MPM, PassPipeline, VK == VK_VerifyEachPass,
|
|
DebugPM)) {
|
|
errs() << Arg0 << ": unable to parse pass pipeline description.\n";
|
|
return false;
|
|
}
|
|
|
|
if (VK > VK_NoVerifier)
|
|
MPM.addPass(VerifierPass());
|
|
|
|
// Add any relevant output pass at the end of the pipeline.
|
|
switch (OK) {
|
|
case OK_NoOutput:
|
|
break; // No output pass needed.
|
|
case OK_OutputAssembly:
|
|
MPM.addPass(PrintModulePass(Out->os()));
|
|
break;
|
|
case OK_OutputBitcode:
|
|
MPM.addPass(BitcodeWriterPass(Out->os()));
|
|
break;
|
|
}
|
|
|
|
// Before executing passes, print the final values of the LLVM options.
|
|
cl::PrintOptionValues();
|
|
|
|
// Now that we have all of the passes ready, run them.
|
|
MPM.run(M, &MAM);
|
|
|
|
// Declare success.
|
|
if (OK != OK_NoOutput)
|
|
Out->keep();
|
|
return true;
|
|
}
|