xref: /freebsd-src/contrib/llvm-project/llvm/lib/Target/DirectX/DirectXAsmPrinter.cpp (revision 0fca6ea1d4eea4c934cfff25ac9ee8ad6fe95583)
181ad6265SDimitry Andric //===-- DirectXAsmPrinter.cpp - DirectX assembly writer --------*- C++ -*--===//
281ad6265SDimitry Andric //
381ad6265SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
481ad6265SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
581ad6265SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
681ad6265SDimitry Andric //
781ad6265SDimitry Andric //===----------------------------------------------------------------------===//
881ad6265SDimitry Andric //
981ad6265SDimitry Andric // This file contains AsmPrinters for the DirectX backend.
1081ad6265SDimitry Andric //
1181ad6265SDimitry Andric //===----------------------------------------------------------------------===//
1281ad6265SDimitry Andric 
1381ad6265SDimitry Andric #include "TargetInfo/DirectXTargetInfo.h"
1481ad6265SDimitry Andric #include "llvm/CodeGen/AsmPrinter.h"
1581ad6265SDimitry Andric #include "llvm/IR/GlobalVariable.h"
1681ad6265SDimitry Andric #include "llvm/IR/Module.h"
1781ad6265SDimitry Andric #include "llvm/MC/MCStreamer.h"
1881ad6265SDimitry Andric #include "llvm/MC/SectionKind.h"
1981ad6265SDimitry Andric #include "llvm/MC/TargetRegistry.h"
2081ad6265SDimitry Andric #include "llvm/Target/TargetLoweringObjectFile.h"
2181ad6265SDimitry Andric 
2281ad6265SDimitry Andric using namespace llvm;
2381ad6265SDimitry Andric 
2481ad6265SDimitry Andric #define DEBUG_TYPE "asm-printer"
2581ad6265SDimitry Andric 
2681ad6265SDimitry Andric namespace {
2781ad6265SDimitry Andric 
2881ad6265SDimitry Andric // The DXILAsmPrinter is mostly a stub because DXIL is just LLVM bitcode which
2981ad6265SDimitry Andric // gets embedded into a DXContainer file.
3081ad6265SDimitry Andric class DXILAsmPrinter : public AsmPrinter {
3181ad6265SDimitry Andric public:
3281ad6265SDimitry Andric   explicit DXILAsmPrinter(TargetMachine &TM,
3381ad6265SDimitry Andric                           std::unique_ptr<MCStreamer> Streamer)
3481ad6265SDimitry Andric       : AsmPrinter(TM, std::move(Streamer)) {}
3581ad6265SDimitry Andric 
3681ad6265SDimitry Andric   StringRef getPassName() const override { return "DXIL Assembly Printer"; }
3781ad6265SDimitry Andric   void emitGlobalVariable(const GlobalVariable *GV) override;
3881ad6265SDimitry Andric   bool runOnMachineFunction(MachineFunction &MF) override { return false; }
3981ad6265SDimitry Andric };
4081ad6265SDimitry Andric } // namespace
4181ad6265SDimitry Andric 
4281ad6265SDimitry Andric void DXILAsmPrinter::emitGlobalVariable(const GlobalVariable *GV) {
43bdd1243dSDimitry Andric   // If there is no initializer, or no explicit section do nothing
44bdd1243dSDimitry Andric   if (!GV->hasInitializer() || GV->hasImplicitSection() || !GV->hasSection())
4581ad6265SDimitry Andric     return;
4681ad6265SDimitry Andric   // Skip the LLVM metadata
4781ad6265SDimitry Andric   if (GV->getSection() == "llvm.metadata")
4881ad6265SDimitry Andric     return;
4981ad6265SDimitry Andric   SectionKind GVKind = TargetLoweringObjectFile::getKindForGlobal(GV, TM);
5081ad6265SDimitry Andric   MCSection *TheSection = getObjFileLowering().SectionForGlobal(GV, GVKind, TM);
5181ad6265SDimitry Andric   OutStreamer->switchSection(TheSection);
52*0fca6ea1SDimitry Andric   emitGlobalConstant(GV->getDataLayout(), GV->getInitializer());
5381ad6265SDimitry Andric }
5481ad6265SDimitry Andric 
5581ad6265SDimitry Andric extern "C" LLVM_EXTERNAL_VISIBILITY void LLVMInitializeDirectXAsmPrinter() {
5681ad6265SDimitry Andric   RegisterAsmPrinter<DXILAsmPrinter> X(getTheDirectXTarget());
5781ad6265SDimitry Andric }
58