Path: blob/main/contrib/llvm-project/llvm/lib/Target/DirectX/DXILWriter/DXILWriterPass.cpp
35294 views
//===- DXILWriterPass.cpp - Bitcode writing pass --------------------------===//1//2// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.3// See https://llvm.org/LICENSE.txt for license information.4// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception5//6//===----------------------------------------------------------------------===//7//8// DXILWriterPass implementation.9//10//===----------------------------------------------------------------------===//1112#include "DXILWriterPass.h"13#include "DXILBitcodeWriter.h"14#include "llvm/ADT/DenseMap.h"15#include "llvm/ADT/StringRef.h"16#include "llvm/Analysis/ModuleSummaryAnalysis.h"17#include "llvm/IR/Constants.h"18#include "llvm/IR/GlobalVariable.h"19#include "llvm/IR/Module.h"20#include "llvm/IR/PassManager.h"21#include "llvm/InitializePasses.h"22#include "llvm/Pass.h"23#include "llvm/Support/Alignment.h"24#include "llvm/Transforms/Utils/ModuleUtils.h"2526using namespace llvm;27using namespace llvm::dxil;2829namespace {30class WriteDXILPass : public llvm::ModulePass {31raw_ostream &OS; // raw_ostream to print on3233public:34static char ID; // Pass identification, replacement for typeid35WriteDXILPass() : ModulePass(ID), OS(dbgs()) {36initializeWriteDXILPassPass(*PassRegistry::getPassRegistry());37}3839explicit WriteDXILPass(raw_ostream &o) : ModulePass(ID), OS(o) {40initializeWriteDXILPassPass(*PassRegistry::getPassRegistry());41}4243StringRef getPassName() const override { return "Bitcode Writer"; }4445bool runOnModule(Module &M) override {46WriteDXILToFile(M, OS);47return false;48}49void getAnalysisUsage(AnalysisUsage &AU) const override {50AU.setPreservesAll();51}52};5354class EmbedDXILPass : public llvm::ModulePass {55public:56static char ID; // Pass identification, replacement for typeid57EmbedDXILPass() : ModulePass(ID) {58initializeEmbedDXILPassPass(*PassRegistry::getPassRegistry());59}6061StringRef getPassName() const override { return "DXIL Embedder"; }6263bool runOnModule(Module &M) override {64std::string Data;65llvm::raw_string_ostream OS(Data);6667const std::string OriginalTriple = M.getTargetTriple();68// Set to DXIL triple when write to bitcode.69// Only the output bitcode need to be DXIL triple.70M.setTargetTriple("dxil-ms-dx");7172WriteDXILToFile(M, OS);7374// Recover triple.75M.setTargetTriple(OriginalTriple);7677Constant *ModuleConstant =78ConstantDataArray::get(M.getContext(), arrayRefFromStringRef(Data));79auto *GV = new llvm::GlobalVariable(M, ModuleConstant->getType(), true,80GlobalValue::PrivateLinkage,81ModuleConstant, "dx.dxil");82GV->setSection("DXIL");83GV->setAlignment(Align(4));84appendToCompilerUsed(M, {GV});85return true;86}8788void getAnalysisUsage(AnalysisUsage &AU) const override {89AU.setPreservesAll();90}91};92} // namespace9394char WriteDXILPass::ID = 0;95INITIALIZE_PASS_BEGIN(WriteDXILPass, "dxil-write-bitcode", "Write Bitcode",96false, true)97INITIALIZE_PASS_DEPENDENCY(ModuleSummaryIndexWrapperPass)98INITIALIZE_PASS_END(WriteDXILPass, "dxil-write-bitcode", "Write Bitcode", false,99true)100101ModulePass *llvm::createDXILWriterPass(raw_ostream &Str) {102return new WriteDXILPass(Str);103}104105char EmbedDXILPass::ID = 0;106INITIALIZE_PASS(EmbedDXILPass, "dxil-embed", "Embed DXIL", false, true)107108ModulePass *llvm::createDXILEmbedderPass() { return new EmbedDXILPass(); }109110111