diff options
| author | jsmall-nvidia <jsmall@nvidia.com> | 2022-08-22 10:08:25 -0400 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2022-08-22 10:08:25 -0400 |
| commit | 15055d20c143cb398bd3e269541eebf24777390a (patch) | |
| tree | 81f96a53824765fabc1fbb81d2d588476996eaa9 /source/slang | |
| parent | af70651a4843b16dd24e14b5cedffe399ebeb862 (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.cpp | 50 | ||||
| -rw-r--r-- | source/slang/slang-emit.cpp | 4 | ||||
| -rw-r--r-- | source/slang/slang-ir-link.h | 8 | ||||
| -rw-r--r-- | source/slang/slang-ir-metadata.cpp | 2 | ||||
| -rw-r--r-- | source/slang/slang-ir-metadata.h | 4 | ||||
| -rw-r--r-- | source/slang/slang.cpp | 4 |
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; |
