1//===----------------------------------------------------------------------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8
9#include "MSP430.h"
10#include "MSP430AsmPrinter.h"
11#include "MSP430TargetMachine.h"
12
13#include "llvm/CodeGen/AtomicExpand.h"
14#include "llvm/IR/PassInstrumentation.h"
15#include "llvm/MC/MCStreamer.h"
16#include "llvm/Passes/CodeGenPassBuilder.h"
17#include "llvm/Passes/PassBuilder.h"
18#include "llvm/Target/CGPassBuilderOption.h"
19
20using namespace llvm;
21
22namespace {
23
24class MSP430CodeGenPassBuilder
25 : public CodeGenPassBuilder<MSP430CodeGenPassBuilder, MSP430TargetMachine> {
26 using Base =
27 CodeGenPassBuilder<MSP430CodeGenPassBuilder, MSP430TargetMachine>;
28
29public:
30 explicit MSP430CodeGenPassBuilder(MSP430TargetMachine &TM,
31 const CGPassBuilderOption &Opts,
32 PassInstrumentationCallbacks *PIC)
33 : CodeGenPassBuilder(TM, Opts, PIC) {}
34
35 void addIRPasses(PassManagerWrapper &PMW) const;
36 Error addInstSelector(PassManagerWrapper &PMW) const;
37 void addPreEmitPass(PassManagerWrapper &PMW) const;
38 void addAsmPrinterBegin(PassManagerWrapper &PMW) const;
39 void addAsmPrinter(PassManagerWrapper &PMW) const;
40 void addAsmPrinterEnd(PassManagerWrapper &PMW) const;
41};
42
43void MSP430CodeGenPassBuilder::addIRPasses(PassManagerWrapper &PMW) const {
44 addFunctionPass(Pass: AtomicExpandPass(TM), PMW);
45
46 Base::addIRPasses(PMW);
47}
48
49Error MSP430CodeGenPassBuilder::addInstSelector(PassManagerWrapper &PMW) const {
50 addMachineFunctionPass(Pass: MSP430ISelDAGToDAGPass(TM, getOptLevel()), PMW);
51 return Error::success();
52}
53
54void MSP430CodeGenPassBuilder::addPreEmitPass(PassManagerWrapper &PMW) const {
55 addMachineFunctionPass(Pass: MSP430BranchSelectPass(), PMW);
56}
57
58void MSP430CodeGenPassBuilder::addAsmPrinterBegin(
59 PassManagerWrapper &PMW) const {
60 addModulePass(Pass: MSP430AsmPrinterBeginPass(), PMW, /*Force=*/true);
61}
62
63void MSP430CodeGenPassBuilder::addAsmPrinter(PassManagerWrapper &PMW) const {
64 addMachineFunctionPass(Pass: MSP430AsmPrinterPass(), PMW);
65}
66
67void MSP430CodeGenPassBuilder::addAsmPrinterEnd(PassManagerWrapper &PMW) const {
68 addModulePass(Pass: MSP430AsmPrinterEndPass(), PMW);
69}
70
71} // namespace
72
73void MSP430TargetMachine::registerPassBuilderCallbacks(PassBuilder &PB){
74#define GET_PASS_REGISTRY "MSP430PassRegistry.def"
75#include "llvm/Passes/TargetPassRegistry.inc"
76}
77
78Error MSP430TargetMachine::buildCodeGenPipeline(
79 ModulePassManager &MPM, ModuleAnalysisManager &MAM, raw_pwrite_stream &Out,
80 raw_pwrite_stream *DwoOut, CodeGenFileType FileType,
81 const CGPassBuilderOption &Opt, MCContext &Ctx,
82 PassInstrumentationCallbacks *PIC) {
83 auto CGPB = MSP430CodeGenPassBuilder(*this, Opt, PIC);
84 return CGPB.buildPipeline(MPM, MAM, Out, DwoOut, FileType, Ctx);
85}
86