xref: /llvm-project/llvm/lib/Target/DirectX/DirectXTargetMachine.cpp (revision d401a9930628f38f773e40c1d6ad33942b10e8cf)
1 //===- DirectXTargetMachine.cpp - DirectX Target Implementation -*- 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 contains DirectX target initializer.
11 ///
12 //===----------------------------------------------------------------------===//
13 
14 #include "DirectXTargetMachine.h"
15 #include "DXILWriter/DXILWriterPass.h"
16 #include "DirectX.h"
17 #include "DirectXSubtarget.h"
18 #include "DirectXTargetTransformInfo.h"
19 #include "TargetInfo/DirectXTargetInfo.h"
20 #include "llvm/CodeGen/Passes.h"
21 #include "llvm/CodeGen/TargetPassConfig.h"
22 #include "llvm/IR/IRPrintingPasses.h"
23 #include "llvm/IR/LegacyPassManager.h"
24 #include "llvm/MC/SectionKind.h"
25 #include "llvm/MC/TargetRegistry.h"
26 #include "llvm/Support/CodeGen.h"
27 #include "llvm/Support/Compiler.h"
28 #include "llvm/Support/ErrorHandling.h"
29 #include "llvm/Target/TargetLoweringObjectFile.h"
30 
31 using namespace llvm;
32 
33 extern "C" LLVM_EXTERNAL_VISIBILITY void LLVMInitializeDirectXTarget() {
34   RegisterTargetMachine<DirectXTargetMachine> X(getTheDirectXTarget());
35   auto *PR = PassRegistry::getPassRegistry();
36   initializeDXILPrepareModulePass(*PR);
37   initializeEmbedDXILPassPass(*PR);
38   initializeDXILOpLoweringLegacyPass(*PR);
39   initializeDXILTranslateMetadataPass(*PR);
40 }
41 
42 class DXILTargetObjectFile : public TargetLoweringObjectFile {
43 public:
44   DXILTargetObjectFile() = default;
45 
46   MCSection *getExplicitSectionGlobal(const GlobalObject *GO, SectionKind Kind,
47                                       const TargetMachine &TM) const override {
48     llvm_unreachable("Not supported!");
49   }
50 
51 protected:
52   MCSection *SelectSectionForGlobal(const GlobalObject *GO, SectionKind Kind,
53                                     const TargetMachine &TM) const override {
54     llvm_unreachable("Not supported!");
55   }
56 };
57 
58 class DirectXPassConfig : public TargetPassConfig {
59 public:
60   DirectXPassConfig(DirectXTargetMachine &TM, PassManagerBase &PM)
61       : TargetPassConfig(TM, PM) {}
62 
63   DirectXTargetMachine &getDirectXTargetMachine() const {
64     return getTM<DirectXTargetMachine>();
65   }
66 
67   FunctionPass *createTargetRegisterAllocator(bool) override { return nullptr; }
68 };
69 
70 DirectXTargetMachine::DirectXTargetMachine(const Target &T, const Triple &TT,
71                                            StringRef CPU, StringRef FS,
72                                            const TargetOptions &Options,
73                                            Optional<Reloc::Model> RM,
74                                            Optional<CodeModel::Model> CM,
75                                            CodeGenOpt::Level OL, bool JIT)
76     : LLVMTargetMachine(T,
77                         "e-m:e-p:32:32-i1:32-i8:8-i16:16-i32:32-i64:64-f16:16-"
78                         "f32:32-f64:64-n8:16:32:64",
79                         TT, CPU, FS, Options, Reloc::Static, CodeModel::Small,
80                         OL),
81       TLOF(std::make_unique<DXILTargetObjectFile>()),
82       Subtarget(std::make_unique<DirectXSubtarget>(TT, CPU, FS, *this)) {}
83 
84 DirectXTargetMachine::~DirectXTargetMachine() {}
85 
86 bool DirectXTargetMachine::addPassesToEmitFile(
87     PassManagerBase &PM, raw_pwrite_stream &Out, raw_pwrite_stream *DwoOut,
88     CodeGenFileType FileType, bool DisableVerify,
89     MachineModuleInfoWrapperPass *MMIWP) {
90   PM.add(createDXILOpLoweringLegacyPass());
91   PM.add(createDXILPrepareModulePass());
92   PM.add(createDXILTranslateMetadataPass());
93   switch (FileType) {
94   case CGFT_AssemblyFile:
95     if (TargetPassConfig::willCompleteCodeGenPipeline()) {
96       PM.add(createDXILEmbedderPass());
97     }
98     PM.add(createPrintModulePass(Out, "", true));
99     break;
100   case CGFT_ObjectFile:
101     // TODO: Use MC Object streamer to write DXContainer
102     PM.add(createDXILWriterPass(Out));
103     break;
104   case CGFT_Null:
105     break;
106   }
107   return false;
108 }
109 
110 bool DirectXTargetMachine::addPassesToEmitMC(PassManagerBase &PM,
111                                              MCContext *&Ctx,
112                                              raw_pwrite_stream &Out,
113                                              bool DisableVerify) {
114   return true;
115 }
116 
117 TargetPassConfig *DirectXTargetMachine::createPassConfig(PassManagerBase &PM) {
118   return new DirectXPassConfig(*this, PM);
119 }
120 
121 const DirectXSubtarget *
122 DirectXTargetMachine::getSubtargetImpl(const Function &) const {
123   return Subtarget.get();
124 }
125 
126 TargetTransformInfo
127 DirectXTargetMachine::getTargetTransformInfo(const Function &F) const {
128   return TargetTransformInfo(DirectXTTIImpl(this, F));
129 }
130 
131 DirectXTargetLowering::DirectXTargetLowering(const DirectXTargetMachine &TM,
132                                              const DirectXSubtarget &STI)
133     : TargetLowering(TM) {}
134