//===-- 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 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->getDataLayout(), GV->getInitializer()); } extern "C" LLVM_EXTERNAL_VISIBILITY void LLVMInitializeDirectXAsmPrinter() { RegisterAsmPrinter X(getTheDirectXTarget()); }