1 //=- WebAssemblySubtarget.h - Define Subtarget for the WebAssembly -*- C++ -*-// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 /// 10 /// \file 11 /// This file declares the WebAssembly-specific subclass of 12 /// TargetSubtarget. 13 /// 14 //===----------------------------------------------------------------------===// 15 16 #ifndef LLVM_LIB_TARGET_WEBASSEMBLY_WEBASSEMBLYSUBTARGET_H 17 #define LLVM_LIB_TARGET_WEBASSEMBLY_WEBASSEMBLYSUBTARGET_H 18 19 #include "WebAssemblyFrameLowering.h" 20 #include "WebAssemblyISelLowering.h" 21 #include "WebAssemblyInstrInfo.h" 22 #include "WebAssemblySelectionDAGInfo.h" 23 #include "llvm/CodeGen/TargetSubtargetInfo.h" 24 #include <string> 25 26 #define GET_SUBTARGETINFO_HEADER 27 #include "WebAssemblyGenSubtargetInfo.inc" 28 29 namespace llvm { 30 31 class WebAssemblySubtarget final : public WebAssemblyGenSubtargetInfo { 32 enum SIMDEnum { 33 NoSIMD, 34 SIMD128, 35 UnimplementedSIMD128, 36 } SIMDLevel = NoSIMD; 37 38 bool HasAtomics = false; 39 bool HasNontrappingFPToInt = false; 40 bool HasSignExt = false; 41 bool HasExceptionHandling = false; 42 43 /// String name of used CPU. 44 std::string CPUString; 45 46 /// What processor and OS we're targeting. 47 Triple TargetTriple; 48 49 WebAssemblyFrameLowering FrameLowering; 50 WebAssemblyInstrInfo InstrInfo; 51 WebAssemblySelectionDAGInfo TSInfo; 52 WebAssemblyTargetLowering TLInfo; 53 54 /// Initializes using CPUString and the passed in feature string so that we 55 /// can use initializer lists for subtarget initialization. 56 WebAssemblySubtarget &initializeSubtargetDependencies(StringRef FS); 57 58 public: 59 /// This constructor initializes the data members to match that 60 /// of the specified triple. 61 WebAssemblySubtarget(const Triple &TT, const std::string &CPU, 62 const std::string &FS, const TargetMachine &TM); 63 getSelectionDAGInfo()64 const WebAssemblySelectionDAGInfo *getSelectionDAGInfo() const override { 65 return &TSInfo; 66 } getFrameLowering()67 const WebAssemblyFrameLowering *getFrameLowering() const override { 68 return &FrameLowering; 69 } getTargetLowering()70 const WebAssemblyTargetLowering *getTargetLowering() const override { 71 return &TLInfo; 72 } getInstrInfo()73 const WebAssemblyInstrInfo *getInstrInfo() const override { 74 return &InstrInfo; 75 } getRegisterInfo()76 const WebAssemblyRegisterInfo *getRegisterInfo() const override { 77 return &getInstrInfo()->getRegisterInfo(); 78 } getTargetTriple()79 const Triple &getTargetTriple() const { return TargetTriple; } 80 bool enableMachineScheduler() const override; 81 bool useAA() const override; 82 83 // Predicates used by WebAssemblyInstrInfo.td. hasAddr64()84 bool hasAddr64() const { return TargetTriple.isArch64Bit(); } hasSIMD128()85 bool hasSIMD128() const { return SIMDLevel >= SIMD128; } hasUnimplementedSIMD128()86 bool hasUnimplementedSIMD128() const { 87 return SIMDLevel >= UnimplementedSIMD128; 88 } hasAtomics()89 bool hasAtomics() const { return HasAtomics; } hasNontrappingFPToInt()90 bool hasNontrappingFPToInt() const { return HasNontrappingFPToInt; } hasSignExt()91 bool hasSignExt() const { return HasSignExt; } hasExceptionHandling()92 bool hasExceptionHandling() const { return HasExceptionHandling; } 93 94 /// Parses features string setting specified subtarget options. Definition of 95 /// function is auto generated by tblgen. 96 void ParseSubtargetFeatures(StringRef CPU, StringRef FS); 97 }; 98 99 } // end namespace llvm 100 101 #endif 102