summaryrefslogtreecommitdiff
path: root/source/slang
diff options
context:
space:
mode:
authorjsmall-nvidia <jsmall@nvidia.com>2022-08-22 10:08:25 -0400
committerGitHub <noreply@github.com>2022-08-22 10:08:25 -0400
commit15055d20c143cb398bd3e269541eebf24777390a (patch)
tree81f96a53824765fabc1fbb81d2d588476996eaa9 /source/slang
parentaf70651a4843b16dd24e14b5cedffe399ebeb862 (diff)
Replace DownstreamCompileResult with Artifact (#2369)
* #include an absolute path didn't work - because paths were taken to always be relative. * WIP replacing DownstreamCompileResult. * First attempt at replacing DownstreamCompileResult with IArtifact and associated types. * Small renaming around CharSlice. * ICastable -> ISlangCastable Added IClonable Fix issue with cloning in ArtifactDiagnostics. * Only add the blob if one is defined in DXC. * Guard adding blob representation. * Make cloneInterface available across code base. Set enums backing type for ArtifactDiagnostic. * Added ::create for ArtifactDiagnostics.
Diffstat (limited to 'source/slang')
-rw-r--r--source/slang/slang-compiler.cpp50
-rw-r--r--source/slang/slang-emit.cpp4
-rw-r--r--source/slang/slang-ir-link.h8
-rw-r--r--source/slang/slang-ir-metadata.cpp2
-rw-r--r--source/slang/slang-ir-metadata.h4
-rw-r--r--source/slang/slang.cpp4
6 files changed, 34 insertions, 38 deletions
diff --git a/source/slang/slang-compiler.cpp b/source/slang/slang-compiler.cpp
index d175277c8..a41463ad5 100644
--- a/source/slang/slang-compiler.cpp
+++ b/source/slang/slang-compiler.cpp
@@ -20,6 +20,7 @@
#include "../compiler-core/slang-artifact-impl.h"
#include "../compiler-core/slang-artifact-util.h"
#include "../compiler-core/slang-artifact-associated.h"
+#include "../compiler-core/slang-artifact-diagnostic-util.h"
// Artifact output
#include "slang-artifact-output-util.h"
@@ -855,13 +856,12 @@ namespace Slang
return true;
}
- static Severity _getDiagnosticSeverity(DownstreamDiagnostic::Severity severity)
+ static Severity _getDiagnosticSeverity(ArtifactDiagnostic::Severity severity)
{
- typedef DownstreamDiagnostic::Severity DownstreamSeverity;
switch (severity)
{
- case DownstreamSeverity::Warning: return Severity::Warning;
- case DownstreamSeverity::Info: return Severity::Note;
+ case ArtifactDiagnostic::Severity::Warning: return Severity::Warning;
+ case ArtifactDiagnostic::Severity::Info: return Severity::Note;
default: return Severity::Error;
}
}
@@ -1077,10 +1077,10 @@ namespace Slang
sourceLanguage = (SourceLanguage)TypeConvertUtil::getSourceLanguageFromTarget((SlangCompileTarget)sourceTarget);
}
- ComPtr<IPostEmitMetadata> metadata;
+ ComPtr<IArtifactPostEmitMetadata> metadata;
if (sourceArtifact)
{
- metadata = findAssociated<IPostEmitMetadata>(sourceArtifact);
+ metadata = findAssociated<IArtifactPostEmitMetadata>(sourceArtifact);
ComPtr<ISlangBlob> blob;
SLANG_RETURN_ON_FAIL(sourceArtifact->loadBlob(ArtifactKeep::No, blob.writeRef()));
@@ -1354,74 +1354,70 @@ namespace Slang
}
// Compile
- RefPtr<DownstreamCompileResult> downstreamCompileResult;
+ ComPtr<IArtifact> artifact;
auto downstreamStartTime = std::chrono::high_resolution_clock::now();
- SLANG_RETURN_ON_FAIL(compiler->compile(options, downstreamCompileResult));
+ SLANG_RETURN_ON_FAIL(compiler->compile(options, artifact.writeRef()));
auto downstreamElapsedTime =
(std::chrono::high_resolution_clock::now() - downstreamStartTime).count() * 0.000000001;
getSession()->addDownstreamCompileTime(downstreamElapsedTime);
- const auto& diagnostics = downstreamCompileResult->getDiagnostics();
+ auto diagnostics = findAssociated<IArtifactDiagnostics>(artifact);
- if (diagnostics.diagnostics.getCount())
+ if (diagnostics->getCount())
{
StringBuilder compilerText;
DownstreamCompilerUtil::appendAsText(compiler->getDesc(), compilerText);
StringBuilder builder;
- for (const auto& diagnostic : diagnostics.diagnostics)
+ auto const diagnosticCount = diagnostics->getCount();
+ for (Index i = 0; i < diagnosticCount; ++i)
{
+ const auto& diagnostic = *diagnostics->getAt(i);
+
builder.Clear();
const Severity severity = _getDiagnosticSeverity(diagnostic.severity);
- if (diagnostic.filePath.getLength() == 0 && diagnostic.fileLine == 0 && severity == Severity::Note)
+ if (diagnostic.filePath.count == 0 && diagnostic.location.line == 0 && severity == Severity::Note)
{
// If theres no filePath line number and it's info, output severity and text alone
builder << getSeverityName(severity) << " : ";
}
else
{
- if (diagnostic.filePath.getLength())
+ if (diagnostic.filePath.count)
{
- builder << diagnostic.filePath;
+ builder << asStringSlice(diagnostic.filePath);
}
- if (diagnostic.fileLine)
+ if (diagnostic.location.line)
{
- builder << "(" << diagnostic.fileLine <<")";
+ builder << "(" << diagnostic.location.line <<")";
}
builder << ": ";
- if (diagnostic.stage == DownstreamDiagnostic::Stage::Link)
+ if (diagnostic.stage == ArtifactDiagnostic::Stage::Link)
{
builder << "link ";
}
builder << getSeverityName(severity);
- builder << " " << diagnostic.code << ": ";
+ builder << " " << asStringSlice(diagnostic.code) << ": ";
}
- builder << diagnostic.text;
+ builder << asStringSlice(diagnostic.text);
reportExternalCompileError(compilerText.getBuffer(), severity, SLANG_OK, builder.getUnownedSlice(), sink);
}
}
// If any errors are emitted, then we are done
- if (diagnostics.has(DownstreamDiagnostic::Severity::Error))
+ if (diagnostics->hasOfAtLeastSeverity(ArtifactDiagnostic::Severity::Error))
{
return SLANG_FAIL;
}
- // Create the artifact that encapsulates the result
- auto artifact = ArtifactUtil::createArtifactForCompileTarget(asExternal(target));
-
- // Wrap the downstream compile result
- auto objRep = new ObjectArtifactRepresentation(DownstreamCompileResult::getTypeGuid(), downstreamCompileResult);
- artifact->addRepresentation(objRep);
-
if (metadata)
{
artifact->addAssociated(metadata);
diff --git a/source/slang/slang-emit.cpp b/source/slang/slang-emit.cpp
index 6e78c82dc..3ec03d0e7 100644
--- a/source/slang/slang-emit.cpp
+++ b/source/slang/slang-emit.cpp
@@ -837,7 +837,7 @@ Result linkAndOptimizeIR(
#endif
validateIRModuleIfEnabled(codeGenContext, irModule);
- auto metadata = new PostEmitMetadataImpl;
+ auto metadata = new ArtifactPostEmitMetadata;
outLinkedIR.metadata = metadata;
collectMetadata(irModule, *metadata);
@@ -928,7 +928,7 @@ SlangResult CodeGenContext::emitEntryPointsSourceFromIR(ComPtr<IArtifact>& outAr
SLANG_RETURN_ON_FAIL(sourceEmitter->init());
- ComPtr<IPostEmitMetadata> metadata;
+ ComPtr<IArtifactPostEmitMetadata> metadata;
{
LinkingAndOptimizationOptions linkingAndOptimizationOptions;
diff --git a/source/slang/slang-ir-link.h b/source/slang/slang-ir-link.h
index 5fac8dde2..2f255b041 100644
--- a/source/slang/slang-ir-link.h
+++ b/source/slang/slang-ir-link.h
@@ -11,10 +11,10 @@ namespace Slang
struct LinkedIR
{
- RefPtr<IRModule> module;
- IRVarLayout* globalScopeVarLayout;
- List<IRFunc*> entryPoints;
- ComPtr<IPostEmitMetadata> metadata;
+ RefPtr<IRModule> module;
+ IRVarLayout* globalScopeVarLayout;
+ List<IRFunc*> entryPoints;
+ ComPtr<IArtifactPostEmitMetadata> metadata;
};
diff --git a/source/slang/slang-ir-metadata.cpp b/source/slang/slang-ir-metadata.cpp
index b6ab2b922..641c272a2 100644
--- a/source/slang/slang-ir-metadata.cpp
+++ b/source/slang/slang-ir-metadata.cpp
@@ -39,7 +39,7 @@ static void _insertBinding(List<ShaderBindingRange>& ranges, LayoutResourceKind
}
// Collects the metadata from the provided IR module, saves it in outMetadata.
-void collectMetadata(const IRModule* irModule, PostEmitMetadataImpl& outMetadata)
+void collectMetadata(const IRModule* irModule, ArtifactPostEmitMetadata& outMetadata)
{
// Scan the instructions looking for global resource declarations
for (const auto& inst : irModule->getGlobalInsts())
diff --git a/source/slang/slang-ir-metadata.h b/source/slang/slang-ir-metadata.h
index f5e3229ae..acc89b7aa 100644
--- a/source/slang/slang-ir-metadata.h
+++ b/source/slang/slang-ir-metadata.h
@@ -4,9 +4,9 @@
namespace Slang
{
-class PostEmitMetadataImpl;
+class ArtifactPostEmitMetadata;
struct IRModule;
-void collectMetadata(const IRModule* irModule, PostEmitMetadataImpl& outMetadata);
+void collectMetadata(const IRModule* irModule, ArtifactPostEmitMetadata& outMetadata);
}
diff --git a/source/slang/slang.cpp b/source/slang/slang.cpp
index 1b8ae0d8f..3fce0e6d9 100644
--- a/source/slang/slang.cpp
+++ b/source/slang/slang.cpp
@@ -2737,7 +2737,7 @@ void Linkage::_diagnoseErrorInImportedModule(
{
for(auto info = m_modulesBeingImported; info; info = info->next)
{
- sink->diagnose(info->importLoc, Diagnostics::errorInImportedModule, info->name);
+ sink->diagnose(info->importLoc, Diagnostics::errorInImportedModule, info->name);
}
if (!isInLanguageServer())
{
@@ -5057,7 +5057,7 @@ SlangResult EndToEndCompileRequest::isParameterLocationUsed(Int entryPointIndex,
return SLANG_E_INVALID_ARG;
// Find a rep
- auto metadata = findAssociated<IPostEmitMetadata>(artifact);
+ auto metadata = findAssociated<IArtifactPostEmitMetadata>(artifact);
if (!metadata)
return SLANG_E_NOT_AVAILABLE;