summaryrefslogtreecommitdiffstats
path: root/source/compiler-core
diff options
context:
space:
mode:
Diffstat (limited to 'source/compiler-core')
-rw-r--r--source/compiler-core/slang-artifact-container-util.cpp100
-rw-r--r--source/compiler-core/slang-artifact-container-util.h8
-rw-r--r--source/compiler-core/slang-artifact-desc-util.cpp10
-rw-r--r--source/compiler-core/slang-artifact-util.cpp6
4 files changed, 105 insertions, 19 deletions
diff --git a/source/compiler-core/slang-artifact-container-util.cpp b/source/compiler-core/slang-artifact-container-util.cpp
index 6121df964..dfc385f9a 100644
--- a/source/compiler-core/slang-artifact-container-util.cpp
+++ b/source/compiler-core/slang-artifact-container-util.cpp
@@ -191,34 +191,24 @@ SlangResult ArtifactContainerWriter::getBaseName(IArtifact* artifact, String& ou
SlangResult ArtifactContainerWriter::writeInDirectory(IArtifact* artifact, const String& baseName)
{
-
// TODO(JS):
// We could now output information about the desc/artifact, say as some json.
// For now we assume the extension is good enough for most purposes.
+ // If it's an "arbitrary" container, we don't need to write it
+ if (artifact->getDesc().kind != ArtifactKind::Container)
{
// We can't write it without a blob
ComPtr<ISlangBlob> blob;
- const auto res = artifact->loadBlob(ArtifactKeep::No, blob.writeRef());
+ SLANG_RETURN_ON_FAIL(artifact->loadBlob(ArtifactKeep::No, blob.writeRef()));
- if (SLANG_FAILED(res))
- {
- // If it failed and it's significant the whole write fails
- if (ArtifactUtil::isSignificant(artifact))
- {
- return res;
- }
- }
-
- {
- // Get the name of the artifact
- StringBuilder artifactName;
- SLANG_RETURN_ON_FAIL(ArtifactDescUtil::calcNameForDesc(artifact->getDesc(), baseName.getUnownedSlice(), artifactName));
+ // Get the name of the artifact
+ StringBuilder artifactName;
+ SLANG_RETURN_ON_FAIL(ArtifactDescUtil::calcNameForDesc(artifact->getDesc(), baseName.getUnownedSlice(), artifactName));
- const auto combinedPath = Path::combine(m_entry.path, artifactName);
- // Write out the blob
- SLANG_RETURN_ON_FAIL(m_fileSystem->saveFileBlob(combinedPath.getBuffer(), blob));
- }
+ const auto combinedPath = Path::combine(m_entry.path, artifactName);
+ // Write out the blob
+ SLANG_RETURN_ON_FAIL(m_fileSystem->saveFileBlob(combinedPath.getBuffer(), blob));
}
{
@@ -837,4 +827,76 @@ SlangResult ArtifactContainerUtil::readContainer(IArtifact* artifact, ComPtr<IAr
return SLANG_OK;
}
+/* static */SlangResult ArtifactContainerUtil::filter(IArtifact* artifact, ComPtr<IArtifact>& outArtifact)
+{
+ outArtifact.setNull();
+
+ // Copy the artifact
+ auto dstArtifact = ArtifactUtil::createArtifact(artifact->getDesc(), artifact->getName());
+
+ ComPtr<ISlangBlob> blob;
+
+ if (artifact->getDesc().kind != ArtifactKind::Container)
+ {
+ // We can't write it without a blob
+ const auto res = artifact->loadBlob(ArtifactKeep::No, blob.writeRef());
+
+ if (SLANG_FAILED(res))
+ {
+ // If it failed and it's significant the whole write fails
+ if (ArtifactUtil::isSignificant(artifact))
+ {
+ return res;
+ }
+ }
+ else
+ {
+ // Add the blob to the destination
+ dstArtifact->addRepresentationUnknown(blob);
+ }
+ }
+
+ // Copy the children after filtering
+ {
+ for (IArtifact* child : artifact->getChildren())
+ {
+ ComPtr<IArtifact> dstChild;
+ SLANG_RETURN_ON_FAIL(filter(child, dstChild));
+
+ if (dstChild)
+ {
+ dstArtifact->addChild(dstChild);
+ }
+ }
+ }
+
+ // Copy the associated after filtering
+ {
+ for (IArtifact* assoc : artifact->getAssociated())
+ {
+ ComPtr<IArtifact> dstAssoc;
+ SLANG_RETURN_ON_FAIL(filter(assoc, dstAssoc));
+
+ if (dstAssoc)
+ {
+ dstArtifact->addAssociated(dstAssoc);
+ }
+ }
+ }
+
+ // We only return the artifact if any of the following are true
+ // 1) It has a blob representation
+ // 2) It contains children or associated artifacts
+
+ if (blob ||
+ dstArtifact->getChildren().count ||
+ dstArtifact->getAssociated().count)
+ {
+ outArtifact = dstArtifact;
+ }
+
+ // If we return an artifact or not, this was successful
+ return SLANG_OK;
+}
+
} // namespace Slang
diff --git a/source/compiler-core/slang-artifact-container-util.h b/source/compiler-core/slang-artifact-container-util.h
index c6e836245..0ee99de26 100644
--- a/source/compiler-core/slang-artifact-container-util.h
+++ b/source/compiler-core/slang-artifact-container-util.h
@@ -36,6 +36,14 @@ struct ArtifactContainerUtil
/// Read an artifact that represents a container as an artifact hierarchy
static SlangResult readContainer(IArtifact* artifact, ComPtr<IArtifact>& outArtifact);
+
+ /// Creates a copy of artifact where
+ /// * All artifacts are blobs
+ /// * Any generic containers that are empty are dropped
+ /// * Any sub artifact that can't be blobed and isn't significant is ignored
+ ///
+ /// A future improvement would be to take a function to also control what makes it to the output
+ static SlangResult filter(IArtifact* artifact, ComPtr<IArtifact>& outArtifact);
};
} // namespace Slang
diff --git a/source/compiler-core/slang-artifact-desc-util.cpp b/source/compiler-core/slang-artifact-desc-util.cpp
index 67501782a..e10ceee07 100644
--- a/source/compiler-core/slang-artifact-desc-util.cpp
+++ b/source/compiler-core/slang-artifact-desc-util.cpp
@@ -753,6 +753,16 @@ SlangResult ArtifactDescUtil::appendDefaultExtension(const ArtifactDesc& desc, S
default: break;
}
+ if (ArtifactDescUtil::isGpuUsable(desc))
+ {
+ auto ext = _getPayloadExtension(desc.payload);
+ if (ext.getLength())
+ {
+ out << ext;
+ return SLANG_OK;
+ }
+ }
+
if (ArtifactDescUtil::isCpuLikeTarget(desc) && !isDerivedFrom(desc.payload, ArtifactPayload::Source))
{
return appendCpuExtensionForKind(desc.kind, out);
diff --git a/source/compiler-core/slang-artifact-util.cpp b/source/compiler-core/slang-artifact-util.cpp
index 00884c96f..7420f6843 100644
--- a/source/compiler-core/slang-artifact-util.cpp
+++ b/source/compiler-core/slang-artifact-util.cpp
@@ -83,6 +83,12 @@ static bool _checkRecursive(ArtifactUtil::FindStyle findStyle)
return false;
}
+ /* We currently can't write out diagnostics, so for now we'll say they are insignificant */
+ if (isDerivedFrom(desc.payload, ArtifactPayload::Diagnostics))
+ {
+ return false;
+ }
+
return true;
}