Prechádzať zdrojové kódy

Added IDxcVersionInfo3 for custom version string (#3517)

Adam Yang 4 rokov pred
rodič
commit
a7770e66eb

+ 12 - 2
include/dxc/dxcapi.h

@@ -320,7 +320,7 @@ struct IDxcCompiler2 : public IDxcCompiler {
     _In_ UINT32 defineCount,                      // Number of defines
     _In_opt_ IDxcIncludeHandler *pIncludeHandler, // user-provided interface to handle #include directives (optional)
     _COM_Outptr_ IDxcOperationResult **ppResult,  // Compiler output status, buffer, and errors
-    _Outptr_opt_result_z_ LPWSTR *ppDebugBlobName,// Suggested file name for debug blob. (Must be HeapFree()'d!)
+    _Outptr_opt_result_z_ LPWSTR *ppDebugBlobName,// Suggested file name for debug blob. (Must be CoTaskMemFree()'d!)
     _COM_Outptr_opt_ IDxcBlob **ppDebugBlob       // Debug blob
   ) = 0;
 };
@@ -569,7 +569,17 @@ struct IDxcVersionInfo : public IUnknown {
 
 CROSS_PLATFORM_UUIDOF(IDxcVersionInfo2, "fb6904c4-42f0-4b62-9c46-983af7da7c83")
 struct IDxcVersionInfo2 : public IDxcVersionInfo {
-  virtual HRESULT STDMETHODCALLTYPE GetCommitInfo(_Out_ UINT32 *pCommitCount, _Out_ char **pCommitHash) = 0;
+  virtual HRESULT STDMETHODCALLTYPE GetCommitInfo(
+    _Out_ UINT32 *pCommitCount,           // The total number commits.
+    _Outptr_result_z_ char **pCommitHash  // The SHA of the latest commit. (Must be CoTaskMemFree()'d!)
+  ) = 0;
+};
+
+CROSS_PLATFORM_UUIDOF(IDxcVersionInfo3, "5e13e843-9d25-473c-9ad2-03b2d0b44b1e")
+struct IDxcVersionInfo3 : public IDxcVersionInfo2 {
+  virtual HRESULT STDMETHODCALLTYPE GetCustomVersionString(
+    _Outptr_result_z_ char **pVersionString // Custom version string for compiler. (Must be CoTaskMemFree()'d!)
+  ) = 0;
 };
 
 CROSS_PLATFORM_UUIDOF(IDxcPdbUtils, "E6C9647E-9D6A-4C3B-B94C-524B5A6C343D")

+ 25 - 12
tools/clang/tools/dxcompiler/dxcpdbutils.cpp

@@ -144,7 +144,7 @@ static void ComputeFlagsBasedOnArgs(ArrayRef<std::wstring> args, std::vector<std
   }
 }
 
