| //===-- DirectXAsmPrinter.cpp - DirectX assembly writer --------*- 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 | |
| // | |
| //===----------------------------------------------------------------------===// | |
| // | |
| // This file contains AsmPrinters for the DirectX backend. | |
| // | |
| //===----------------------------------------------------------------------===// | |
| #include "TargetInfo/DirectXTargetInfo.h" | |
| #include "llvm/CodeGen/AsmPrinter.h" | |
| #include "llvm/IR/GlobalVariable.h" | |
| #include "llvm/IR/Module.h" | |
| #include "llvm/MC/MCStreamer.h" | |
| #include "llvm/MC/SectionKind.h" | |
| #include "llvm/MC/TargetRegistry.h" | |
| #include "llvm/Target/TargetLoweringObjectFile.h" | |
| using namespace llvm; | |
| #define DEBUG_TYPE "asm-printer" | |
| namespace { | |
| // The DXILAsmPrinter is mostly a stub because DXIL is just LLVM bitcode which | |
| // gets embedded into a DXContainer file. | |
| class DXILAsmPrinter : public AsmPrinter { | |
| public: | |
| explicit DXILAsmPrinter(TargetMachine &TM, | |
| std::unique_ptr<MCStreamer> Streamer) | |
| : AsmPrinter(TM, std::move(Streamer)) {} | |
| StringRef getPassName() const override { return "DXIL Assembly Printer"; } | |
| void emitGlobalVariable(const GlobalVariable *GV) override; | |
| bool runOnMachineFunction(MachineFunction &MF) override { return false; } | |
| }; | |
| } // namespace | |
| void DXILAsmPrinter::emitGlobalVariable(const GlobalVariable *GV) { | |
| // If there is no initializer, or no explicit section do nothing | |
| if (!GV->hasInitializer() || GV->hasImplicitSection() || !GV->hasSection()) | |
| return; | |
| // Skip the LLVM metadata | |
| if (GV->getSection() == "llvm.metadata") | |
| return; | |
| SectionKind GVKind = TargetLoweringObjectFile::getKindForGlobal(GV, TM); | |
| MCSection *TheSection = getObjFileLowering().SectionForGlobal(GV, GVKind, TM); | |
| OutStreamer->switchSection(TheSection); | |
| emitGlobalConstant(GV->getParent()->getDataLayout(), GV->getInitializer()); | |
| } | |
| extern "C" LLVM_EXTERNAL_VISIBILITY void LLVMInitializeDirectXAsmPrinter() { | |
| RegisterAsmPrinter<DXILAsmPrinter> X(getTheDirectXTarget()); | |
| } |