summaryrefslogtreecommitdiffstats
path: root/source
diff options
context:
space:
mode:
authorArielG-NV <159081215+ArielG-NV@users.noreply.github.com>2024-04-19 16:39:05 -0400
committerGitHub <noreply@github.com>2024-04-19 13:39:05 -0700
commitadbaf8f23d7ef8c8e7786e8be706a47adce3f2ef (patch)
tree044f4ce03a172557997de5237a65e3342a35e3ea /source
parent7c162eba5329eae7755e55298a455a144fcb0dce (diff)
add `-ignore-capabilities` flag (#3984)
`-ignore-capabilities` flag allows ignoring capability incompatibilities/discontinuity errors/warnings. We still process capabilities (needed for stdlib). Added to capability tests to ensure everything is working as intended. More will be added in the full stdlib capabilities implementation.
Diffstat (limited to 'source')
-rw-r--r--source/slang/slang-check-decl.cpp39
-rw-r--r--source/slang/slang-check-impl.h11
-rw-r--r--source/slang/slang-check-shader.cpp4
-rw-r--r--source/slang/slang-options.cpp2
4 files changed, 39 insertions, 17 deletions
diff --git a/source/slang/slang-check-decl.cpp b/source/slang/slang-check-decl.cpp
index 131d30d98..d819121bc 100644
--- a/source/slang/slang-check-decl.cpp
+++ b/source/slang/slang-check-decl.cpp
@@ -9760,7 +9760,9 @@ namespace Slang
// then the decl is using things that require conflicting set of capabilities, and we should diagnose an error.
if (referencedDecl && decl)
{
- visitor->getSink()->diagnose(
+ diagnoseCapabilityErrors(
+ visitor->getSink(),
+ visitor->getOptionSet(),
referenceLoc,
Diagnostics::conflictingCapabilityDueToUseOfDecl,
referencedDecl,
@@ -9770,7 +9772,9 @@ namespace Slang
}
else if (decl)
{
- visitor->getSink()->diagnose(
+ diagnoseCapabilityErrors(
+ visitor->getSink(),
+ visitor->getOptionSet(),
referenceLoc,
Diagnostics::conflictingCapabilityDueToStatement,
nodeCaps,
@@ -9779,7 +9783,9 @@ namespace Slang
}
else
{
- visitor->getSink()->diagnose(
+ diagnoseCapabilityErrors(
+ visitor->getSink(),
+ visitor->getOptionSet(),
referenceLoc,
Diagnostics::conflictingCapabilityDueToStatementEnclosingFunc,
nodeCaps,
@@ -9807,8 +9813,11 @@ namespace Slang
typedef SemanticsDeclReferenceVisitor<CapabilityDeclReferenceVisitor<ProcessFunc>> Base;
const ProcessFunc& handleReferenceFunc;
- CapabilityDeclReferenceVisitor(const ProcessFunc& processFunc, SemanticsContext const& outer)
+
+ SemanticsContext& outerContext;
+ CapabilityDeclReferenceVisitor(const ProcessFunc& processFunc, SemanticsContext& outer)
: handleReferenceFunc(processFunc)
+ , outerContext(outer)
, SemanticsDeclReferenceVisitor<CapabilityDeclReferenceVisitor<ProcessFunc>>(outer)
{
}
@@ -9834,7 +9843,7 @@ namespace Slang
targetCap.join(bodyCap);
if (targetCap.isInvalid())
{
- Base::getSink()->diagnose(targetCase->body->loc, Diagnostics::conflictingCapabilityDueToStatement, bodyCap, "target_switch", oldCap);
+ diagnoseCapabilityErrors(Base::getSink(), outerContext.getOptionSet(), targetCase->body->loc, Diagnostics::conflictingCapabilityDueToStatement, bodyCap, "target_switch", oldCap);
}
for (auto& conjunction : targetCap.getExpandedAtoms())
set.unionWith(conjunction);
@@ -9974,7 +9983,7 @@ namespace Slang
auto stageCaps = CapabilitySet(Profile(entryPointAttr->stage).getCapabilityName());
if (declaredCaps.isIncompatibleWith(stageCaps))
{
- getSink()->diagnose(funcDecl->loc, Diagnostics::stageIsInCompatibleWithCapabilityDefinition, funcDecl, stageCaps, declaredCaps);
+ diagnoseCapabilityErrors(getSink(), this->getOptionSet(), funcDecl->loc, Diagnostics::stageIsInCompatibleWithCapabilityDefinition, funcDecl, stageCaps, declaredCaps);
}
else
{
@@ -9994,7 +10003,9 @@ namespace Slang
{
if (funcDecl->inferredCapabilityRequirements != getAnyPlatformCapabilitySet())
{
- getSink()->diagnose(
+ diagnoseCapabilityErrors(
+ getSink(),
+ this->getOptionSet(),
funcDecl->loc,
Diagnostics::missingCapabilityRequirementOnPublicDecl,
funcDecl, funcDecl->inferredCapabilityRequirements);
@@ -10110,7 +10121,7 @@ namespace Slang
return defaultVis;
}
- void diagnoseCapabilityProvenance(DiagnosticSink* sink, Decl* decl, CapabilityAtom missingAtom)
+ void diagnoseCapabilityProvenance(CompilerOptionSet& optionSet, DiagnosticSink* sink, Decl* decl, CapabilityAtom missingAtom)
{
HashSet<Decl*> printedDecls;
auto thisModule = getModuleDecl(decl);
@@ -10141,7 +10152,7 @@ namespace Slang
}
if (declToPrint)
{
- sink->diagnose(declToPrint->loc, Diagnostics::seeDefinitionOf, declToPrint);
+ diagnoseCapabilityErrors(sink, optionSet, declToPrint->loc, Diagnostics::seeDefinitionOf, declToPrint);
}
}
@@ -10164,14 +10175,14 @@ namespace Slang
loc = refLoc;
}
else
- sink->diagnose(refLoc, Diagnostics::seeDefinitionOf, "statement");
+ diagnoseCapabilityErrors(sink, visitor->getOptionSet(), refLoc, Diagnostics::seeDefinitionOf, "statement");
}
});
if (!refDecl)
break;
if (printedDecls.add(refDecl))
{
- sink->diagnose(loc, Diagnostics::seeUsingOf, refDecl);
+ diagnoseCapabilityErrors(sink, visitor->getOptionSet(), loc, Diagnostics::seeUsingOf, refDecl);
decl = refDecl;
}
else
@@ -10220,7 +10231,7 @@ namespace Slang
continue;
if (decl->inferredCapabilityRequirements.isIncompatibleWith(atom))
{
- getSink()->diagnose(decl->loc, Diagnostics::declHasDependenciesNotDefinedOnTarget, decl, atom);
+ diagnoseCapabilityErrors(getSink(), this->getOptionSet(), decl->loc, Diagnostics::declHasDependenciesNotDefinedOnTarget, decl, atom);
diagnoseIncompatibleAtomProvenance(this, getSink(), decl, atom);
return;
}
@@ -10279,10 +10290,10 @@ namespace Slang
}
}
- getSink()->diagnose(decl->loc, diagnosticInfo, decl, missingAtom);
+ diagnoseCapabilityErrors(getSink(), this->getOptionSet(), decl->loc, diagnosticInfo, decl, missingAtom);
// Print provenances.
- diagnoseCapabilityProvenance(getSink(), decl, missingAtom);
+ diagnoseCapabilityProvenance(this->getOptionSet(), getSink(), decl, missingAtom);
}
}
diff --git a/source/slang/slang-check-impl.h b/source/slang/slang-check-impl.h
index 2f8565f7f..f0c6d693d 100644
--- a/source/slang/slang-check-impl.h
+++ b/source/slang/slang-check-impl.h
@@ -11,6 +11,14 @@
namespace Slang
{
+ template<typename P, typename... Args>
+ bool diagnoseCapabilityErrors(DiagnosticSink* sink, CompilerOptionSet& optionSet, P const& pos, DiagnosticInfo const& info, Args const&... args)
+ {
+ if (optionSet.getBoolOption(CompilerOptionName::IgnoreCapabilities))
+ return false;
+ return sink->diagnose(pos, info, args...);
+ }
+
/// Should the given `decl` be treated as a static rather than instance declaration?
bool isEffectivelyStatic(
Decl* decl);
@@ -793,6 +801,7 @@ namespace Slang
{}
SharedSemanticsContext* getShared() { return m_shared; }
+ CompilerOptionSet& getOptionSet() { return getShared()->getOptionSet(); }
ASTBuilder* getASTBuilder() { return m_astBuilder; }
DiagnosticSink* getSink() { return m_sink; }
@@ -2768,7 +2777,7 @@ namespace Slang
DeclVisibility getDeclVisibility(Decl* decl);
- void diagnoseCapabilityProvenance(DiagnosticSink* sink, Decl* decl, CapabilityAtom missingAtom);
+ void diagnoseCapabilityProvenance(CompilerOptionSet& optionSet, DiagnosticSink* sink, Decl* decl, CapabilityAtom missingAtom);
void _ensureAllDeclsRec(
SemanticsDeclVisitorBase* visitor,
diff --git a/source/slang/slang-check-shader.cpp b/source/slang/slang-check-shader.cpp
index 77a57d71e..d4e8bda6f 100644
--- a/source/slang/slang-check-shader.cpp
+++ b/source/slang/slang-check-shader.cpp
@@ -519,7 +519,7 @@ namespace Slang
targetCaps.join(stageCapabilitySet);
if (targetCaps.isIncompatibleWith(entryPointFuncDecl->inferredCapabilityRequirements))
{
- sink->diagnose(entryPointFuncDecl, Diagnostics::entryPointUsesUnavailableCapability, entryPointFuncDecl, entryPointFuncDecl->inferredCapabilityRequirements, targetCaps);
+ diagnoseCapabilityErrors(sink, linkage->m_optionSet, entryPointFuncDecl, Diagnostics::entryPointUsesUnavailableCapability, entryPointFuncDecl, entryPointFuncDecl->inferredCapabilityRequirements, targetCaps);
auto& interredCapConjunctions = entryPointFuncDecl->inferredCapabilityRequirements.getExpandedAtoms();
// Find out what exactly is incompatible and print out a trace of provenance to
@@ -533,7 +533,7 @@ namespace Slang
{
if (CapabilityConjunctionSet(inferredAtom).isIncompatibleWith(atom))
{
- diagnoseCapabilityProvenance(sink, entryPointFuncDecl, inferredAtom);
+ diagnoseCapabilityProvenance(linkage->m_optionSet, sink, entryPointFuncDecl, inferredAtom);
goto breakLabel;
}
}
diff --git a/source/slang/slang-options.cpp b/source/slang/slang-options.cpp
index 3f17d6d44..896388db0 100644
--- a/source/slang/slang-options.cpp
+++ b/source/slang/slang-options.cpp
@@ -289,6 +289,7 @@ void initCommandOptions(CommandOptions& options)
{ OptionKind::Language, "-lang", "-lang <language>", "Set the language for the following input files."},
{ OptionKind::MatrixLayoutColumn, "-matrix-layout-column-major", nullptr, "Set the default matrix layout to column-major."},
{ OptionKind::MatrixLayoutRow,"-matrix-layout-row-major", nullptr, "Set the default matrix layout to row-major."},
+ { OptionKind::IgnoreCapabilities,"-ignore-capabilities", nullptr, "Do not warn or error if capabilities are violated"},
{ OptionKind::ModuleName, "-module-name", "-module-name <name>",
"Set the module name to use when compiling multiple .slang source files into a single module."},
{ OptionKind::Output, "-o", "-o <path>",
@@ -1682,6 +1683,7 @@ SlangResult OptionsParser::_parse(
case OptionKind::VulkanUseEntryPointName:
case OptionKind::VulkanUseGLLayout:
case OptionKind::VulkanEmitReflection:
+ case OptionKind::IgnoreCapabilities:
case OptionKind::DefaultImageFormatUnknown:
case OptionKind::Obfuscate:
case OptionKind::OutputIncludes: