aboutsummaryrefslogtreecommitdiff
path: root/contrib/llvm-project/llvm/lib/Target/DirectX/DirectXTargetMachine.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/llvm-project/llvm/lib/Target/DirectX/DirectXTargetMachine.cpp')
-rw-r--r--contrib/llvm-project/llvm/lib/Target/DirectX/DirectXTargetMachine.cpp144
1 files changed, 144 insertions, 0 deletions
diff --git a/contrib/llvm-project/llvm/lib/Target/DirectX/DirectXTargetMachine.cpp b/contrib/llvm-project/llvm/lib/Target/DirectX/DirectXTargetMachine.cpp
new file mode 100644
index 000000000000..44bef80ea6fb
--- /dev/null
+++ b/contrib/llvm-project/llvm/lib/Target/DirectX/DirectXTargetMachine.cpp
@@ -0,0 +1,144 @@
+//===- DirectXTargetMachine.cpp - DirectX Target Implementation -*- C++ -*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+///
+/// \file
+/// This file contains DirectX target initializer.
+///
+//===----------------------------------------------------------------------===//
+
+#include "DirectXTargetMachine.h"
+#include "DXILWriter/DXILWriterPass.h"
+#include "DirectX.h"
+#include "DirectXSubtarget.h"
+#include "DirectXTargetTransformInfo.h"
+#include "TargetInfo/DirectXTargetInfo.h"
+#include "llvm/CodeGen/MachineModuleInfo.h"
+#include "llvm/CodeGen/Passes.h"
+#include "llvm/CodeGen/TargetPassConfig.h"
+#include "llvm/IR/IRPrintingPasses.h"
+#include "llvm/IR/LegacyPassManager.h"
+#include "llvm/MC/MCSectionDXContainer.h"
+#include "llvm/MC/SectionKind.h"
+#include "llvm/MC/TargetRegistry.h"
+#include "llvm/Support/CodeGen.h"
+#include "llvm/Support/Compiler.h"
+#include "llvm/Support/ErrorHandling.h"
+#include "llvm/Target/TargetLoweringObjectFile.h"
+
+using namespace llvm;
+
+extern "C" LLVM_EXTERNAL_VISIBILITY void LLVMInitializeDirectXTarget() {
+ RegisterTargetMachine<DirectXTargetMachine> X(getTheDirectXTarget());
+ auto *PR = PassRegistry::getPassRegistry();
+ initializeDXILPrepareModulePass(*PR);
+ initializeEmbedDXILPassPass(*PR);
+ initializeDXILOpLoweringLegacyPass(*PR);
+ initializeDXILTranslateMetadataPass(*PR);
+}
+
+class DXILTargetObjectFile : public TargetLoweringObjectFile {
+public:
+ DXILTargetObjectFile() = default;
+
+ MCSection *getExplicitSectionGlobal(const GlobalObject *GO, SectionKind Kind,
+ const TargetMachine &TM) const override {
+ return getContext().getDXContainerSection(GO->getSection(), Kind);
+ }
+
+protected:
+ MCSection *SelectSectionForGlobal(const GlobalObject *GO, SectionKind Kind,
+ const TargetMachine &TM) const override {
+ llvm_unreachable("Not supported!");
+ }
+};
+
+class DirectXPassConfig : public TargetPassConfig {
+public:
+ DirectXPassConfig(DirectXTargetMachine &TM, PassManagerBase &PM)
+ : TargetPassConfig(TM, PM) {}
+
+ DirectXTargetMachine &getDirectXTargetMachine() const {
+ return getTM<DirectXTargetMachine>();
+ }
+
+ FunctionPass *createTargetRegisterAllocator(bool) override { return nullptr; }
+};
+
+DirectXTargetMachine::DirectXTargetMachine(const Target &T, const Triple &TT,
+ StringRef CPU, StringRef FS,
+ const TargetOptions &Options,
+ Optional<Reloc::Model> RM,
+ Optional<CodeModel::Model> CM,
+ CodeGenOpt::Level OL, bool JIT)
+ : LLVMTargetMachine(T,
+ "e-m:e-p:32:32-i1:32-i8:8-i16:16-i32:32-i64:64-f16:16-"
+ "f32:32-f64:64-n8:16:32:64",
+ TT, CPU, FS, Options, Reloc::Static, CodeModel::Small,
+ OL),
+ TLOF(std::make_unique<DXILTargetObjectFile>()),
+ Subtarget(std::make_unique<DirectXSubtarget>(TT, CPU, FS, *this)) {
+ initAsmInfo();
+}
+
+DirectXTargetMachine::~DirectXTargetMachine() {}
+
+bool DirectXTargetMachine::addPassesToEmitFile(
+ PassManagerBase &PM, raw_pwrite_stream &Out, raw_pwrite_stream *DwoOut,
+ CodeGenFileType FileType, bool DisableVerify,
+ MachineModuleInfoWrapperPass *MMIWP) {
+ PM.add(createDXILOpLoweringLegacyPass());
+ PM.add(createDXILPrepareModulePass());
+ PM.add(createDXILTranslateMetadataPass());
+ if (TargetPassConfig::willCompleteCodeGenPipeline()) {
+ PM.add(createDXILEmbedderPass());
+ }
+ switch (FileType) {
+ case CGFT_AssemblyFile:
+ PM.add(createPrintModulePass(Out, "", true));
+ break;
+ case CGFT_ObjectFile:
+ if (TargetPassConfig::willCompleteCodeGenPipeline()) {
+ if (!MMIWP)
+ MMIWP = new MachineModuleInfoWrapperPass(this);
+ PM.add(MMIWP);
+ if (addAsmPrinter(PM, Out, DwoOut, FileType,
+ MMIWP->getMMI().getContext()))
+ return true;
+ } else
+ PM.add(createDXILWriterPass(Out));
+ break;
+ case CGFT_Null:
+ break;
+ }
+ return false;
+}
+
+bool DirectXTargetMachine::addPassesToEmitMC(PassManagerBase &PM,
+ MCContext *&Ctx,
+ raw_pwrite_stream &Out,
+ bool DisableVerify) {
+ return true;
+}
+
+TargetPassConfig *DirectXTargetMachine::createPassConfig(PassManagerBase &PM) {
+ return new DirectXPassConfig(*this, PM);
+}
+
+const DirectXSubtarget *
+DirectXTargetMachine::getSubtargetImpl(const Function &) const {
+ return Subtarget.get();
+}
+
+TargetTransformInfo
+DirectXTargetMachine::getTargetTransformInfo(const Function &F) const {
+ return TargetTransformInfo(DirectXTTIImpl(this, F));
+}
+
+DirectXTargetLowering::DirectXTargetLowering(const DirectXTargetMachine &TM,
+ const DirectXSubtarget &STI)
+ : TargetLowering(TM) {}