[ORC] Add std::tuple support to SimplePackedSerialization.
[llvm-project.git] / llvm / lib / Target / M68k / M68kSubtarget.h
blobf45cb7edca1f7ab41a6b180f673b0d9b8c147803
1 //===-- M68kSubtarget.h - Define Subtarget for the M68k -----*- 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 declares the M68k specific subclass of TargetSubtargetInfo.
11 ///
12 //===----------------------------------------------------------------------===//
14 #ifndef LLVM_LIB_TARGET_CPU0_M68KSUBTARGET_H
15 #define LLVM_LIB_TARGET_CPU0_M68KSUBTARGET_H
17 #include "M68kFrameLowering.h"
18 #include "M68kISelLowering.h"
19 #include "M68kInstrInfo.h"
21 #include "llvm/ADT/BitVector.h"
22 #include "llvm/CodeGen/GlobalISel/CallLowering.h"
23 #include "llvm/CodeGen/GlobalISel/InstructionSelector.h"
24 #include "llvm/CodeGen/GlobalISel/LegalizerInfo.h"
25 #include "llvm/CodeGen/GlobalISel/RegisterBankInfo.h"
26 #include "llvm/CodeGen/SelectionDAGTargetInfo.h"
27 #include "llvm/CodeGen/TargetSubtargetInfo.h"
28 #include "llvm/IR/DataLayout.h"
29 #include "llvm/MC/MCInstrItineraries.h"
30 #include "llvm/Support/Alignment.h"
32 #include <string>
34 #define GET_SUBTARGETINFO_HEADER
35 #include "M68kGenSubtargetInfo.inc"
37 extern bool M68kReserveGP;
38 extern bool M68kNoCpload;
40 namespace llvm {
41 class StringRef;
43 class M68kTargetMachine;
45 class M68kSubtarget : public M68kGenSubtargetInfo {
46 virtual void anchor();
48 protected:
49 // These define which ISA is supported. Since each Motorola M68k ISA is
50 // built on top of the previous one whenever an ISA is selected the previous
51 // selected as well.
52 enum SubtargetEnum { M00, M10, M20, M30, M40, M60 };
53 SubtargetEnum SubtargetKind = M00;
55 BitVector UserReservedRegister;
57 InstrItineraryData InstrItins;
59 /// Small section is used.
60 bool UseSmallSection = true;
62 const M68kTargetMachine &TM;
64 SelectionDAGTargetInfo TSInfo;
65 M68kInstrInfo InstrInfo;
66 M68kFrameLowering FrameLowering;
67 M68kTargetLowering TLInfo;
69 /// The minimum alignment known to hold of the stack frame on
70 /// entry to the function and which must be maintained by every function.
71 unsigned stackAlignment = 8;
73 Triple TargetTriple;
75 public:
76 /// This constructor initializes the data members to match that
77 /// of the specified triple.
78 M68kSubtarget(const Triple &TT, StringRef CPU, StringRef FS,
79 const M68kTargetMachine &_TM);
81 /// Parses features string setting specified subtarget options. Definition
82 /// of function is auto generated by tblgen.
83 void ParseSubtargetFeatures(StringRef CPU, StringRef TuneCPU, StringRef FS);
85 bool atLeastM68000() const { return SubtargetKind >= M00; }
86 bool atLeastM68010() const { return SubtargetKind >= M10; }
87 bool atLeastM68020() const { return SubtargetKind >= M20; }
88 bool atLeastM68030() const { return SubtargetKind >= M30; }
89 bool atLeastM68040() const { return SubtargetKind >= M40; }
90 bool atLeastM68060() const { return SubtargetKind >= M60; }
92 bool useSmallSection() const { return UseSmallSection; }
94 bool abiUsesSoftFloat() const;
96 const Triple &getTargetTriple() const { return TargetTriple; }
98 bool isTargetELF() const { return TargetTriple.isOSBinFormatELF(); }
100 /// Return true if the subtarget allows calls to immediate address.
101 bool isLegalToCallImmediateAddr() const;
103 bool isPositionIndependent() const;
105 bool isRegisterReservedByUser(Register R) const {
106 assert(R < M68k::NUM_TARGET_REGS && "Register out of range");
107 return UserReservedRegister[R];
110 /// Classify a global variable reference for the current subtarget according
111 /// to how we should reference it in a non-pcrel context.
112 unsigned char classifyLocalReference(const GlobalValue *GV) const;
114 /// Classify a global variable reference for the current subtarget according
115 /// to how we should reference it in a non-pcrel context.
116 unsigned char classifyGlobalReference(const GlobalValue *GV,
117 const Module &M) const;
118 unsigned char classifyGlobalReference(const GlobalValue *GV) const;
120 /// Classify a external variable reference for the current subtarget according
121 /// to how we should reference it in a non-pcrel context.
122 unsigned char classifyExternalReference(const Module &M) const;
124 /// Classify a global function reference for the current subtarget.
125 unsigned char classifyGlobalFunctionReference(const GlobalValue *GV,
126 const Module &M) const;
127 unsigned char classifyGlobalFunctionReference(const GlobalValue *GV) const;
129 /// Classify a blockaddress reference for the current subtarget according to
130 /// how we should reference it in a non-pcrel context.
131 unsigned char classifyBlockAddressReference() const;
133 unsigned getJumpTableEncoding() const;
135 /// TODO this must be controlled by options like -malign-int and -mshort
136 Align getStackAlignment() const { return Align(stackAlignment); }
138 /// getSlotSize - Stack slot size in bytes.
139 unsigned getSlotSize() const { return 4; }
141 M68kSubtarget &initializeSubtargetDependencies(StringRef CPU, Triple TT,
142 StringRef FS,
143 const M68kTargetMachine &TM);
145 const SelectionDAGTargetInfo *getSelectionDAGInfo() const override {
146 return &TSInfo;
149 const M68kInstrInfo *getInstrInfo() const override { return &InstrInfo; }
151 const M68kFrameLowering *getFrameLowering() const override {
152 return &FrameLowering;
155 const M68kRegisterInfo *getRegisterInfo() const override {
156 return &InstrInfo.getRegisterInfo();
159 const M68kTargetLowering *getTargetLowering() const override {
160 return &TLInfo;
163 const InstrItineraryData *getInstrItineraryData() const override {
164 return &InstrItins;
167 protected:
168 // GlobalISel related APIs.
169 std::unique_ptr<CallLowering> CallLoweringInfo;
170 std::unique_ptr<InstructionSelector> InstSelector;
171 std::unique_ptr<LegalizerInfo> Legalizer;
172 std::unique_ptr<RegisterBankInfo> RegBankInfo;
174 public:
175 const CallLowering *getCallLowering() const override;
176 InstructionSelector *getInstructionSelector() const override;
177 const LegalizerInfo *getLegalizerInfo() const override;
178 const RegisterBankInfo *getRegBankInfo() const override;
180 } // namespace llvm
182 #endif