12
12
#include " DXILShaderFlags.h"
13
13
#include " DirectX.h"
14
14
#include " llvm/ADT/SmallVector.h"
15
+ #include " llvm/ADT/Twine.h"
15
16
#include " llvm/Analysis/DXILMetadataAnalysis.h"
16
17
#include " llvm/Analysis/DXILResource.h"
17
18
#include " llvm/IR/Constants.h"
32
33
using namespace llvm ;
33
34
using namespace llvm ::dxil;
34
35
36
+ namespace {
35
37
// / A simple Wrapper DiagnosticInfo that generates Module-level diagnostic
36
- class DiagnosticInfoModuleFormat : public DiagnosticInfo {
38
+ // / for TranslateMetadata pass
39
+ class DiagnosticInfoTranslateMD : public DiagnosticInfo {
37
40
private:
38
- const Twine Msg;
41
+ const Twine & Msg;
39
42
const Module &Mod;
40
43
41
44
public:
42
45
// / \p M is the module for which the diagnostic is being emitted. \p Msg is
43
46
// / the message to show. Note that this class does not copy this message, so
44
47
// / this reference must be valid for the whole life time of the diagnostic.
45
- DiagnosticInfoModuleFormat (const Module &M, const Twine &Msg,
46
- DiagnosticSeverity Severity = DS_Error)
48
+ DiagnosticInfoTranslateMD (const Module &M, const Twine &Msg,
49
+ DiagnosticSeverity Severity = DS_Error)
47
50
: DiagnosticInfo(DK_Unsupported, Severity), Msg(Msg), Mod(M) {}
48
51
49
52
void print (DiagnosticPrinter &DP) const override {
50
- std::string Str;
51
- raw_string_ostream OS (Str);
52
-
53
- OS << Mod.getName () << " : " << Msg << ' \n ' ;
54
- OS.flush ();
55
- DP << Str;
53
+ DP << Mod.getName () << " : " << Msg << ' \n ' ;
56
54
}
57
55
};
58
56
57
+ enum class EntryPropsTag {
58
+ ShaderFlags = 0 ,
59
+ GSState,
60
+ DSState,
61
+ HSState,
62
+ NumThreads,
63
+ AutoBindingSpace,
64
+ RayPayloadSize,
65
+ RayAttribSize,
66
+ ShaderKind,
67
+ MSState,
68
+ ASStateTag,
69
+ WaveSize,
70
+ EntryRootSig,
71
+ };
72
+
73
+ } // namespace
74
+
59
75
static NamedMDNode *emitResourceMetadata (Module &M, const DXILResourceMap &DRM,
60
76
const dxil::Resources &MDResources) {
61
77
LLVMContext &Context = M.getContext ();
@@ -128,39 +144,31 @@ static uint32_t getShaderStage(Triple::EnvironmentType Env) {
128
144
return (uint32_t )Env - (uint32_t )llvm::Triple::Pixel;
129
145
}
130
146
131
- namespace {
132
- enum EntryPropsTag {
133
- ShaderFlagsTag = 0 ,
134
- GSStateTag,
135
- DSStateTag,
136
- HSStateTag,
137
- NumThreadsTag,
138
- AutoBindingSpaceTag,
139
- RayPayloadSizeTag,
140
- RayAttribSizeTag,
141
- ShaderKindTag,
142
- MSStateTag,
143
- ASStateTag,
144
- WaveSizeTag,
145
- EntryRootSigTag,
146
- };
147
- } // namespace
148
-
149
147
static SmallVector<Metadata *>
150
148
getTagValueAsMetadata (EntryPropsTag Tag, uint64_t Value, LLVMContext &Ctx) {
151
149
SmallVector<Metadata *> MDVals;
152
- MDVals.emplace_back (
153
- ConstantAsMetadata::get ( ConstantInt::get (Type::getInt32Ty (Ctx), Tag)));
150
+ MDVals.emplace_back (ConstantAsMetadata::get (
151
+ ConstantInt::get (Type::getInt32Ty (Ctx), static_cast < int >( Tag) )));
154
152
switch (Tag) {
155
- case ShaderFlagsTag :
153
+ case EntryPropsTag::ShaderFlags :
156
154
MDVals.emplace_back (ConstantAsMetadata::get (
157
155
ConstantInt::get (Type::getInt64Ty (Ctx), Value)));
158
156
break ;
159
- case ShaderKindTag :
157
+ case EntryPropsTag::ShaderKind :
160
158
MDVals.emplace_back (ConstantAsMetadata::get (
161
159
ConstantInt::get (Type::getInt32Ty (Ctx), Value)));
162
160
break ;
163
- default :
161
+ case EntryPropsTag::GSState:
162
+ case EntryPropsTag::DSState:
163
+ case EntryPropsTag::HSState:
164
+ case EntryPropsTag::NumThreads:
165
+ case EntryPropsTag::AutoBindingSpace:
166
+ case EntryPropsTag::RayPayloadSize:
167
+ case EntryPropsTag::RayAttribSize:
168
+ case EntryPropsTag::MSState:
169
+ case EntryPropsTag::ASStateTag:
170
+ case EntryPropsTag::WaveSize:
171
+ case EntryPropsTag::EntryRootSig:
164
172
llvm_unreachable (" NYI: Unhandled entry property tag" );
165
173
}
166
174
return MDVals;
@@ -172,20 +180,21 @@ getEntryPropAsMetadata(const EntryProperties &EP, uint64_t EntryShaderFlags,
172
180
SmallVector<Metadata *> MDVals;
173
181
LLVMContext &Ctx = EP.Entry ->getContext ();
174
182
if (EntryShaderFlags != 0 )
175
- MDVals.append (getTagValueAsMetadata (ShaderFlagsTag, EntryShaderFlags, Ctx));
183
+ MDVals.append (getTagValueAsMetadata (EntryPropsTag::ShaderFlags,
184
+ EntryShaderFlags, Ctx));
176
185
177
186
if (EP.Entry != nullptr ) {
178
187
// FIXME: support more props.
179
188
// See https://github.com/llvm/llvm-project/issues/57948.
180
189
// Add shader kind for lib entries.
181
190
if (ShaderProfile == Triple::EnvironmentType::Library &&
182
191
EP.ShaderStage != Triple::EnvironmentType::Library)
183
- MDVals.append (getTagValueAsMetadata (ShaderKindTag ,
192
+ MDVals.append (getTagValueAsMetadata (EntryPropsTag::ShaderKind ,
184
193
getShaderStage (EP.ShaderStage ), Ctx));
185
194
186
195
if (EP.ShaderStage == Triple::EnvironmentType::Compute) {
187
- MDVals.emplace_back (ConstantAsMetadata::get (
188
- ConstantInt::get ( Type::getInt32Ty (Ctx), NumThreadsTag )));
196
+ MDVals.emplace_back (ConstantAsMetadata::get (ConstantInt::get (
197
+ Type::getInt32Ty (Ctx), static_cast < int >(EntryPropsTag::NumThreads) )));
189
198
Metadata *NumThreadVals[] = {ConstantAsMetadata::get (ConstantInt::get (
190
199
Type::getInt32Ty (Ctx), EP.NumThreadsX )),
191
200
ConstantAsMetadata::get (ConstantInt::get (
@@ -282,7 +291,8 @@ static MDTuple *emitTopLevelLibraryNode(Module &M, MDNode *RMD,
282
291
// provided by ShaderFlagsAnalysis pass is created by walking *all* the
283
292
// function instructions of the module. Is it is correct to use this value
284
293
// for metadata of the empty library entry?
285
- MDVals.append (getTagValueAsMetadata (ShaderFlagsTag, ShaderFlags, Ctx));
294
+ MDVals.append (
295
+ getTagValueAsMetadata (EntryPropsTag::ShaderFlags, ShaderFlags, Ctx));
286
296
Properties = MDNode::get (Ctx, MDVals);
287
297
}
288
298
// Library has an entry metadata with resource table metadata and all other
@@ -312,7 +322,7 @@ static void translateMetadata(Module &M, const DXILResourceMap &DRM,
312
322
EntryFnMDNodes.emplace_back (
313
323
emitTopLevelLibraryNode (M, ResourceMD, ShaderFlags));
314
324
else if (MMDI.EntryPropertyVec .size () > 1 ) {
315
- M.getContext ().diagnose (DiagnosticInfoModuleFormat (
325
+ M.getContext ().diagnose (DiagnosticInfoTranslateMD (
316
326
M, " Non-library shader: One and only one entry expected" ));
317
327
}
318
328
@@ -326,9 +336,14 @@ static void translateMetadata(Module &M, const DXILResourceMap &DRM,
326
336
: ShaderFlags;
327
337
if (MMDI.ShaderProfile != Triple::EnvironmentType::Library) {
328
338
if (EntryProp.ShaderStage != MMDI.ShaderProfile ) {
329
- M.getContext ().diagnose (DiagnosticInfoModuleFormat (
330
- M, " Non-library shader: Stage of shader entry different from "
331
- " shader target profile" ));
339
+ M.getContext ().diagnose (DiagnosticInfoTranslateMD (
340
+ M,
341
+ " Shader stage '" +
342
+ Twine (getShortShaderStage (EntryProp.ShaderStage ) +
343
+ " ' for entry '" + Twine (EntryProp.Entry ->getName ()) +
344
+ " ' different from specified target profile '" +
345
+ Twine (Triple::getEnvironmentTypeName (MMDI.ShaderProfile ) +
346
+ " '" ))));
332
347
}
333
348
}
334
349
EntryFnMDNodes.emplace_back (emitEntryMD (EntryProp, Signatures, ResourceMD,
0 commit comments