Browse Source

Merged PR 33: Fix break due to mismatched use of const in Props/Signature Map keys.

Fix break due to mismatched use of const in Props/Signature Map keys.
Tex Riddell 7 năm trước cách đây
mục cha
commit
bff194564f

+ 2 - 2
include/dxc/HLSL/DxilModule.h

@@ -46,7 +46,7 @@ class RootSignatureHandle;
 struct DxilFunctionProps;
 
 typedef std::unordered_map<const llvm::Function *, std::unique_ptr<DxilFunctionProps>> DxilFunctionPropsMap;
-typedef std::unordered_map<llvm::Function *, std::unique_ptr<DxilEntrySignature>> DxilEntrySignatureMap;
+typedef std::unordered_map<const llvm::Function *, std::unique_ptr<DxilEntrySignature>> DxilEntrySignatureMap;
 /// Use this class to manipulate DXIL of a shader.
 class DxilModule {
 public:
@@ -127,7 +127,7 @@ public:
   const DxilSignature &GetPatchConstantSignature() const;
   const RootSignatureHandle &GetRootSignature() const;
   bool HasDxilEntrySignature(llvm::Function *F) const;
-  DxilEntrySignature &GetDxilEntrySignature(llvm::Function *F);
+  DxilEntrySignature &GetDxilEntrySignature(const llvm::Function *F);
   // Move DxilEntrySignature of F to NewF.
   void ReplaceDxilEntrySignature(llvm::Function *F, llvm::Function *NewF);
 

+ 1 - 2
lib/HLSL/DxilGenerationPass.cpp

@@ -245,8 +245,7 @@ public:
     std::unique_ptr<DxilEntrySignature> pSig =
         llvm::make_unique<DxilEntrySignature>(SM->GetKind(), M.GetHLModule().GetHLOptions().bUseMinPrecision);
     // EntrySig for shader functions.
-    std::unordered_map<llvm::Function *, std::unique_ptr<DxilEntrySignature>>
-        DxilEntrySignatureMap;
+    DxilEntrySignatureMap DxilEntrySignatureMap;
 
     if (!SM->IsLib()) {
       HLSignatureLower sigLower(m_pHLModule->GetEntryFunction(), *m_pHLModule,

+ 1 - 2
lib/HLSL/DxilLinker.cpp

@@ -805,8 +805,7 @@ DxilLinkJob::LinkToLib(const ShaderModel *pSM) {
   AddFunctions(DM, vmap, initFuncSet);
 
   // Set DxilFunctionProps.
-  std::unordered_map<Function *, std::unique_ptr<DxilEntrySignature>>
-      DxilEntrySignatureMap;
+  DxilEntrySignatureMap DxilEntrySignatureMap;
   for (auto &it : m_functionDefs) {
     DxilFunctionLinkInfo *linkInfo = it.first;
     DxilLib *pLib = it.second;

+ 7 - 7
lib/HLSL/DxilModule.cpp

@@ -1054,7 +1054,7 @@ const RootSignatureHandle &DxilModule::GetRootSignature() const {
 bool DxilModule::HasDxilEntrySignature(llvm::Function *F) const {
   return m_DxilEntrySignatureMap.find(F) != m_DxilEntrySignatureMap.end();
 }
-DxilEntrySignature &DxilModule::GetDxilEntrySignature(llvm::Function *F) {
+DxilEntrySignature &DxilModule::GetDxilEntrySignature(const llvm::Function *F) {
   DXASSERT(m_DxilEntrySignatureMap.count(F) != 0, "cannot find F in map");
   return *m_DxilEntrySignatureMap[F];
 }
@@ -1287,15 +1287,15 @@ void DxilModule::EmitDxilMetadata() {
         DxilMDHelper::kDxilFunctionPropertiesMDName);
 
     // Sort functions by name to keep metadata deterministic
-    vector<Function *> funcOrder;
+    vector<const Function *> funcOrder;
     funcOrder.reserve(std::max(m_DxilFunctionPropsMap.size(),
                                m_DxilEntrySignatureMap.size()));
 
     std::transform( m_DxilFunctionPropsMap.begin(),
                     m_DxilFunctionPropsMap.end(),
                     std::back_inserter(funcOrder),
-                    [](auto &p) -> Function* { return p.first; } );
-    std::sort(funcOrder.begin(), funcOrder.end(), [](Function *F1, Function *F2) {
+                    [](auto &p) -> const Function* { return p.first; } );
+    std::sort(funcOrder.begin(), funcOrder.end(), [](const Function *F1, const Function *F2) {
       return F1->getName() < F2->getName();
     });
 
@@ -1312,8 +1312,8 @@ void DxilModule::EmitDxilMetadata() {
     std::transform( m_DxilEntrySignatureMap.begin(),
                     m_DxilEntrySignatureMap.end(),
                     std::back_inserter(funcOrder),
-                    [](auto &p) -> Function* { return p.first; } );
-    std::sort(funcOrder.begin(), funcOrder.end(), [](Function *F1, Function *F2) {
+                    [](auto &p) -> const Function* { return p.first; } );
+    std::sort(funcOrder.begin(), funcOrder.end(), [](const Function *F1, const Function *F2) {
       return F1->getName() < F2->getName();
     });
 
@@ -1321,7 +1321,7 @@ void DxilModule::EmitDxilMetadata() {
       DxilEntrySignature *Sig = &GetDxilEntrySignature(F);
       MDTuple *pSig = m_pMDHelper->EmitDxilSignatures(*Sig);
       entrySigs->addOperand(
-          MDTuple::get(m_Ctx, {ValueAsMetadata::get(F), pSig}));
+          MDTuple::get(m_Ctx, {ValueAsMetadata::get(const_cast<Function*>(F)), pSig}));
     }
   }
 }