-struct DxcPdbVersionInfo : public IDxcVersionInfo2 {
+struct DxcPdbVersionInfo : public IDxcVersionInfo3 {
 private:
   DXC_MICROCOM_TM_REF_FIELDS()
 
@@ -156,9 +156,22 @@ public:
 
   hlsl::DxilCompilerVersion m_Version = {};
   std::string m_VersionCommitSha = {};
+  std::string m_VersionString = {};
+
+  static HRESULT CopyStringToOutStringPtr(const std::string &Str, _Out_ char **ppOutString) {
+    *ppOutString = nullptr;
+    char *const pString = (char *)CoTaskMemAlloc(Str.size() + 1);
+    if (pString == nullptr)
+      return E_OUTOFMEMORY;
+    std::memcpy(pString, Str.data(), Str.size());
+    pString[Str.size()] = 0;
+
+    *ppOutString = pString;
+    return S_OK;
+  }
 
   HRESULT STDMETHODCALLTYPE QueryInterface(REFIID iid, void **ppvObject) override {
-    return DoBasicQueryInterface<IDxcVersionInfo, IDxcVersionInfo2>(this, iid, ppvObject);
+    return DoBasicQueryInterface<IDxcVersionInfo, IDxcVersionInfo2, IDxcVersionInfo3>(this, iid, ppvObject);
   }
 
   virtual HRESULT STDMETHODCALLTYPE GetVersion(_Out_ UINT32 *pMajor, _Out_ UINT32 *pMinor) override {
@@ -175,23 +188,22 @@ public:
     return S_OK;
   }
 
-  virtual HRESULT STDMETHODCALLTYPE GetCommitInfo(_Out_ UINT32 *pCommitCount, _Out_ char **pCommitHash) {
+  virtual HRESULT STDMETHODCALLTYPE GetCommitInfo(_Out_ UINT32 *pCommitCount, _Outptr_result_z_ char **pCommitHash) {
     if (!pCommitHash)
       return E_POINTER;
 
-    *pCommitHash = nullptr;
-
-    char *const hash = (char *)CoTaskMemAlloc(m_VersionCommitSha.size() + 1);
-    if (hash == nullptr)
-      return E_OUTOFMEMORY;
-    std::memcpy(hash, m_VersionCommitSha.data(), m_VersionCommitSha.size());
-    hash[m_VersionCommitSha.size()] = 0;
-
-    *pCommitHash = hash;
+    IFR(CopyStringToOutStringPtr(m_VersionCommitSha, pCommitHash));
     *pCommitCount = m_Version.CommitCount;
 
     return S_OK;
   }
+
+  virtual HRESULT STDMETHODCALLTYPE GetCustomVersionString(_Outptr_result_z_ char **pVersionString) {
+    if (!pVersionString)
+      return E_POINTER;
+    IFR(CopyStringToOutStringPtr(m_VersionString, pVersionString));
+    return S_OK;
+  }
 };
 
 struct PdbRecompilerIncludeHandler : public IDxcIncludeHandler {
@@ -861,6 +873,7 @@ public:
     }
     result->m_Version = m_VersionInfo;
     result->m_VersionCommitSha = m_VersionCommitSha;
+    result->m_VersionString = m_VersionString;
     *ppVersionInfo = result.Detach();
     return S_OK;
   }

+ 19 - 4
tools/clang/unittests/HLSL/CompilerTest.cpp

@@ -1010,6 +1010,9 @@ static void VerifyPdbUtil(dxc::DxcDllSupport &dllSupport,
     VERIFY_IS_NOT_NULL(pVersion);
     VERIFY_SUCCEEDED(pVersion.QueryInterface(&pVersion2));
 
+    CComPtr<IDxcVersionInfo3> pVersion3;
+    VERIFY_SUCCEEDED(pVersion.QueryInterface(&pVersion3));
+
     CComPtr<IDxcVersionInfo> pCompilerVersion;
     pCompiler->QueryInterface(&pCompilerVersion);
 
@@ -1030,19 +1033,31 @@ static void VerifyPdbUtil(dxc::DxcDllSupport &dllSupport,
       VERIFY_ARE_EQUAL(uMinor, uCompilerMinor);
       VERIFY_ARE_EQUAL(uFlags, uCompilerFlags);
 
+      // IDxcVersionInfo2
+      UINT32 uCommitCount = 0;
+      CComHeapPtr<char> CommitVersionHash;
+      VERIFY_SUCCEEDED(pVersion2->GetCommitInfo(&uCommitCount, &CommitVersionHash));
+
       CComPtr<IDxcVersionInfo2> pCompilerVersion2;
       if (SUCCEEDED(pCompiler->QueryInterface(&pCompilerVersion2))) {
         UINT32 uCompilerCommitCount = 0;
         CComHeapPtr<char> CompilerCommitVersionHash;
         VERIFY_SUCCEEDED(pCompilerVersion2->GetCommitInfo(&uCompilerCommitCount, &CompilerCommitVersionHash));
 
-        UINT32 uCommitCount = 0;
-        CComHeapPtr<char> CommitVersionHash;
-        VERIFY_SUCCEEDED(pVersion2->GetCommitInfo(&uCommitCount, &CommitVersionHash));
-
         VERIFY_IS_TRUE(0 == strcmp(CommitVersionHash, CompilerCommitVersionHash));
         VERIFY_ARE_EQUAL(uCommitCount, uCompilerCommitCount);
       }
+
+      // IDxcVersionInfo3
+      CComHeapPtr<char> VersionString;
+      VERIFY_SUCCEEDED(pVersion3->GetCustomVersionString(&VersionString));
+
+      CComPtr<IDxcVersionInfo3> pCompilerVersion3;
+      if (SUCCEEDED(pCompiler->QueryInterface(&pCompilerVersion3))) {
+        CComHeapPtr<char> CompilerVersionString;
+        VERIFY_SUCCEEDED(pCompilerVersion3->GetCustomVersionString(&CompilerVersionString));
+        VERIFY_IS_TRUE(0 == strcmp(CompilerVersionString, VersionString));
+      }
     }
   }