summaryrefslogtreecommitdiffstats
path: root/source
diff options
context:
space:
mode:
Diffstat (limited to 'source')
-rw-r--r--source/compiler-core/slang-downstream-compiler.h3
-rw-r--r--source/compiler-core/slang-dxc-compiler.cpp51
-rw-r--r--source/compiler-core/slang-glslang-compiler.cpp41
-rw-r--r--source/core/slang-md5.cpp5
-rw-r--r--source/core/slang-md5.h2
-rw-r--r--source/slang/slang-ast-base.h2
-rw-r--r--source/slang/slang-ast-type.cpp1
-rw-r--r--source/slang/slang-ast-type.h3
-rw-r--r--source/slang/slang-ast-val.h2
-rw-r--r--source/slang/slang-hash-utils.h9
-rw-r--r--source/slang/slang.cpp12
11 files changed, 121 insertions, 10 deletions
diff --git a/source/compiler-core/slang-downstream-compiler.h b/source/compiler-core/slang-downstream-compiler.h
index a543f8e46..e7ab4ddad 100644
--- a/source/compiler-core/slang-downstream-compiler.h
+++ b/source/compiler-core/slang-downstream-compiler.h
@@ -191,6 +191,8 @@ public:
virtual SLANG_NO_THROW bool SLANG_MCALL canConvert(const ArtifactDesc& from, const ArtifactDesc& to) = 0;
/// Converts an artifact `from` to a desc of `to` and puts the result in outArtifact
virtual SLANG_NO_THROW SlangResult SLANG_MCALL convert(IArtifact* from, const ArtifactDesc& to, IArtifact** outArtifact) = 0;
+ /// Get the version of this compiler
+ virtual SLANG_NO_THROW SlangResult SLANG_MCALL getVersionString(slang::IBlob** outVersionString) = 0;
/// True if underlying compiler uses file system to communicate source
virtual SLANG_NO_THROW bool SLANG_MCALL isFileBased() = 0;
@@ -208,6 +210,7 @@ public:
virtual SLANG_NO_THROW const Desc& SLANG_MCALL getDesc() SLANG_OVERRIDE { return m_desc; }
virtual SLANG_NO_THROW bool SLANG_MCALL canConvert(const ArtifactDesc& from, const ArtifactDesc& to) SLANG_OVERRIDE { SLANG_UNUSED(from); SLANG_UNUSED(to); return false; }
virtual SLANG_NO_THROW SlangResult SLANG_MCALL convert(IArtifact* from, const ArtifactDesc& to, IArtifact** outArtifact) SLANG_OVERRIDE;
+ virtual SLANG_NO_THROW SlangResult SLANG_MCALL getVersionString(slang::IBlob** outVersionString) SLANG_OVERRIDE { *outVersionString = nullptr; return SLANG_FAIL; }
DownstreamCompilerBase(const Desc& desc):
m_desc(desc)
diff --git a/source/compiler-core/slang-dxc-compiler.cpp b/source/compiler-core/slang-dxc-compiler.cpp
index c92eea47b..6619d000c 100644
--- a/source/compiler-core/slang-dxc-compiler.cpp
+++ b/source/compiler-core/slang-dxc-compiler.cpp
@@ -14,6 +14,8 @@
#include "../core/slang-semantic-version.h"
#include "../core/slang-char-util.h"
+#include "../core/slang-digest.h"
+
#include "slang-include-system.h"
#include "slang-source-loc.h"
@@ -168,6 +170,7 @@ public:
virtual SLANG_NO_THROW bool SLANG_MCALL canConvert(const ArtifactDesc& from, const ArtifactDesc& to) SLANG_OVERRIDE;
virtual SLANG_NO_THROW SlangResult SLANG_MCALL convert(IArtifact* from, const ArtifactDesc& to, IArtifact** outArtifact) SLANG_OVERRIDE;
virtual SLANG_NO_THROW bool SLANG_MCALL isFileBased() SLANG_OVERRIDE { return false; }
+ virtual SLANG_NO_THROW SlangResult SLANG_MCALL getVersionString(slang::IBlob** outVersionString) SLANG_OVERRIDE;
/// Must be called before use
SlangResult init(ISlangSharedLibrary* library);
@@ -191,7 +194,7 @@ SlangResult DXCDownstreamCompiler::init(ISlangSharedLibrary* library)
return SLANG_FAIL;
}
- m_desc = Desc(SLANG_PASS_THROUGH_DXC);
+ m_desc = Desc(SLANG_PASS_THROUGH_DXC);
return SLANG_OK;
}
@@ -572,6 +575,52 @@ SlangResult DXCDownstreamCompiler::convert(IArtifact* from, const ArtifactDesc&
return SLANG_OK;
}
+SlangResult DXCDownstreamCompiler::getVersionString(slang::IBlob** outVersionString)
+{
+ ComPtr<IDxcCompiler> dxcCompiler;
+ SLANG_RETURN_ON_FAIL(m_createInstance(CLSID_DxcCompiler, __uuidof(dxcCompiler), (LPVOID*)dxcCompiler.writeRef()));
+
+ ComPtr<ISlangBlob> version;
+ ComPtr<IDxcVersionInfo> versionInfo;
+ if (SLANG_SUCCEEDED(dxcCompiler->QueryInterface(versionInfo.writeRef())))
+ {
+ // Because the major/minor version alone does not necessarily capture different releases
+ // of the DX compiler, we also need to query for the commit hash. If we are unable to
+ // obtain the commit hash, then we return the shared library timestamp instead.
+ ComPtr<IDxcVersionInfo2> versionInfo2;
+ if (SLANG_SUCCEEDED(dxcCompiler->QueryInterface(versionInfo2.writeRef())))
+ {
+ uint32_t major;
+ uint32_t minor;
+ versionInfo->GetVersion(&major, &minor);
+
+ StringBuilder versionString;
+ versionString.append(major);
+ versionString.append(".");
+ versionString.append(minor);
+
+ char* commitHash;
+ uint32_t unused;
+ versionInfo2->GetCommitInfo(&unused, &commitHash);
+
+ versionString.append(commitHash);
+ CoTaskMemFree(commitHash);
+
+ version = StringBlob::create(versionString.getBuffer());
+ *outVersionString = version.detach();
+ return SLANG_OK;
+ }
+ }
+
+ // If either of the QueryInterface calls fails, we return the shared library timestamp
+ // as the version instead.
+ auto timestamp = SharedLibraryUtils::getSharedLibraryTimestamp(m_createInstance);
+ auto timestampString = String(timestamp);
+ version = StringBlob::create(timestampString.getBuffer());
+ *outVersionString = version.detach();
+ return SLANG_OK;
+}
+
/* static */SlangResult DXCDownstreamCompilerUtil::locateCompilers(const String& path, ISlangSharedLibraryLoader* loader, DownstreamCompilerSet* set)
{
ComPtr<ISlangSharedLibrary> library;
diff --git a/source/compiler-core/slang-glslang-compiler.cpp b/source/compiler-core/slang-glslang-compiler.cpp
index d6ae59690..26cbf3292 100644
--- a/source/compiler-core/slang-glslang-compiler.cpp
+++ b/source/compiler-core/slang-glslang-compiler.cpp
@@ -14,6 +14,8 @@
#include "../core/slang-semantic-version.h"
#include "../core/slang-char-util.h"
+#include "../core/slang-digest.h"
+
#include "slang-artifact-associated-impl.h"
#include "slang-artifact-desc-util.h"
@@ -47,6 +49,7 @@ public:
virtual SLANG_NO_THROW bool SLANG_MCALL canConvert(const ArtifactDesc& from, const ArtifactDesc& to) SLANG_OVERRIDE;
virtual SLANG_NO_THROW SlangResult SLANG_MCALL convert(IArtifact* from, const ArtifactDesc& to, IArtifact** outArtifact) SLANG_OVERRIDE;
virtual SLANG_NO_THROW bool SLANG_MCALL isFileBased() SLANG_OVERRIDE { return false; }
+ virtual SLANG_NO_THROW SlangResult SLANG_MCALL getVersionString(slang::IBlob** outVersionString) SLANG_OVERRIDE;
/// Must be called before use
SlangResult init(ISlangSharedLibrary* library);
@@ -60,7 +63,7 @@ protected:
glslang_CompileFunc_1_0 m_compile_1_0 = nullptr;
glslang_CompileFunc_1_1 m_compile_1_1 = nullptr;
- ComPtr<ISlangSharedLibrary> m_sharedLibrary;
+ ComPtr<ISlangSharedLibrary> m_sharedLibrary;
};
SlangResult GlslangDownstreamCompiler::init(ISlangSharedLibrary* library)
@@ -78,6 +81,20 @@ SlangResult GlslangDownstreamCompiler::init(ISlangSharedLibrary* library)
// It's not clear how to query for a version, but we can get a version number from the header
m_desc = Desc(SLANG_PASS_THROUGH_GLSLANG);
+ Slang::String filename;
+ if (m_compile_1_1)
+ {
+ filename = Slang::SharedLibraryUtils::getSharedLibraryFileName((void*)m_compile_1_1);
+ }
+ else if (m_compile_1_0)
+ {
+ filename = Slang::SharedLibraryUtils::getSharedLibraryFileName((void*)m_compile_1_0);
+ }
+ else
+ {
+ return SLANG_FAIL;
+ }
+
return SLANG_OK;
}
@@ -277,6 +294,28 @@ SlangResult GlslangDownstreamCompiler::convert(IArtifact* from, const ArtifactDe
return SLANG_OK;
}
+SlangResult GlslangDownstreamCompiler::getVersionString(slang::IBlob** outVersionString)
+{
+ uint64_t timestamp;
+ if (m_compile_1_1)
+ {
+ timestamp = SharedLibraryUtils::getSharedLibraryTimestamp((void*)m_compile_1_1);
+ }
+ else if (m_compile_1_0)
+ {
+ timestamp = SharedLibraryUtils::getSharedLibraryTimestamp((void*)m_compile_1_0);
+ }
+ else
+ {
+ return SLANG_FAIL;
+ }
+
+ auto timestampString = String(timestamp);
+ ComPtr<ISlangBlob> version = StringBlob::create(timestampString.getBuffer());
+ *outVersionString = version.detach();
+ return SLANG_OK;
+}
+
/* static */SlangResult GlslangDownstreamCompilerUtil::locateCompilers(const String& path, ISlangSharedLibraryLoader* loader, DownstreamCompilerSet* set)
{
ComPtr<ISlangSharedLibrary> library;
diff --git a/source/core/slang-md5.cpp b/source/core/slang-md5.cpp
index 95b4816bf..7371b21d2 100644
--- a/source/core/slang-md5.cpp
+++ b/source/core/slang-md5.cpp
@@ -232,6 +232,11 @@ namespace Slang
update(ctx, hash.values, sizeof(hash.values));
}
+ void MD5HashGen::update(MD5Context* ctx, ISlangBlob* blob)
+ {
+ update(ctx, blob->getBufferPointer(), blob->getBufferSize());
+ }
+
void MD5HashGen::update(MD5Context* ctx, const void* data, SlangInt size)
{
MD5_u32plus saved_lo;
diff --git a/source/core/slang-md5.h b/source/core/slang-md5.h
index 8c51a03ec..2e99fb667 100644
--- a/source/core/slang-md5.h
+++ b/source/core/slang-md5.h
@@ -70,6 +70,8 @@ namespace Slang
void update(MD5Context* ctx, String str);
// Helper update function for Checksums
void update(MD5Context* ctx, const slang::Digest& checksum);
+ // Helper update function for ISlangBlob
+ void update(MD5Context* ctx, ISlangBlob* blob);
void finalize(MD5Context* ctx, slang::Digest* result);
diff --git a/source/slang/slang-ast-base.h b/source/slang/slang-ast-base.h
index dea02afbb..04788340a 100644
--- a/source/slang/slang-ast-base.h
+++ b/source/slang/slang-ast-base.h
@@ -9,6 +9,8 @@
#include "slang-serialize-reflection.h"
+#include "../core/slang-digest.h"
+
// This file defines the primary base classes for the hierarchy of
// AST nodes and related objects. For example, this is where the
// basic `Decl`, `Stmt`, `Expr`, `type`, etc. definitions come from.
diff --git a/source/slang/slang-ast-type.cpp b/source/slang/slang-ast-type.cpp
index 39b7a8e04..480589af4 100644
--- a/source/slang/slang-ast-type.cpp
+++ b/source/slang/slang-ast-type.cpp
@@ -1089,7 +1089,6 @@ Val* AndType::_substituteImplOverride(ASTBuilder* astBuilder, SubstitutionSet su
// ModifiedType
-
void ModifiedType::_toTextOverride(StringBuilder& out)
{
for( auto modifier : modifiers )
diff --git a/source/slang/slang-ast-type.h b/source/slang/slang-ast-type.h
index 5bb91e5da..895b64f35 100644
--- a/source/slang/slang-ast-type.h
+++ b/source/slang/slang-ast-type.h
@@ -26,7 +26,6 @@ class InitializerListType : public Type
{
SLANG_AST_CLASS(InitializerListType)
-
// Overrides should be public so base classes can access
void _toTextOverride(StringBuilder& out);
Type* _createCanonicalTypeOverride();
@@ -694,7 +693,7 @@ class NamespaceType : public Type
void _toTextOverride(StringBuilder& out);
bool _equalsImplOverride(Type* type);
HashCode _getHashCodeOverride();
- Type* _createCanonicalTypeOverride();
+ Type* _createCanonicalTypeOverride();
};
// The concrete type for a value wrapped in an existential, accessible
diff --git a/source/slang/slang-ast-val.h b/source/slang/slang-ast-val.h
index a67d62e3b..49189f65c 100644
--- a/source/slang/slang-ast-val.h
+++ b/source/slang/slang-ast-val.h
@@ -3,6 +3,7 @@
#pragma once
#include "slang-ast-base.h"
+#include "../core/slang-digest.h"
namespace Slang {
@@ -379,7 +380,6 @@ class TaggedUnionSubtypeWitness : public SubtypeWitness
//
List<Val*> caseWitnesses;
-
// Overrides should be public so base classes can access
bool _equalsValOverride(Val* val);
void _toTextOverride(StringBuilder& out);
diff --git a/source/slang/slang-hash-utils.h b/source/slang/slang-hash-utils.h
index 62232dd21..c354e43f0 100644
--- a/source/slang/slang-hash-utils.h
+++ b/source/slang/slang-hash-utils.h
@@ -29,12 +29,13 @@ namespace Slang
{
StringBuilder filename;
- for (Index i = 0; i < 4; ++i)
+ uint8_t* uint8Hash = (uint8_t*)hash.values;
+
+ for (Index i = 0; i < 16; ++i)
{
- auto hashSegmentString = String(hash.values[i], 16);
+ auto hashSegmentString = String(uint8Hash[i], 16);
- auto leadingZeroCount = 8 - hashSegmentString.getLength();
- for (Index j = 0; j < leadingZeroCount; ++j)
+ if (hashSegmentString.getLength() == 1)
{
filename.append("0");
}
diff --git a/source/slang/slang.cpp b/source/slang/slang.cpp
index 20cad2465..3fb89c549 100644
--- a/source/slang/slang.cpp
+++ b/source/slang/slang.cpp
@@ -1367,6 +1367,18 @@ void Linkage::updateDependencyBasedHash(
{
builder.addToDigest(capability);
}
+
+ // Add the downstream compiler version (if it exists) to the hash
+ auto passThroughMode = getDownstreamCompilerRequiredForTarget(targetReq->getTarget());
+ auto downstreamCompiler = getSessionImpl()->getOrLoadDownstreamCompiler(passThroughMode, nullptr);
+ if (downstreamCompiler)
+ {
+ ComPtr<ISlangBlob> versionString;
+ if (SLANG_SUCCEEDED(downstreamCompiler->getVersionString(versionString.writeRef())))
+ {
+ builder.addToDigest(versionString);
+ }
+ }
}
SlangResult Linkage::addSearchPath(