Path: blob/main/contrib/llvm-project/llvm/lib/Target/DirectX/DXILShaderFlags.cpp
35266 views
//===- DXILShaderFlags.cpp - DXIL Shader Flags helper objects -------------===//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/// \file This file contains helper objects and APIs for working with DXIL9/// Shader Flags.10///11//===----------------------------------------------------------------------===//1213#include "DXILShaderFlags.h"14#include "DirectX.h"15#include "llvm/IR/Instruction.h"16#include "llvm/IR/Module.h"17#include "llvm/Support/FormatVariadic.h"1819using namespace llvm;20using namespace llvm::dxil;2122static void updateFlags(ComputedShaderFlags &Flags, const Instruction &I) {23Type *Ty = I.getType();24if (Ty->isDoubleTy()) {25Flags.Doubles = true;26switch (I.getOpcode()) {27case Instruction::FDiv:28case Instruction::UIToFP:29case Instruction::SIToFP:30case Instruction::FPToUI:31case Instruction::FPToSI:32Flags.DX11_1_DoubleExtensions = true;33break;34}35}36}3738ComputedShaderFlags ComputedShaderFlags::computeFlags(Module &M) {39ComputedShaderFlags Flags;40for (const auto &F : M)41for (const auto &BB : F)42for (const auto &I : BB)43updateFlags(Flags, I);44return Flags;45}4647void ComputedShaderFlags::print(raw_ostream &OS) const {48uint64_t FlagVal = (uint64_t) * this;49OS << formatv("; Shader Flags Value: {0:x8}\n;\n", FlagVal);50if (FlagVal == 0)51return;52OS << "; Note: shader requires additional functionality:\n";53#define SHADER_FEATURE_FLAG(FeatureBit, DxilModuleNum, FlagName, Str) \54if (FlagName) \55(OS << ";").indent(7) << Str << "\n";56#include "llvm/BinaryFormat/DXContainerConstants.def"57OS << "; Note: extra DXIL module flags:\n";58#define DXIL_MODULE_FLAG(DxilModuleBit, FlagName, Str) \59if (FlagName) \60(OS << ";").indent(7) << Str << "\n";61#include "llvm/BinaryFormat/DXContainerConstants.def"62OS << ";\n";63}6465AnalysisKey ShaderFlagsAnalysis::Key;6667ComputedShaderFlags ShaderFlagsAnalysis::run(Module &M,68ModuleAnalysisManager &AM) {69return ComputedShaderFlags::computeFlags(M);70}7172PreservedAnalyses ShaderFlagsAnalysisPrinter::run(Module &M,73ModuleAnalysisManager &AM) {74ComputedShaderFlags Flags = AM.getResult<ShaderFlagsAnalysis>(M);75Flags.print(OS);76return PreservedAnalyses::all();77}7879char ShaderFlagsAnalysisWrapper::ID = 0;8081INITIALIZE_PASS(ShaderFlagsAnalysisWrapper, "dx-shader-flag-analysis",82"DXIL Shader Flag Analysis", true, true)838485