144a14a6aSChris Bieneman //===- DirectXTargetMachine.cpp - DirectX Target Implementation -*- C++ -*-===//
244a14a6aSChris Bieneman //
344a14a6aSChris Bieneman // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
444a14a6aSChris Bieneman // See https://llvm.org/LICENSE.txt for license information.
544a14a6aSChris Bieneman // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
644a14a6aSChris Bieneman //
744a14a6aSChris Bieneman //===----------------------------------------------------------------------===//
844a14a6aSChris Bieneman ///
944a14a6aSChris Bieneman /// \file
1044a14a6aSChris Bieneman /// This file contains DirectX target initializer.
1144a14a6aSChris Bieneman ///
1244a14a6aSChris Bieneman //===----------------------------------------------------------------------===//
1344a14a6aSChris Bieneman 
1444a14a6aSChris Bieneman #include "DirectXTargetMachine.h"
15*6599fdabSChris Bieneman #include "DirectX.h"
1644a14a6aSChris Bieneman #include "DirectXSubtarget.h"
1744a14a6aSChris Bieneman #include "DirectXTargetTransformInfo.h"
1844a14a6aSChris Bieneman #include "TargetInfo/DirectXTargetInfo.h"
1944a14a6aSChris Bieneman #include "llvm/Bitcode/BitcodeWriterPass.h"
2044a14a6aSChris Bieneman #include "llvm/CodeGen/Passes.h"
2144a14a6aSChris Bieneman #include "llvm/CodeGen/TargetPassConfig.h"
2244a14a6aSChris Bieneman #include "llvm/IR/IRPrintingPasses.h"
2344a14a6aSChris Bieneman #include "llvm/IR/LegacyPassManager.h"
2444a14a6aSChris Bieneman #include "llvm/MC/SectionKind.h"
2544a14a6aSChris Bieneman #include "llvm/MC/TargetRegistry.h"
2644a14a6aSChris Bieneman #include "llvm/Support/CodeGen.h"
2744a14a6aSChris Bieneman #include "llvm/Support/Compiler.h"
2844a14a6aSChris Bieneman #include "llvm/Support/ErrorHandling.h"
2944a14a6aSChris Bieneman #include "llvm/Target/TargetLoweringObjectFile.h"
3044a14a6aSChris Bieneman 
3144a14a6aSChris Bieneman using namespace llvm;
3244a14a6aSChris Bieneman 
3344a14a6aSChris Bieneman extern "C" LLVM_EXTERNAL_VISIBILITY void LLVMInitializeDirectXTarget() {
3444a14a6aSChris Bieneman   RegisterTargetMachine<DirectXTargetMachine> X(getTheDirectXTarget());
35*6599fdabSChris Bieneman   auto *PR = PassRegistry::getPassRegistry();
36*6599fdabSChris Bieneman   initializeDXILPrepareModulePass(*PR);
3744a14a6aSChris Bieneman }
3844a14a6aSChris Bieneman 
3944a14a6aSChris Bieneman class DXILTargetObjectFile : public TargetLoweringObjectFile {
4044a14a6aSChris Bieneman public:
4144a14a6aSChris Bieneman   DXILTargetObjectFile() = default;
4244a14a6aSChris Bieneman 
4344a14a6aSChris Bieneman   MCSection *getExplicitSectionGlobal(const GlobalObject *GO, SectionKind Kind,
4444a14a6aSChris Bieneman                                       const TargetMachine &TM) const override {
4544a14a6aSChris Bieneman     llvm_unreachable("Not supported!");
4644a14a6aSChris Bieneman   }
4744a14a6aSChris Bieneman 
4844a14a6aSChris Bieneman protected:
4944a14a6aSChris Bieneman   MCSection *SelectSectionForGlobal(const GlobalObject *GO, SectionKind Kind,
5044a14a6aSChris Bieneman                                     const TargetMachine &TM) const override {
5144a14a6aSChris Bieneman     llvm_unreachable("Not supported!");
5244a14a6aSChris Bieneman   }
5344a14a6aSChris Bieneman };
5444a14a6aSChris Bieneman 
5544a14a6aSChris Bieneman class DirectXPassConfig : public TargetPassConfig {
5644a14a6aSChris Bieneman public:
5744a14a6aSChris Bieneman   DirectXPassConfig(DirectXTargetMachine &TM, PassManagerBase &PM)
5844a14a6aSChris Bieneman       : TargetPassConfig(TM, PM) {}
5944a14a6aSChris Bieneman 
6044a14a6aSChris Bieneman   DirectXTargetMachine &getDirectXTargetMachine() const {
6144a14a6aSChris Bieneman     return getTM<DirectXTargetMachine>();
6244a14a6aSChris Bieneman   }
6344a14a6aSChris Bieneman 
6444a14a6aSChris Bieneman   FunctionPass *createTargetRegisterAllocator(bool) override { return nullptr; }
6544a14a6aSChris Bieneman };
6644a14a6aSChris Bieneman 
6744a14a6aSChris Bieneman DirectXTargetMachine::DirectXTargetMachine(const Target &T, const Triple &TT,
6844a14a6aSChris Bieneman                                            StringRef CPU, StringRef FS,
6944a14a6aSChris Bieneman                                            const TargetOptions &Options,
7044a14a6aSChris Bieneman                                            Optional<Reloc::Model> RM,
7144a14a6aSChris Bieneman                                            Optional<CodeModel::Model> CM,
7244a14a6aSChris Bieneman                                            CodeGenOpt::Level OL, bool JIT)
7344a14a6aSChris Bieneman     : LLVMTargetMachine(T,
7444a14a6aSChris Bieneman                         "e-m:e-p:32:32-i1:32-i8:8-i16:16-i32:32-i64:64-f16:16-"
7544a14a6aSChris Bieneman                         "f32:32-f64:64-n8:16:32:64",
7644a14a6aSChris Bieneman                         TT, CPU, FS, Options, Reloc::Static, CodeModel::Small,
7744a14a6aSChris Bieneman                         OL),
7844a14a6aSChris Bieneman       TLOF(std::make_unique<DXILTargetObjectFile>()),
7944a14a6aSChris Bieneman       Subtarget(std::make_unique<DirectXSubtarget>(TT, CPU, FS, *this)) {}
8044a14a6aSChris Bieneman 
8144a14a6aSChris Bieneman DirectXTargetMachine::~DirectXTargetMachine() {}
8244a14a6aSChris Bieneman 
8344a14a6aSChris Bieneman bool DirectXTargetMachine::addPassesToEmitFile(
8444a14a6aSChris Bieneman     PassManagerBase &PM, raw_pwrite_stream &Out, raw_pwrite_stream *DwoOut,
8544a14a6aSChris Bieneman     CodeGenFileType FileType, bool DisableVerify,
8644a14a6aSChris Bieneman     MachineModuleInfoWrapperPass *MMIWP) {
87*6599fdabSChris Bieneman   PM.add(createDXILPrepareModulePass());
8844a14a6aSChris Bieneman   switch (FileType) {
8944a14a6aSChris Bieneman   case CGFT_AssemblyFile:
9044a14a6aSChris Bieneman     PM.add(createPrintModulePass(Out, "", true));
9144a14a6aSChris Bieneman     break;
9244a14a6aSChris Bieneman   case CGFT_ObjectFile:
9344a14a6aSChris Bieneman     // TODO: Write DXIL instead of bitcode
9444a14a6aSChris Bieneman     PM.add(createBitcodeWriterPass(Out, true, false, false));
9544a14a6aSChris Bieneman     break;
9644a14a6aSChris Bieneman   case CGFT_Null:
9744a14a6aSChris Bieneman     break;
9844a14a6aSChris Bieneman   }
9944a14a6aSChris Bieneman   return false;
10044a14a6aSChris Bieneman }
10144a14a6aSChris Bieneman 
10244a14a6aSChris Bieneman bool DirectXTargetMachine::addPassesToEmitMC(PassManagerBase &PM,
10344a14a6aSChris Bieneman                                              MCContext *&Ctx,
10444a14a6aSChris Bieneman                                              raw_pwrite_stream &Out,
10544a14a6aSChris Bieneman                                              bool DisableVerify) {
10644a14a6aSChris Bieneman   return true;
10744a14a6aSChris Bieneman }
10844a14a6aSChris Bieneman 
10944a14a6aSChris Bieneman TargetPassConfig *DirectXTargetMachine::createPassConfig(PassManagerBase &PM) {
11044a14a6aSChris Bieneman   return new DirectXPassConfig(*this, PM);
11144a14a6aSChris Bieneman }
11244a14a6aSChris Bieneman 
11344a14a6aSChris Bieneman const DirectXSubtarget *
11444a14a6aSChris Bieneman DirectXTargetMachine::getSubtargetImpl(const Function &) const {
11544a14a6aSChris Bieneman   return Subtarget.get();
11644a14a6aSChris Bieneman }
11744a14a6aSChris Bieneman 
11844a14a6aSChris Bieneman TargetTransformInfo
11944a14a6aSChris Bieneman DirectXTargetMachine::getTargetTransformInfo(const Function &F) const {
12044a14a6aSChris Bieneman   return TargetTransformInfo(DirectXTTIImpl(this, F));
12144a14a6aSChris Bieneman }
12244a14a6aSChris Bieneman 
12344a14a6aSChris Bieneman DirectXTargetLowering::DirectXTargetLowering(const DirectXTargetMachine &TM,
12444a14a6aSChris Bieneman                                              const DirectXSubtarget &STI)
12544a14a6aSChris Bieneman     : TargetLowering(TM) {}
126