//===- SPIRVTargetMachine.cpp - Define TargetMachine for SPIR-V -*- 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 // //===----------------------------------------------------------------------===// // // Implements the info about SPIR-V target spec. // //===----------------------------------------------------------------------===// #include "SPIRVTargetMachine.h" #include "TargetInfo/SPIRVTargetInfo.h" #include "llvm/CodeGen/TargetLoweringObjectFileImpl.h" #include "llvm/CodeGen/TargetPassConfig.h" #include "llvm/MC/TargetRegistry.h" using namespace llvm; extern "C" LLVM_EXTERNAL_VISIBILITY void LLVMInitializeSPIRVTarget() { // Register the target. RegisterTargetMachine X(getTheSPIRV32Target()); RegisterTargetMachine Y(getTheSPIRV64Target()); } static std::string computeDataLayout(const Triple &TT) { std::string DataLayout = "e-m:e"; const auto Arch = TT.getArch(); if (Arch == Triple::spirv32) DataLayout += "-p:32:32"; else if (Arch == Triple::spirv64) DataLayout += "-p:64:64"; return DataLayout; } static Reloc::Model getEffectiveRelocModel(Optional RM) { if (!RM) return Reloc::PIC_; return *RM; } SPIRVTargetMachine::SPIRVTargetMachine(const Target &T, const Triple &TT, StringRef CPU, StringRef FS, const TargetOptions &Options, Optional RM, Optional CM, CodeGenOpt::Level OL, bool JIT) : LLVMTargetMachine(T, computeDataLayout(TT), TT, CPU, FS, Options, getEffectiveRelocModel(RM), getEffectiveCodeModel(CM, CodeModel::Small), OL), TLOF(std::make_unique()) { initAsmInfo(); } namespace { // SPIR-V Code Generator Pass Configuration Options. class SPIRVPassConfig : public TargetPassConfig { public: SPIRVPassConfig(SPIRVTargetMachine &TM, PassManagerBase &PM) : TargetPassConfig(TM, PM) {} SPIRVTargetMachine &getSPIRVTargetMachine() const { return getTM(); } }; } // namespace TargetPassConfig *SPIRVTargetMachine::createPassConfig(PassManagerBase &PM) { return new SPIRVPassConfig(*this, PM); }