Fix metadata load for a Type template arg

- This would cause an assert when you store, write to bitcode, load from
  bitcode, store to bitcode again, then load again, when using the
  Type template arg metadata.
This commit is contained in:
Tex Riddell 2019-08-12 15:11:37 -07:00
Родитель f0bab7f861
Коммит b637b8ebab
1 изменённых файлов: 5 добавлений и 4 удалений

Просмотреть файл

@ -814,11 +814,12 @@ void DxilMDHelper::LoadDxilTemplateArgAnnotation(const llvm::MDOperand &MDO, Dxi
IFTBOOL(pTupleMD->getNumOperands() >= 1, DXC_E_INCORRECT_DXIL_METADATA); IFTBOOL(pTupleMD->getNumOperands() >= 1, DXC_E_INCORRECT_DXIL_METADATA);
unsigned Tag = ConstMDToUint32(pTupleMD->getOperand(0)); unsigned Tag = ConstMDToUint32(pTupleMD->getOperand(0));
switch (Tag) { switch (Tag) {
case kDxilTemplateArgTypeTag: case kDxilTemplateArgTypeTag: {
IFTBOOL(pTupleMD->getNumOperands() == 2, DXC_E_INCORRECT_DXIL_METADATA); IFTBOOL(pTupleMD->getNumOperands() == 2, DXC_E_INCORRECT_DXIL_METADATA);
annotation.SetType(MetadataAsValue::get(m_Ctx, Constant *C = dyn_cast<Constant>(ValueMDToValue(pTupleMD->getOperand(kDxilTemplateArgValue)));
pTupleMD->getOperand(kDxilTemplateArgValue))->getType()); IFTBOOL(C != nullptr, DXC_E_INCORRECT_DXIL_METADATA);
break; annotation.SetType(C->getType());
} break;
case kDxilTemplateArgIntegralTag: case kDxilTemplateArgIntegralTag:
IFTBOOL(pTupleMD->getNumOperands() == 2, DXC_E_INCORRECT_DXIL_METADATA); IFTBOOL(pTupleMD->getNumOperands() == 2, DXC_E_INCORRECT_DXIL_METADATA);
annotation.SetIntegral((int64_t)ConstMDToUint64(pTupleMD->getOperand(kDxilTemplateArgValue))); annotation.SetIntegral((int64_t)ConstMDToUint64(pTupleMD->getOperand(kDxilTemplateArgValue)));