22#define DEBUG_TYPE "dxil-metadata-analysis"
30 cl::desc(
"Choose SCRI part compression:"),
32 "none",
"No compression"),
33 clEnumValN(dxbc::SourceInfo::Contents::CompressionType::Zlib,
39 const Triple &TT = M.getTargetTriple();
43 NamedMDNode *ValidatorVerNode = M.getNamedMetadata(
"dx.valver");
44 if (ValidatorVerNode) {
49 VersionTuple(MajorMD->getZExtValue(), MinorMD->getZExtValue());
52 NamedMDNode *ContentsNode = M.getNamedMetadata(
"dx.source.contents");
53 NamedMDNode *ArgsNode = M.getNamedMetadata(
"dx.source.args");
54 if (ContentsNode && ArgsNode) {
62 ? dxbc::SourceInfo::Contents::CompressionType::Zlib
63 : dxbc::SourceInfo::Contents::CompressionType::None);
76 for (
auto &
F : M.functions()) {
77 if (!
F.hasFnAttribute(
"hlsl.shader"))
82 Attribute EntryAttr =
F.getFnAttribute(
"hlsl.shader");
84 "Invalid value specified for HLSL function attribute hlsl.shader");
86 Triple T(
"",
"",
"", EntryProfile);
90 F.getFnAttribute(
"hlsl.numthreads").getValueAsString();
91 if (!NumThreadsStr.
empty()) {
93 NumThreadsStr.
split(NumThreadsVec,
',');
94 assert(NumThreadsVec.
size() == 3 &&
"Invalid numthreads specified");
98 assert(
Success &&
"Failed to parse X component of numthreads");
100 assert(
Success &&
"Failed to parse Y component of numthreads");
102 assert(
Success &&
"Failed to parse Z component of numthreads");
106 F.getFnAttribute(
"hlsl.wavesize").getValueAsString();
107 if (!WaveSizeStr.
empty()) {
109 WaveSizeStr.
split(WaveSizeVec,
',');
110 assert(WaveSizeVec.
size() == 3 &&
"Invalid wavesize specified");
112 [[maybe_unused]]
bool Success =
114 assert(
Success &&
"Failed to parse Min component of wavesize");
116 assert(
Success &&
"Failed to parse Max component of wavesize");
118 assert(
Success &&
"Failed to parse Preferred component of wavesize");
127 OS <<
"DXIL Version : " <<
DXILVersion.getAsString() <<
"\n";
128 OS <<
"Target Shader Stage : "
132 OS <<
" " << EP.Entry->getName() <<
"\n";
133 OS <<
" Function Shader Stage : "
135 OS <<
" NumThreads: " << EP.NumThreadsX <<
"," << EP.NumThreadsY <<
","
136 << EP.NumThreadsZ <<
"\n";
182 OS <<
"No module metadata info has been built!\n";
185 MetadataInfo->print(
dbgs());
188#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
194 "DXIL Module Metadata analysis",
false,
true)
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
This file implements a class to represent arbitrary precision integral constant values and operations...
#define clEnumValN(ENUMVAL, FLAGNAME, DESC)
#define LLVM_DUMP_METHOD
Mark debug helper function definitions like dump() that should not be stripped from debug builds.
This file contains the declarations for the subclasses of Constant, which represent the different fla...
Module.h This file contains the declarations for the Module class.
#define INITIALIZE_PASS(passName, arg, name, cfg, analysis)
PassT::Result & getResult(IRUnitT &IR, ExtraArgTs... ExtraArgs)
Get the result of an analysis pass for a given IR unit.
Represent the analysis usage information of a pass.
void setPreservesAll()
Set by analyses that do not transform their input at all.
Functions, function parameters, and return types can have attributes to indicate how they should be t...
LLVM_ABI StringRef getValueAsString() const
Return the attribute's value as a string.
bool isValid() const
Return true if the attribute is any kind of attribute.
ArrayRef< MDOperand > operands() const
A Module instance is used to store all the information related to an LLVM module.
LLVM_ABI MDNode * getOperand(unsigned i) const
iterator_range< op_iterator > operands()
A set of analyses that are preserved following a run of a transformation pass.
static PreservedAnalyses all()
Construct a special preserved set that preserves all passes.
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
Represent a constant reference to a string, i.e.
std::pair< StringRef, StringRef > split(char Separator) const
Split into two substrings around the first occurrence of a separator character.
constexpr bool empty() const
Check if the string is empty.
Triple - Helper class for working with autoconf configuration names.
static LLVM_ABI StringRef getEnvironmentTypeName(EnvironmentType Kind)
Get the canonical name for the Kind environment.
Represents a version number in the form major[.minor[.subminor[.build]]].
This class implements an extremely fast bulk output stream that can only output to a stream.
unsigned ID
LLVM IR allows to use arbitrary numbers as calling convention identifiers.
ValuesClass values(OptsTy... Options)
Helper to build a ValuesClass by forwarding a variable number of arguments as an initializer list to ...
LLVM_ABI bool isAvailable()
std::enable_if_t< detail::IsValidPointer< X, Y >::value, X * > extract(Y &&MD)
Extract a Value from Metadata.
This is an optimization pass for GlobalISel generic memory operations.
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
FunctionAddr VTableAddr uintptr_t uintptr_t Data
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
bool to_integer(StringRef S, N &Num, unsigned Base=0)
Convert the string S to an integer of the specified type using the radix Base. If Base is 0,...
AnalysisManager< Module > ModuleAnalysisManager
Convenience typedef for the Module analysis manager.
A special type used by analysis passes to provide an address that identifies that particular analysis...
Triple::EnvironmentType ShaderStage