From 15055d20c143cb398bd3e269541eebf24777390a Mon Sep 17 00:00:00 2001 From: jsmall-nvidia Date: Mon, 22 Aug 2022 10:08:25 -0400 Subject: 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. --- source/compiler-core/slang-fxc-compiler.cpp | 44 ++++++++++++++++++----------- 1 file changed, 28 insertions(+), 16 deletions(-) (limited to 'source/compiler-core/slang-fxc-compiler.cpp') diff --git a/source/compiler-core/slang-fxc-compiler.cpp b/source/compiler-core/slang-fxc-compiler.cpp index d9d506221..21cd14759 100644 --- a/source/compiler-core/slang-fxc-compiler.cpp +++ b/source/compiler-core/slang-fxc-compiler.cpp @@ -17,6 +17,10 @@ #include "slang-include-system.h" #include "slang-source-loc.h" +#include "slang-artifact-associated-impl.h" + +#include "slang-artifact-diagnostic-util.h" + #include "../core/slang-shared-library.h" // Enable calling through to `fxc` or `dxc` to @@ -113,7 +117,7 @@ public: typedef DownstreamCompilerBase Super; // IDownstreamCompiler - virtual SLANG_NO_THROW SlangResult SLANG_MCALL compile(const CompileOptions& options, RefPtr& outResult) SLANG_OVERRIDE; + virtual SLANG_NO_THROW SlangResult SLANG_MCALL compile(const CompileOptions& options, IArtifact** outArtifact) SLANG_OVERRIDE; virtual SLANG_NO_THROW SlangResult SLANG_MCALL disassemble(SlangCompileTarget sourceBlobTarget, const void* blob, size_t blobSize, ISlangBlob** out) SLANG_OVERRIDE; virtual SLANG_NO_THROW bool SLANG_MCALL isFileBased() SLANG_OVERRIDE { return false; } @@ -148,7 +152,7 @@ SlangResult FXCDownstreamCompiler::init(ISlangSharedLibrary* library) return SLANG_OK; } -static SlangResult _parseDiagnosticLine(const UnownedStringSlice& line, List& lineSlices, DownstreamDiagnostic& outDiagnostic) +static SlangResult _parseDiagnosticLine(CharSliceAllocator& allocator, const UnownedStringSlice& line, List& lineSlices, ArtifactDiagnostic& outDiagnostic) { /* tests/diagnostics/syntax-error-intrinsic.slang(14,2): error X3000: syntax error: unexpected token '@' */ if (lineSlices.getCount() < 3) @@ -156,26 +160,26 @@ static SlangResult _parseDiagnosticLine(const UnownedStringSlice& line, List& outResult) +SlangResult FXCDownstreamCompiler::compile(const CompileOptions& options, IArtifact** outArtifact) { // This compiler doesn't read files, they should be read externally and stored in sourceContents/sourceContentsPath if (options.sourceFiles.getCount() > 0) @@ -284,17 +288,19 @@ SlangResult FXCDownstreamCompiler::compile(const CompileOptions& options, RefPtr codeBlob.writeRef(), diagnosticsBlob.writeRef()); - DownstreamDiagnostics diagnostics; + auto diagnostics = ArtifactDiagnostics::create(); // HRESULT is compatible with SlangResult - diagnostics.result = hr; + diagnostics->setResult(hr); + + CharSliceAllocator allocator; if (diagnosticsBlob) { UnownedStringSlice diagnosticText = _getSlice(diagnosticsBlob); - diagnostics.rawDiagnostics = diagnosticText; + diagnostics->setRaw(asCharSlice(diagnosticText)); - SlangResult diagnosticParseRes = DownstreamDiagnostic::parseColonDelimitedDiagnostics(diagnosticText, 0, _parseDiagnosticLine, diagnostics.diagnostics); + SlangResult diagnosticParseRes = ArtifactDiagnosticUtil::parseColonDelimitedDiagnostics(allocator, diagnosticText, 0, _parseDiagnosticLine, diagnostics); SLANG_UNUSED(diagnosticParseRes); SLANG_ASSERT(SLANG_SUCCEEDED(diagnosticParseRes)); } @@ -302,13 +308,19 @@ SlangResult FXCDownstreamCompiler::compile(const CompileOptions& options, RefPtr // If FXC failed, make sure we have an error in the diagnostics if (FAILED(hr)) { - diagnostics.requireErrorDiagnostic(); + diagnostics->requireErrorDiagnostic(); } - // ID3DBlob is compatible with ISlangBlob, so just cast away... - ISlangBlob* slangCodeBlob = (ISlangBlob*)codeBlob.get(); + auto artifact = ArtifactUtil::createArtifactForCompileTarget(options.targetType); + artifact->addAssociated(diagnostics); + + if (codeBlob) + { + // ID3DBlob is compatible with ISlangBlob, so just cast away... + artifact->addRepresentationUnknown((ISlangBlob*)codeBlob.get()); + } - outResult = new BlobDownstreamCompileResult(diagnostics, slangCodeBlob); + *outArtifact = artifact.detach(); return SLANG_OK; } -- cgit v1.2.3