LLVM 24.0.0git
M68kTargetMachine.cpp
Go to the documentation of this file.
1//===-- M68kTargetMachine.cpp - M68k Target Machine -------------*- C++ -*-===//
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/// \file
10/// This file contains implementation for M68k target machine.
11///
12//===----------------------------------------------------------------------===//
13
14#include "M68kTargetMachine.h"
15#include "M68k.h"
16#include "M68kMachineFunction.h"
17#include "M68kSubtarget.h"
24#include "llvm/CodeGen/Passes.h"
29#include "llvm/PassRegistry.h"
30#include <memory>
31#include <optional>
32
33using namespace llvm;
34
35#define DEBUG_TYPE "m68k"
36
48
49namespace {
50
51Reloc::Model getEffectiveRelocModel(std::optional<Reloc::Model> RM) {
52 // If not defined we default to static
53 return RM.value_or(Reloc::Static);
54}
55
56CodeModel::Model getEffectiveCodeModel(std::optional<CodeModel::Model> CM,
57 bool JIT) {
58 if (!CM) {
59 return CodeModel::Small;
60 } else if (CM == CodeModel::Kernel) {
61 llvm_unreachable("Kernel code model is not implemented yet");
62 }
63 return CM.value();
64}
65} // end anonymous namespace
66
68 StringRef CPU, StringRef FS,
70 std::optional<Reloc::Model> RM,
71 std::optional<CodeModel::Model> CM,
72 CodeGenOptLevel OL, bool JIT)
73 : CodeGenTargetMachineImpl(T, TT, CPU, FS, Options,
75 ::getEffectiveCodeModel(CM, JIT), OL),
76 CLOpts(cl::LibraryOptionsContext::get<M68kOptions>(
77 Options.MCOptions.LibraryOptions)),
78 TLOF(std::make_unique<M68kELFTargetObjectFile>()),
79 Subtarget(TT, CPU, FS, *this) {
81}
82
84
85const M68kSubtarget *
87 Attribute CPUAttr = F.getFnAttribute("target-cpu");
88 Attribute FSAttr = F.getFnAttribute("target-features");
89
90 auto CPU = CPUAttr.isValid() ? CPUAttr.getValueAsString().str() : TargetCPU;
91 auto FS = FSAttr.isValid() ? FSAttr.getValueAsString().str() : TargetFS;
92
93 auto &I = SubtargetMap[CPU + FS];
94 if (!I)
95 I = std::make_unique<M68kSubtarget>(TargetTriple, CPU, FS, *this);
96 return I.get();
97}
98
105
106//===----------------------------------------------------------------------===//
107// Pass Pipeline Configuration
108//===----------------------------------------------------------------------===//
109
110namespace {
111class M68kPassConfig : public TargetPassConfig {
112public:
113 M68kPassConfig(M68kTargetMachine &TM, PassManagerBase &PM)
114 : TargetPassConfig(TM, PM) {}
115
116 M68kTargetMachine &getM68kTargetMachine() const {
118 }
119
120 const M68kSubtarget &getM68kSubtarget() const {
121 return *getM68kTargetMachine().getSubtargetImpl();
122 }
123 void addIRPasses() override;
124 bool addIRTranslator() override;
125 bool addLegalizeMachineIR() override;
126 bool addRegBankSelect() override;
127 bool addGlobalInstructionSelect() override;
128 bool addInstSelector() override;
129 void addPreSched2() override;
130 void addPreEmitPass() override;
131};
132} // namespace
133
135 return new M68kPassConfig(*this, PM);
136}
137
138void M68kPassConfig::addIRPasses() {
141}
142
143bool M68kPassConfig::addInstSelector() {
144 // Install an instruction selector.
145 addPass(createM68kISelDag(getM68kTargetMachine()));
147 return false;
148}
149
150bool M68kPassConfig::addIRTranslator() {
151 addPass(new IRTranslatorLegacy());
152 return false;
153}
154
155bool M68kPassConfig::addLegalizeMachineIR() {
156 addPass(new LegalizerLegacy());
157 return false;
158}
159
160bool M68kPassConfig::addRegBankSelect() {
161 addPass(new RegBankSelectLegacy());
162 return false;
163}
164
165bool M68kPassConfig::addGlobalInstructionSelect() {
166 addPass(new InstructionSelectLegacy(getOptLevel()));
167 return false;
168}
169
170void M68kPassConfig::addPreSched2() { addPass(createM68kExpandPseudoPass()); }
171
172void M68kPassConfig::addPreEmitPass() {
174}
static Reloc::Model getEffectiveRelocModel()
#define X(NUM, ENUM, NAME)
Definition ELF.h:665
#define LLVM_EXTERNAL_VISIBILITY
Definition Compiler.h:132
This file declares the IRTranslator pass.
This file declares the M68k specific subclass of MachineFunctionInfo.
This file declares the M68k specific subclass of TargetSubtargetInfo.
LLVM_EXTERNAL_VISIBILITY void LLVMInitializeM68kTarget()
This file declares the M68k specific subclass of TargetMachine.
This file contains declarations for M68k ELF object file lowering.
This file contains the entry points for global functions defined in the M68k target library,...
#define F(x, y, z)
Definition MD5.cpp:54
#define I(x, y, z)
Definition MD5.cpp:57
#define T
This file describes the interface of the MachineFunctionPass responsible for assigning the generic vi...
const GCNTargetMachine & getTM(const GCNSubtarget *STI)
Target-Independent Code Generator Pass Configuration Options pass.
Functions, function parameters, and return types can have attributes to indicate how they should be t...
Definition Attributes.h:106
LLVM_ABI StringRef getValueAsString() const
Return the attribute's value as a string.
bool isValid() const
Return true if the attribute is any kind of attribute.
Definition Attributes.h:262
CodeGenTargetMachineImpl(const Target &T, const Triple &TT, StringRef CPU, StringRef FS, const TargetOptions &Options, Reloc::Model RM, CodeModel::Model CM, CodeGenOptLevel OL)
This pass is responsible for selecting generic machine instructions to target-specific instructions.
const M68kSubtarget * getSubtargetImpl() const
MachineFunctionInfo * createMachineFunctionInfo(BumpPtrAllocator &Allocator, const Function &F, const TargetSubtargetInfo *STI) const override
Create the target's instance of MachineFunctionInfo.
M68kTargetMachine(const Target &T, const Triple &TT, StringRef CPU, StringRef FS, const TargetOptions &Options, std::optional< Reloc::Model > RM, std::optional< CodeModel::Model > CM, CodeGenOptLevel OL, bool JIT)
TargetPassConfig * createPassConfig(PassManagerBase &PM) override
Create a pass configuration object to be used by addPassToEmitX methods for generating a pipeline of ...
static LLVM_ABI PassRegistry * getPassRegistry()
getPassRegistry - Access the global registry object, which is automatically initialized at applicatio...
This pass implements the reg bank selector pass used in the GlobalISel pipeline.
Represent a constant reference to a string, i.e.
Definition StringRef.h:56
std::string str() const
Get the contents as an std::string.
Definition StringRef.h:222
Triple TargetTriple
Triple string, CPU name, and target feature strings the TargetMachine instance is created with.
std::unique_ptr< const MCSubtargetInfo > STI
TargetOptions Options
Target-Independent Code Generator Pass Configuration Options.
virtual void addIRPasses()
Add common target configurable passes that perform LLVM IR to IR transforms following machine indepen...
TargetSubtargetInfo - Generic base class for all target subtargets.
Target - Wrapper for Target specific information.
Triple - Helper class for working with autoconf configuration names.
Definition Triple.h:48
PassManagerBase - An abstract interface to allow code to add passes to a pass manager without having ...
Registers T::Global with cl::ParseCommandLineOptions.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
This namespace contains all of the command line option processing machinery.
This is an optimization pass for GlobalISel generic memory operations.
void initializeM68kGlobalBaseRegPass(PassRegistry &)
void initializeM68kExpandPseudoPass(PassRegistry &)
void initializeM68kCollapseMOVEMPass(PassRegistry &)
FunctionPass * createM68kGlobalBaseRegPass()
This pass initializes a global base register for PIC on M68k.
static Reloc::Model getEffectiveRelocModel(std::optional< Reloc::Model > RM)
CodeModel::Model getEffectiveCodeModel(std::optional< CodeModel::Model > CM, CodeModel::Model Default)
Helper method for getting the code model, returning Default if CM does not have a value.
FunctionPass * createM68kCollapseMOVEMPass()
Finds sequential MOVEM instruction and collapse them into a single one.
decltype(auto) get(const PointerIntPair< PointerTy, IntBits, IntType, PtrTraits, Info > &Pair)
FunctionPass * createM68kISelDag(M68kTargetMachine &TM)
This pass converts a legalized DAG into a M68k-specific DAG, ready for instruction scheduling.
CodeGenOptLevel
Code generation optimization level.
Definition CodeGen.h:280
void initializeM68kDAGToDAGISelLegacyPass(PassRegistry &)
LLVM_ABI void initializeGlobalISel(PassRegistry &)
Initialize all passes linked into the GlobalISel library.
Target & getTheM68kTarget()
FunctionPass * createM68kExpandPseudoPass()
Return a Machine IR pass that expands M68k-specific pseudo instructions into a sequence of actual ins...
LLVM_ABI FunctionPass * createAtomicExpandLegacyPass()
AtomicExpandPass - At IR level this pass replace atomic instructions with __atomic_* library calls,...
BumpPtrAllocatorImpl<> BumpPtrAllocator
The standard BumpPtrAllocator which just uses the default template parameters.
Definition Allocator.h:391
void initializeM68kAsmPrinterPass(PassRegistry &)
Implement std::hash so that hash_code can be used in STL containers.
Definition BitVector.h:879
MachineFunctionInfo - This class can be derived from and used by targets to hold private target-speci...
static FuncInfoTy * create(BumpPtrAllocator &Allocator, const Function &F, const SubtargetTy *STI)
Factory function: default behavior is to call new using the supplied allocator.
RegisterTargetMachine - Helper template for registering a target machine implementation,...