1//=- WebAssemblySubtarget.h - Define Subtarget for the WebAssembly -*- 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 WebAssembly-specific subclass of 11/// TargetSubtarget. 12/// 13//===----------------------------------------------------------------------===// 14 15#ifndef LLVM_LIB_TARGET_WEBASSEMBLY_WEBASSEMBLYSUBTARGET_H 16#define LLVM_LIB_TARGET_WEBASSEMBLY_WEBASSEMBLYSUBTARGET_H 17 18#include "WebAssemblyFrameLowering.h" 19#include "WebAssemblyISelLowering.h" 20#include "WebAssemblyInstrInfo.h" 21#include "WebAssemblySelectionDAGInfo.h" 22#include "llvm/CodeGen/TargetSubtargetInfo.h" 23#include <string> 24 25#define GET_SUBTARGETINFO_ENUM 26#define GET_SUBTARGETINFO_HEADER 27#include "WebAssemblyGenSubtargetInfo.inc" 28 29namespace llvm { 30 31// Defined in WebAssemblyGenSubtargetInfo.inc. 32extern const SubtargetFeatureKV 33 WebAssemblyFeatureKV[WebAssembly::NumSubtargetFeatures]; 34 35class WebAssemblySubtarget final : public WebAssemblyGenSubtargetInfo { 36 enum SIMDEnum { 37 NoSIMD, 38 SIMD128, 39 UnimplementedSIMD128, 40 } SIMDLevel = NoSIMD; 41 42 bool HasAtomics = false; 43 bool HasNontrappingFPToInt = false; 44 bool HasSignExt = false; 45 bool HasExceptionHandling = false; 46 bool HasBulkMemory = false; 47 bool HasMultivalue = false; 48 bool HasMutableGlobals = false; 49 bool HasTailCall = false; 50 51 /// String name of used CPU. 52 std::string CPUString; 53 54 /// What processor and OS we're targeting. 55 Triple TargetTriple; 56 57 WebAssemblyFrameLowering FrameLowering; 58 WebAssemblyInstrInfo InstrInfo; 59 WebAssemblySelectionDAGInfo TSInfo; 60 WebAssemblyTargetLowering TLInfo; 61 62 /// Initializes using CPUString and the passed in feature string so that we 63 /// can use initializer lists for subtarget initialization. 64 WebAssemblySubtarget &initializeSubtargetDependencies(StringRef FS); 65 66public: 67 /// This constructor initializes the data members to match that 68 /// of the specified triple. 69 WebAssemblySubtarget(const Triple &TT, const std::string &CPU, 70 const std::string &FS, const TargetMachine &TM); 71 72 const WebAssemblySelectionDAGInfo *getSelectionDAGInfo() const override { 73 return &TSInfo; 74 } 75 const WebAssemblyFrameLowering *getFrameLowering() const override { 76 return &FrameLowering; 77 } 78 const WebAssemblyTargetLowering *getTargetLowering() const override { 79 return &TLInfo; 80 } 81 const WebAssemblyInstrInfo *getInstrInfo() const override { 82 return &InstrInfo; 83 } 84 const WebAssemblyRegisterInfo *getRegisterInfo() const override { 85 return &getInstrInfo()->getRegisterInfo(); 86 } 87 const Triple &getTargetTriple() const { return TargetTriple; } 88 bool enableAtomicExpand() const override; 89 bool enableIndirectBrExpand() const override { return true; } 90 bool enableMachineScheduler() const override; 91 bool useAA() const override; 92 93 // Predicates used by WebAssemblyInstrInfo.td. 94 bool hasAddr64() const { return TargetTriple.isArch64Bit(); } 95 bool hasSIMD128() const { return SIMDLevel >= SIMD128; } 96 bool hasUnimplementedSIMD128() const { 97 return SIMDLevel >= UnimplementedSIMD128; 98 } 99 bool hasAtomics() const { return HasAtomics; } 100 bool hasNontrappingFPToInt() const { return HasNontrappingFPToInt; } 101 bool hasSignExt() const { return HasSignExt; } 102 bool hasExceptionHandling() const { return HasExceptionHandling; } 103 bool hasBulkMemory() const { return HasBulkMemory; } 104 bool hasMultivalue() const { return HasMultivalue; } 105 bool hasMutableGlobals() const { return HasMutableGlobals; } 106 bool hasTailCall() const { return HasTailCall; } 107 108 /// Parses features string setting specified subtarget options. Definition of 109 /// function is auto generated by tblgen. 110 void ParseSubtargetFeatures(StringRef CPU, StringRef FS); 111}; 112 113} // end namespace llvm 114 115#endif 116