1 //===-- SystemZSubtarget.h - SystemZ subtarget information -----*- 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 // This file declares the SystemZ specific subclass of TargetSubtargetInfo. 10 // 11 //===----------------------------------------------------------------------===// 12 13 #ifndef LLVM_LIB_TARGET_SYSTEMZ_SYSTEMZSUBTARGET_H 14 #define LLVM_LIB_TARGET_SYSTEMZ_SYSTEMZSUBTARGET_H 15 16 #include "SystemZFrameLowering.h" 17 #include "SystemZISelLowering.h" 18 #include "SystemZInstrInfo.h" 19 #include "SystemZRegisterInfo.h" 20 #include "SystemZSelectionDAGInfo.h" 21 #include "llvm/CodeGen/TargetSubtargetInfo.h" 22 #include "llvm/IR/DataLayout.h" 23 #include "llvm/TargetParser/Triple.h" 24 #include <string> 25 26 #define GET_SUBTARGETINFO_HEADER 27 #include "SystemZGenSubtargetInfo.inc" 28 29 namespace llvm { 30 class GlobalValue; 31 class StringRef; 32 33 class SystemZSubtarget : public SystemZGenSubtargetInfo { 34 virtual void anchor(); 35 protected: 36 // Bool members corresponding to the SubtargetFeatures defined in tablegen. 37 #define GET_SUBTARGETINFO_MACRO(ATTRIBUTE, DEFAULT, GETTER) \ 38 bool ATTRIBUTE = DEFAULT; 39 #include "SystemZGenSubtargetInfo.inc" 40 41 private: 42 Triple TargetTriple; 43 std::unique_ptr<SystemZCallingConventionRegisters> SpecialRegisters; 44 SystemZInstrInfo InstrInfo; 45 SystemZTargetLowering TLInfo; 46 SystemZSelectionDAGInfo TSInfo; 47 std::unique_ptr<const SystemZFrameLowering> FrameLowering; 48 49 SystemZSubtarget &initializeSubtargetDependencies(StringRef CPU, 50 StringRef TuneCPU, 51 StringRef FS); 52 SystemZCallingConventionRegisters *initializeSpecialRegisters(); 53 54 public: 55 SystemZSubtarget(const Triple &TT, const std::string &CPU, 56 const std::string &TuneCPU, const std::string &FS, 57 const TargetMachine &TM); 58 59 SystemZCallingConventionRegisters *getSpecialRegisters() const { 60 assert(SpecialRegisters && "Unsupported SystemZ calling convention"); 61 return SpecialRegisters.get(); 62 } 63 64 template <class SR> SR &getSpecialRegisters() const { 65 return *static_cast<SR *>(getSpecialRegisters()); 66 } 67 68 const TargetFrameLowering *getFrameLowering() const override { 69 return FrameLowering.get(); 70 } 71 72 template <class TFL> const TFL *getFrameLowering() const { 73 return static_cast<const TFL *>(getFrameLowering()); 74 } 75 76 const SystemZInstrInfo *getInstrInfo() const override { return &InstrInfo; } 77 const SystemZRegisterInfo *getRegisterInfo() const override { 78 return &InstrInfo.getRegisterInfo(); 79 } 80 const SystemZTargetLowering *getTargetLowering() const override { 81 return &TLInfo; 82 } 83 const SelectionDAGTargetInfo *getSelectionDAGInfo() const override { 84 return &TSInfo; 85 } 86 87 // True if the subtarget should run MachineScheduler after aggressive 88 // coalescing. This currently replaces the SelectionDAG scheduler with the 89 // "source" order scheduler. 90 bool enableMachineScheduler() const override { return true; } 91 92 // This is important for reducing register pressure in vector code. 93 bool useAA() const override { return true; } 94 95 // Always enable the early if-conversion pass. 96 bool enableEarlyIfConversion() const override { return true; } 97 98 // Enable tracking of subregister liveness in register allocator. 99 bool enableSubRegLiveness() const override; 100 101 // Automatically generated by tblgen. 102 void ParseSubtargetFeatures(StringRef CPU, StringRef TuneCPU, StringRef FS); 103 104 // Getters for SubtargetFeatures defined in tablegen. 105 #define GET_SUBTARGETINFO_MACRO(ATTRIBUTE, DEFAULT, GETTER) \ 106 bool GETTER() const { return ATTRIBUTE; } 107 #include "SystemZGenSubtargetInfo.inc" 108 109 bool isAddressedViaADA(const GlobalValue *GV) const; 110 111 // Return true if GV can be accessed using LARL for reloc model RM 112 // and code model CM. 113 bool isPC32DBLSymbol(const GlobalValue *GV, CodeModel::Model CM) const; 114 115 bool isTargetELF() const { return TargetTriple.isOSBinFormatELF(); } 116 117 // Returns TRUE if we are generating GOFF object code 118 bool isTargetGOFF() const { return TargetTriple.isOSBinFormatGOFF(); } 119 120 // Returns TRUE if we are using XPLINK64 linkage convention 121 bool isTargetXPLINK64() const { return (isTargetGOFF() && isTargetzOS()); } 122 123 // Returns TRUE if we are generating code for a s390x machine running zOS 124 bool isTargetzOS() const { return TargetTriple.isOSzOS(); } 125 }; 126 } // end namespace llvm 127 128 #endif 129