diff --git a/llvm/lib/Target/DirectX/CMakeLists.txt b/llvm/lib/Target/DirectX/CMakeLists.txt --- a/llvm/lib/Target/DirectX/CMakeLists.txt +++ b/llvm/lib/Target/DirectX/CMakeLists.txt @@ -12,6 +12,7 @@ add_public_tablegen_target(DirectXCommonTableGen) add_llvm_target(DirectXCodeGen + DirectXAsmPrinter.cpp DirectXInstrInfo.cpp DirectXRegisterInfo.cpp DirectXSubtarget.cpp diff --git a/llvm/lib/Target/DirectX/DirectXAsmPrinter.cpp b/llvm/lib/Target/DirectX/DirectXAsmPrinter.cpp new file mode 100644 --- /dev/null +++ b/llvm/lib/Target/DirectX/DirectXAsmPrinter.cpp @@ -0,0 +1,57 @@ +//===-- 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 the section is implicit, do nothing + if (!GV->hasInitializer() || GV->hasImplicitSection()) + 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 X(getTheDirectXTarget()); +}