|  | //===-- 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()); | 
|  | } |