Browse Source

-validator-version: use '.', fix typo, complete linker support

Tex Riddell 6 năm trước cách đây
mục cha
commit
16bb46f69d

+ 1 - 0
include/dxc/HLSL/DxilLinker.h

@@ -37,6 +37,7 @@ public:
   virtual ~DxilLinker() {}
   static DxilLinker *CreateLinker(llvm::LLVMContext &Ctx, unsigned valMajor, unsigned valMinor);
 
+  void SetValidatorVersion(unsigned valMajor, unsigned valMinor) { m_valMajor = valMajor, m_valMinor = valMinor; }
   virtual bool HasLibNameRegistered(llvm::StringRef name) = 0;
   virtual bool RegisterLib(llvm::StringRef name,
                            std::unique_ptr<llvm::Module> pModule,

+ 5 - 5
lib/DxcSupport/HLSLOptions.cpp

@@ -647,15 +647,15 @@ int ReadDxcOpts(const OptTable *optionTable, unsigned flagsToInclude,
 
   llvm::StringRef valVersionStr = Args.getLastArgValue(OPT_validator_version);
   if (!valVersionStr.empty()) {
-    // Parse "major,minor" version string
-    auto verPair = valVersionStr.split(",");
+    // Parse "major.minor" version string
+    auto verPair = valVersionStr.split(".");
     llvm::APInt major, minor;
     if (verPair.first.getAsInteger(0, major) || verPair.second.getAsInteger(0, minor)) {
-      errors << "Format of validator version is \"<major>,<minor>\" (ex: \"1,4\").";
+      errors << "Format of validator version is \"<major>.<minor>\" (ex: \"1.4\").";
       return 1;
     }
-    uint16_t major64 = major.getLimitedValue();
-    uint16_t minor64 = minor.getLimitedValue();
+    uint64_t major64 = major.getLimitedValue();
+    uint64_t minor64 = minor.getLimitedValue();
     if (major64 > DXIL::kDxilMajor ||
         (major64 == DXIL::kDxilMajor && minor64 > DXIL::kDxilMinor)) {
       errors << "Validator version must be less than or equal to current internal version.";

+ 8 - 0
tools/clang/tools/dxcompiler/dxclinker.cpp

@@ -114,6 +114,8 @@ HRESULT
 DxcLinker::RegisterLibrary(_In_opt_ LPCWSTR pLibName, // Name of the library.
                            _In_ IDxcBlob *pBlob       // Library to add.
 ) {
+  if (!pLibName || !pBlob)
+    return E_INVALIDARG;
   DXASSERT(m_pLinker.get(), "else Initialize() not called or failed silently");
   DxcThreadMalloc TM(m_pMalloc);
   // Prepare UTF8-encoded versions of API values.
@@ -163,6 +165,8 @@ HRESULT STDMETHODCALLTYPE DxcLinker::Link(
     _COM_Outptr_ IDxcOperationResult *
         *ppResult // Linker output status, buffer, and errors
 ) {
+  if (!pTargetProfile || !pLibNames || libCount == 0 || !ppResult)
+    return E_INVALIDARG;
   DxcThreadMalloc TM(m_pMalloc);
   // Prepare UTF8-encoded versions of API values.
   CW2A pUtf8TargetProfile(pTargetProfile, CP_UTF8);
@@ -209,6 +213,10 @@ HRESULT STDMETHODCALLTYPE DxcLinker::Link(
     m_Ctx.setDiagnosticHandler(PrintDiagnosticContext::PrintDiagnosticHandler,
                                &DiagContext, true);
 
+    if (opts.ValVerMajor != UINT32_MAX) {
+      m_pLinker->SetValidatorVersion(opts.ValVerMajor, opts.ValVerMinor);
+    }
+
     // Attach libraries.
     bool bSuccess = true;
     for (unsigned i = 0; i < libCount; i++) {

+ 9 - 9
tools/clang/unittests/HLSL/DxilModuleTest.cpp

@@ -489,30 +489,30 @@ TEST_F(DxilModuleTest, SetValidatorVersion) {
   VerifyValidatorVersionMatches(L"lib_6_3", {L"-Vd"});
 
   // Override validator version
-  VerifyValidatorVersionMatches(L"ps_6_2", {L"-validator-version", L"1,2"}, 1,2);
-  VerifyValidatorVersionMatches(L"lib_6_3", {L"-validator-version", L"1,3"}, 1,3);
+  VerifyValidatorVersionMatches(L"ps_6_2", {L"-validator-version", L"1.2"}, 1,2);
+  VerifyValidatorVersionMatches(L"lib_6_3", {L"-validator-version", L"1.3"}, 1,3);
 
   // Override validator version, with validation disabled
-  VerifyValidatorVersionMatches(L"ps_6_2", {L"-Vd", L"-validator-version", L"1,2"}, 1,2);
-  VerifyValidatorVersionMatches(L"lib_6_3", {L"-Vd", L"-validator-version", L"1,3"}, 1,3);
+  VerifyValidatorVersionMatches(L"ps_6_2", {L"-Vd", L"-validator-version", L"1.2"}, 1,2);
+  VerifyValidatorVersionMatches(L"lib_6_3", {L"-Vd", L"-validator-version", L"1.3"}, 1,3);
 
   // Never can validate (version 0,0):
   VerifyValidatorVersionMatches(L"lib_6_1", {L"-Vd"}, 0, 0);
   VerifyValidatorVersionMatches(L"lib_6_2", {L"-Vd"}, 0, 0);
-  VerifyValidatorVersionMatches(L"lib_6_2", {L"-Vd", L"-validator-version", L"0,0"}, 0, 0);
+  VerifyValidatorVersionMatches(L"lib_6_2", {L"-Vd", L"-validator-version", L"0.0"}, 0, 0);
   VerifyValidatorVersionMatches(L"lib_6_x", {}, 0, 0);
-  VerifyValidatorVersionMatches(L"lib_6_x", {L"-validator-version", L"0,0"}, 0, 0);
+  VerifyValidatorVersionMatches(L"lib_6_x", {L"-validator-version", L"0.0"}, 0, 0);
 
   // Failure cases:
-  VerifyValidatorVersionFails(L"ps_6_2", {L"-validator-version", L"1,1"}, {
+  VerifyValidatorVersionFails(L"ps_6_2", {L"-validator-version", L"1.1"}, {
     "validator version 1,1 does not support target profile."});
 
   VerifyValidatorVersionFails(L"lib_6_2", {L"-Tlib_6_2"}, {
     "Must disable validation for unsupported lib_6_1 or lib_6_2 targets"});
 
-  VerifyValidatorVersionFails(L"lib_6_2", {L"-Vd", L"-validator-version", L"1,2"}, {
+  VerifyValidatorVersionFails(L"lib_6_2", {L"-Vd", L"-validator-version", L"1.2"}, {
     "-validator-version cannot be used with library profiles lib_6_1 or lib_6_2."});
 
-  VerifyValidatorVersionFails(L"lib_6_x", {L"-validator-version", L"1,3"}, {
+  VerifyValidatorVersionFails(L"lib_6_x", {L"-validator-version", L"1.3"}, {
     "Offline library profile cannot be used with non-zero -validator-version."});
 }

+ 26 - 0
tools/clang/unittests/HLSL/LinkerTest.cpp

@@ -61,6 +61,7 @@ public:
   TEST_METHOD(RunLinkToLibWithUnusedExport);
   TEST_METHOD(RunLinkToLibWithNoExports);
   TEST_METHOD(RunLinkWithPotentialIntrinsicNameCollisions);
+  TEST_METHOD(RunLinkWithValidatorVersion);
 
 
   dxc::DxcDllSupport m_dllSupport;
@@ -636,3 +637,28 @@ TEST_F(LinkerTest, RunLinkWithPotentialIntrinsicNameCollisions) {
     "declare %dx.types.Handle @\"dx.op.createHandleForLib.class.Texture2D<float>\"(i32, %\"class.Texture2D<float>\")"
   }, { });
 }
+
+TEST_F(LinkerTest, RunLinkWithValidatorVersion) {
+  if (m_ver.SkipDxilVersion(1, 4)) return;
+
+  CComPtr<IDxcBlob> pEntryLib;
+  CompileLib(L"..\\CodeGenHLSL\\linker\\lib_mat_entry2.hlsl",
+             &pEntryLib, {});
+  CComPtr<IDxcBlob> pLib;
+  CompileLib(
+      L"..\\CodeGenHLSL\\linker\\lib_mat_cast2.hlsl",
+      &pLib, {});
+
+  CComPtr<IDxcLinker> pLinker;
+  CreateLinker(&pLinker);
+
+  LPCWSTR libName = L"ps_main";
+  RegisterDxcModule(libName, pEntryLib, pLinker);
+
+  LPCWSTR libName2 = L"test";
+  RegisterDxcModule(libName2, pLib, pLinker);
+
+  Link(L"", L"lib_6_3", pLinker, {libName, libName2},
+       {"!dx.valver = !{(![0-9]+)}.*\n\\1 = !{i32 1, i32 3}"},
+       {}, {L"-validator-version", L"1.3"}, /*regex*/ true);
+}