Skip to content

Commit cc864cf

Browse files
committed
Address more PR feedback
- Rename class DiagnosticInfoModuleFormat as class DiagnosticInfoTranslateMD and enclose it in an anonymous namespace. - Print message directly to DiagnosticPrinter in DiagnosticInfoTranslateMD::print() - Change enum EntryPropsTag to scop[ed enum class - List all ENtryPropsTags in case statement - Moved comment inside constructEntryMetadata() - Changed emitValidatorVersionMD() to return early as appropriate.
1 parent 8f0f2a6 commit cc864cf

File tree

2 files changed

+58
-43
lines changed

2 files changed

+58
-43
lines changed

llvm/lib/Target/DirectX/DXILTranslateMetadata.cpp

Lines changed: 57 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
#include "DXILShaderFlags.h"
1313
#include "DirectX.h"
1414
#include "llvm/ADT/SmallVector.h"
15+
#include "llvm/ADT/Twine.h"
1516
#include "llvm/Analysis/DXILMetadataAnalysis.h"
1617
#include "llvm/Analysis/DXILResource.h"
1718
#include "llvm/IR/Constants.h"
@@ -32,30 +33,45 @@
3233
using namespace llvm;
3334
using namespace llvm::dxil;
3435

36+
namespace {
3537
/// A simple Wrapper DiagnosticInfo that generates Module-level diagnostic
36-
class DiagnosticInfoModuleFormat : public DiagnosticInfo {
38+
/// for TranslateMetadata pass
39+
class DiagnosticInfoTranslateMD : public DiagnosticInfo {
3740
private:
38-
const Twine Msg;
41+
const Twine &Msg;
3942
const Module &Mod;
4043

4144
public:
4245
/// \p M is the module for which the diagnostic is being emitted. \p Msg is
4346
/// the message to show. Note that this class does not copy this message, so
4447
/// 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)
4750
: DiagnosticInfo(DK_Unsupported, Severity), Msg(Msg), Mod(M) {}
4851

4952
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';
5654
}
5755
};
5856

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+
5975
static NamedMDNode *emitResourceMetadata(Module &M, const DXILResourceMap &DRM,
6076
const dxil::Resources &MDResources) {
6177
LLVMContext &Context = M.getContext();
@@ -128,39 +144,31 @@ static uint32_t getShaderStage(Triple::EnvironmentType Env) {
128144
return (uint32_t)Env - (uint32_t)llvm::Triple::Pixel;
129145
}
130146

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-
149147
static SmallVector<Metadata *>
150148
getTagValueAsMetadata(EntryPropsTag Tag, uint64_t Value, LLVMContext &Ctx) {
151149
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))));
154152
switch (Tag) {
155-
case ShaderFlagsTag:
153+
case EntryPropsTag::ShaderFlags:
156154
MDVals.emplace_back(ConstantAsMetadata::get(
157155
ConstantInt::get(Type::getInt64Ty(Ctx), Value)));
158156
break;
159-
case ShaderKindTag:
157+
case EntryPropsTag::ShaderKind:
160158
MDVals.emplace_back(ConstantAsMetadata::get(
161159
ConstantInt::get(Type::getInt32Ty(Ctx), Value)));
162160
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:
164172
llvm_unreachable("NYI: Unhandled entry property tag");
165173
}
166174
return MDVals;
@@ -172,20 +180,21 @@ getEntryPropAsMetadata(const EntryProperties &EP, uint64_t EntryShaderFlags,
172180
SmallVector<Metadata *> MDVals;
173181
LLVMContext &Ctx = EP.Entry->getContext();
174182
if (EntryShaderFlags != 0)
175-
MDVals.append(getTagValueAsMetadata(ShaderFlagsTag, EntryShaderFlags, Ctx));
183+
MDVals.append(getTagValueAsMetadata(EntryPropsTag::ShaderFlags,
184+
EntryShaderFlags, Ctx));
176185

177186
if (EP.Entry != nullptr) {
178187
// FIXME: support more props.
179188
// See https://github.com/llvm/llvm-project/issues/57948.
180189
// Add shader kind for lib entries.
181190
if (ShaderProfile == Triple::EnvironmentType::Library &&
182191
EP.ShaderStage != Triple::EnvironmentType::Library)
183-
MDVals.append(getTagValueAsMetadata(ShaderKindTag,
192+
MDVals.append(getTagValueAsMetadata(EntryPropsTag::ShaderKind,
184193
getShaderStage(EP.ShaderStage), Ctx));
185194

186195
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))));
189198
Metadata *NumThreadVals[] = {ConstantAsMetadata::get(ConstantInt::get(
190199
Type::getInt32Ty(Ctx), EP.NumThreadsX)),
191200
ConstantAsMetadata::get(ConstantInt::get(
@@ -282,7 +291,8 @@ static MDTuple *emitTopLevelLibraryNode(Module &M, MDNode *RMD,
282291
// provided by ShaderFlagsAnalysis pass is created by walking *all* the
283292
// function instructions of the module. Is it is correct to use this value
284293
// for metadata of the empty library entry?
285-
MDVals.append(getTagValueAsMetadata(ShaderFlagsTag, ShaderFlags, Ctx));
294+
MDVals.append(
295+
getTagValueAsMetadata(EntryPropsTag::ShaderFlags, ShaderFlags, Ctx));
286296
Properties = MDNode::get(Ctx, MDVals);
287297
}
288298
// Library has an entry metadata with resource table metadata and all other
@@ -312,7 +322,7 @@ static void translateMetadata(Module &M, const DXILResourceMap &DRM,
312322
EntryFnMDNodes.emplace_back(
313323
emitTopLevelLibraryNode(M, ResourceMD, ShaderFlags));
314324
else if (MMDI.EntryPropertyVec.size() > 1) {
315-
M.getContext().diagnose(DiagnosticInfoModuleFormat(
325+
M.getContext().diagnose(DiagnosticInfoTranslateMD(
316326
M, "Non-library shader: One and only one entry expected"));
317327
}
318328

@@ -326,9 +336,14 @@ static void translateMetadata(Module &M, const DXILResourceMap &DRM,
326336
: ShaderFlags;
327337
if (MMDI.ShaderProfile != Triple::EnvironmentType::Library) {
328338
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+
"'"))));
332347
}
333348
}
334349
EntryFnMDNodes.emplace_back(emitEntryMD(EntryProp, Signatures, ResourceMD,

llvm/test/CodeGen/DirectX/Metadata/target-profile-error.ll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
target triple = "dxil-pc-shadermodel6.6-pixel"
44

5-
; CHECK: Non-library shader: Stage of shader entry different from shader target profile
5+
; CHECK: Shader stage 'cs' for entry 'entry' different from specified target profile 'pixel'
66

77
define void @entry() #0 {
88
entry:

0 commit comments

Comments
 (0)