13dac3a9bSDimitry Andric // WebAssemblyTargetMachine.h - Define TargetMachine for WebAssembly -*- C++ -*-
23dac3a9bSDimitry Andric //
33dac3a9bSDimitry Andric //                     The LLVM Compiler Infrastructure
43dac3a9bSDimitry Andric //
53dac3a9bSDimitry Andric // This file is distributed under the University of Illinois Open Source
63dac3a9bSDimitry Andric // License. See LICENSE.TXT for details.
73dac3a9bSDimitry Andric //
83dac3a9bSDimitry Andric //===----------------------------------------------------------------------===//
93dac3a9bSDimitry Andric ///
103dac3a9bSDimitry Andric /// \file
11*4ba319b5SDimitry Andric /// This file declares the WebAssembly-specific subclass of
123dac3a9bSDimitry Andric /// TargetMachine.
133dac3a9bSDimitry Andric ///
143dac3a9bSDimitry Andric //===----------------------------------------------------------------------===//
153dac3a9bSDimitry Andric 
163dac3a9bSDimitry Andric #ifndef LLVM_LIB_TARGET_WEBASSEMBLY_WEBASSEMBLYTARGETMACHINE_H
173dac3a9bSDimitry Andric #define LLVM_LIB_TARGET_WEBASSEMBLY_WEBASSEMBLYTARGETMACHINE_H
183dac3a9bSDimitry Andric 
193dac3a9bSDimitry Andric #include "WebAssemblySubtarget.h"
203dac3a9bSDimitry Andric #include "llvm/Target/TargetMachine.h"
213dac3a9bSDimitry Andric 
223dac3a9bSDimitry Andric namespace llvm {
233dac3a9bSDimitry Andric 
243dac3a9bSDimitry Andric class WebAssemblyTargetMachine final : public LLVMTargetMachine {
253dac3a9bSDimitry Andric   std::unique_ptr<TargetLoweringObjectFile> TLOF;
263dac3a9bSDimitry Andric   mutable StringMap<std::unique_ptr<WebAssemblySubtarget>> SubtargetMap;
273dac3a9bSDimitry Andric 
283dac3a9bSDimitry Andric public:
293dac3a9bSDimitry Andric   WebAssemblyTargetMachine(const Target &T, const Triple &TT, StringRef CPU,
303dac3a9bSDimitry Andric                            StringRef FS, const TargetOptions &Options,
312cab237bSDimitry Andric                            Optional<Reloc::Model> RM,
322cab237bSDimitry Andric                            Optional<CodeModel::Model> CM, CodeGenOpt::Level OL,
332cab237bSDimitry Andric                            bool JIT);
343dac3a9bSDimitry Andric 
353dac3a9bSDimitry Andric   ~WebAssemblyTargetMachine() override;
363dac3a9bSDimitry Andric   const WebAssemblySubtarget *
373dac3a9bSDimitry Andric   getSubtargetImpl(const Function &F) const override;
383dac3a9bSDimitry Andric 
393dac3a9bSDimitry Andric   // Pass Pipeline Configuration
403dac3a9bSDimitry Andric   TargetPassConfig *createPassConfig(PassManagerBase &PM) override;
413dac3a9bSDimitry Andric 
getObjFileLowering()423dac3a9bSDimitry Andric   TargetLoweringObjectFile *getObjFileLowering() const override {
433dac3a9bSDimitry Andric     return TLOF.get();
443dac3a9bSDimitry Andric   }
453dac3a9bSDimitry Andric 
46da09e106SDimitry Andric   TargetTransformInfo getTargetTransformInfo(const Function &F) override;
473ca95b02SDimitry Andric 
usesPhysRegsForPEI()483ca95b02SDimitry Andric   bool usesPhysRegsForPEI() const override { return false; }
493dac3a9bSDimitry Andric };
503dac3a9bSDimitry Andric 
513dac3a9bSDimitry Andric } // end namespace llvm
523dac3a9bSDimitry Andric 
533dac3a9bSDimitry Andric #endif
54