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 initializeDXILOpLoweringLegacyPass(*PR); 38 initializeDXILTranslateMetadataPass(*PR); 39 } 40 41 class DXILTargetObjectFile : public TargetLoweringObjectFile { 42 public: 43 DXILTargetObjectFile() = default; 44 45 MCSection *getExplicitSectionGlobal(const GlobalObject *GO, SectionKind Kind, 46 const TargetMachine &TM) const override { 47 llvm_unreachable("Not supported!"); 48 } 49 50 protected: 51 MCSection *SelectSectionForGlobal(const GlobalObject *GO, SectionKind Kind, 52 const TargetMachine &TM) const override { 53 llvm_unreachable("Not supported!"); 54 } 55 }; 56 57 class DirectXPassConfig : public TargetPassConfig { 58 public: 59 DirectXPassConfig(DirectXTargetMachine &TM, PassManagerBase &PM) 60 : TargetPassConfig(TM, PM) {} 61 62 DirectXTargetMachine &getDirectXTargetMachine() const { 63 return getTM<DirectXTargetMachine>(); 64 } 65 66 FunctionPass *createTargetRegisterAllocator(bool) override { return nullptr; } 67 }; 68 69 DirectXTargetMachine::DirectXTargetMachine(const Target &T, const Triple &TT, 70 StringRef CPU, StringRef FS, 71 const TargetOptions &Options, 72 Optional<Reloc::Model> RM, 73 Optional<CodeModel::Model> CM, 74 CodeGenOpt::Level OL, bool JIT) 75 : LLVMTargetMachine(T, 76 "e-m:e-p:32:32-i1:32-i8:8-i16:16-i32:32-i64:64-f16:16-" 77 "f32:32-f64:64-n8:16:32:64", 78 TT, CPU, FS, Options, Reloc::Static, CodeModel::Small, 79 OL), 80 TLOF(std::make_unique<DXILTargetObjectFile>()), 81 Subtarget(std::make_unique<DirectXSubtarget>(TT, CPU, FS, *this)) {} 82 83 DirectXTargetMachine::~DirectXTargetMachine() {} 84 85 bool DirectXTargetMachine::addPassesToEmitFile( 86 PassManagerBase &PM, raw_pwrite_stream &Out, raw_pwrite_stream *DwoOut, 87 CodeGenFileType FileType, bool DisableVerify, 88 MachineModuleInfoWrapperPass *MMIWP) { 89 PM.add(createDXILOpLoweringLegacyPass()); 90 PM.add(createDXILPrepareModulePass()); 91 PM.add(createDXILTranslateMetadataPass()); 92 switch (FileType) { 93 case CGFT_AssemblyFile: 94 PM.add(createPrintModulePass(Out, "", true)); 95 break; 96 case CGFT_ObjectFile: 97 // TODO: Use MC Object streamer to write DXContainer 98 PM.add(createDXILWriterPass(Out)); 99 break; 100 case CGFT_Null: 101 break; 102 } 103 return false; 104 } 105 106 bool DirectXTargetMachine::addPassesToEmitMC(PassManagerBase &PM, 107 MCContext *&Ctx, 108 raw_pwrite_stream &Out, 109 bool DisableVerify) { 110 return true; 111 } 112 113 TargetPassConfig *DirectXTargetMachine::createPassConfig(PassManagerBase &PM) { 114 return new DirectXPassConfig(*this, PM); 115 } 116 117 const DirectXSubtarget * 118 DirectXTargetMachine::getSubtargetImpl(const Function &) const { 119 return Subtarget.get(); 120 } 121 122 TargetTransformInfo 123 DirectXTargetMachine::getTargetTransformInfo(const Function &F) const { 124 return TargetTransformInfo(DirectXTTIImpl(this, F)); 125 } 126 127 DirectXTargetLowering::DirectXTargetLowering(const DirectXTargetMachine &TM, 128 const DirectXSubtarget &STI) 129 : TargetLowering(TM) {} 130