diff options
Diffstat (limited to 'llvm/lib/ObjectYAML')
| -rw-r--r-- | llvm/lib/ObjectYAML/DXContainerEmitter.cpp | 79 | ||||
| -rw-r--r-- | llvm/lib/ObjectYAML/DXContainerYAML.cpp | 4 | ||||
| -rw-r--r-- | llvm/lib/ObjectYAML/ELFEmitter.cpp | 16 | ||||
| -rw-r--r-- | llvm/lib/ObjectYAML/ELFYAML.cpp | 2 |
4 files changed, 63 insertions, 38 deletions
diff --git a/llvm/lib/ObjectYAML/DXContainerEmitter.cpp b/llvm/lib/ObjectYAML/DXContainerEmitter.cpp index 043b575a43b1..1078b1188bb6 100644 --- a/llvm/lib/ObjectYAML/DXContainerEmitter.cpp +++ b/llvm/lib/ObjectYAML/DXContainerEmitter.cpp @@ -38,7 +38,7 @@ private: Error validateSize(uint32_t Computed); void writeHeader(raw_ostream &OS); - void writeParts(raw_ostream &OS); + Error writeParts(raw_ostream &OS); }; } // namespace @@ -107,7 +107,7 @@ void DXContainerWriter::writeHeader(raw_ostream &OS) { Offsets.size() * sizeof(uint32_t)); } -void DXContainerWriter::writeParts(raw_ostream &OS) { +Error DXContainerWriter::writeParts(raw_ostream &OS) { uint32_t RollingOffset = sizeof(dxbc::Header) + (ObjectFile.Header.PartCount * sizeof(uint32_t)); for (auto I : llvm::zip(ObjectFile.Parts, *ObjectFile.Header.PartOffsets)) { @@ -269,65 +269,68 @@ void DXContainerWriter::writeParts(raw_ostream &OS) { mcdxbc::RootSignatureDesc RS; RS.Flags = P.RootSignature->getEncodedFlags(); RS.Version = P.RootSignature->Version; - RS.RootParameterOffset = P.RootSignature->RootParametersOffset; RS.NumStaticSamplers = P.RootSignature->NumStaticSamplers; - RS.StaticSamplersOffset = P.RootSignature->StaticSamplersOffset; for (DXContainerYAML::RootParameterLocationYaml &L : P.RootSignature->Parameters.Locations) { - dxbc::RTS0::v1::RootParameterHeader Header{L.Header.Type, L.Header.Visibility, - L.Header.Offset}; - switch (L.Header.Type) { - case llvm::to_underlying(dxbc::RootParameterType::Constants32Bit): { + assert(dxbc::isValidParameterType(L.Header.Type) && + "invalid DXContainer YAML"); + assert(dxbc::isValidShaderVisibility(L.Header.Visibility) && + "invalid DXContainer YAML"); + dxbc::RootParameterType Type = dxbc::RootParameterType(L.Header.Type); + dxbc::ShaderVisibility Visibility = + dxbc::ShaderVisibility(L.Header.Visibility); + + switch (Type) { + case dxbc::RootParameterType::Constants32Bit: { const DXContainerYAML::RootConstantsYaml &ConstantYaml = P.RootSignature->Parameters.getOrInsertConstants(L); - dxbc::RTS0::v1::RootConstants Constants; + mcdxbc::RootConstants Constants; + Constants.Num32BitValues = ConstantYaml.Num32BitValues; Constants.RegisterSpace = ConstantYaml.RegisterSpace; Constants.ShaderRegister = ConstantYaml.ShaderRegister; - RS.ParametersContainer.addParameter(Header, Constants); + RS.ParametersContainer.addParameter(Type, Visibility, Constants); break; } - case llvm::to_underlying(dxbc::RootParameterType::CBV): - case llvm::to_underlying(dxbc::RootParameterType::SRV): - case llvm::to_underlying(dxbc::RootParameterType::UAV): { + case dxbc::RootParameterType::CBV: + case dxbc::RootParameterType::SRV: + case dxbc::RootParameterType::UAV: { const DXContainerYAML::RootDescriptorYaml &DescriptorYaml = P.RootSignature->Parameters.getOrInsertDescriptor(L); - dxbc::RTS0::v2::RootDescriptor Descriptor; + mcdxbc::RootDescriptor Descriptor; Descriptor.RegisterSpace = DescriptorYaml.RegisterSpace; Descriptor.ShaderRegister = DescriptorYaml.ShaderRegister; if (RS.Version > 1) Descriptor.Flags = DescriptorYaml.getEncodedFlags(); - RS.ParametersContainer.addParameter(Header, Descriptor); + RS.ParametersContainer.addParameter(Type, Visibility, Descriptor); break; } - case llvm::to_underlying(dxbc::RootParameterType::DescriptorTable): { + case dxbc::RootParameterType::DescriptorTable: { const DXContainerYAML::DescriptorTableYaml &TableYaml = P.RootSignature->Parameters.getOrInsertTable(L); mcdxbc::DescriptorTable Table; for (const auto &R : TableYaml.Ranges) { - - dxbc::RTS0::v2::DescriptorRange Range; - Range.RangeType = R.RangeType; + assert(dxbc::isValidRangeType(R.RangeType) && + "Invalid Descriptor Range Type"); + mcdxbc::DescriptorRange Range; + Range.RangeType = dxil::ResourceClass(R.RangeType); Range.NumDescriptors = R.NumDescriptors; Range.BaseShaderRegister = R.BaseShaderRegister; Range.RegisterSpace = R.RegisterSpace; Range.OffsetInDescriptorsFromTableStart = R.OffsetInDescriptorsFromTableStart; + if (RS.Version > 1) Range.Flags = R.getEncodedFlags(); + Table.Ranges.push_back(Range); } - RS.ParametersContainer.addParameter(Header, Table); + RS.ParametersContainer.addParameter(Type, Visibility, Table); break; } - default: - // Handling invalid parameter type edge case. We intentionally let - // obj2yaml/yaml2obj parse and emit invalid dxcontainer data, in order - // for that to be used as a testing tool more effectively. - RS.ParametersContainer.addInvalidParameter(Header); } } @@ -350,6 +353,27 @@ void DXContainerWriter::writeParts(raw_ostream &OS) { RS.StaticSamplers.push_back(NewSampler); } + // Handling of offsets + RS.RootParameterOffset = RS.computeRootParametersOffset(); + if (P.RootSignature->RootParametersOffset && + P.RootSignature->RootParametersOffset.value() != + RS.RootParameterOffset) { + return createStringError( + errc::invalid_argument, + "Specified RootParametersOffset does not match required value: %d.", + RS.RootParameterOffset); + } + + RS.StaticSamplersOffset = RS.computeStaticSamplersOffset(); + if (P.RootSignature->StaticSamplersOffset && + P.RootSignature->StaticSamplersOffset.value() != + RS.StaticSamplersOffset) { + return createStringError( + errc::invalid_argument, + "Specified StaticSamplersOffset does not match computed value: %d.", + RS.StaticSamplersOffset); + } + RS.write(OS); break; } @@ -359,14 +383,15 @@ void DXContainerWriter::writeParts(raw_ostream &OS) { OS.write_zeros(PartSize - BytesWritten); RollingOffset += PartSize; } + + return Error::success(); } Error DXContainerWriter::write(raw_ostream &OS) { if (Error Err = computePartOffsets()) return Err; writeHeader(OS); - writeParts(OS); - return Error::success(); + return writeParts(OS); } namespace llvm { diff --git a/llvm/lib/ObjectYAML/DXContainerYAML.cpp b/llvm/lib/ObjectYAML/DXContainerYAML.cpp index 263f7bdf37bc..32b502ed4e21 100644 --- a/llvm/lib/ObjectYAML/DXContainerYAML.cpp +++ b/llvm/lib/ObjectYAML/DXContainerYAML.cpp @@ -376,9 +376,9 @@ void MappingTraits<DXContainerYAML::RootSignatureYamlDesc>::mapping( IO &IO, DXContainerYAML::RootSignatureYamlDesc &S) { IO.mapRequired("Version", S.Version); IO.mapRequired("NumRootParameters", S.NumRootParameters); - IO.mapRequired("RootParametersOffset", S.RootParametersOffset); + IO.mapOptional("RootParametersOffset", S.RootParametersOffset, std::nullopt); IO.mapRequired("NumStaticSamplers", S.NumStaticSamplers); - IO.mapRequired("StaticSamplersOffset", S.StaticSamplersOffset); + IO.mapOptional("StaticSamplersOffset", S.StaticSamplersOffset, std::nullopt); IO.mapRequired("Parameters", S.Parameters.Locations, S); IO.mapOptional("Samplers", S.StaticSamplers); #define ROOT_SIGNATURE_FLAG(Num, Val) IO.mapOptional(#Val, S.Val, false); diff --git a/llvm/lib/ObjectYAML/ELFEmitter.cpp b/llvm/lib/ObjectYAML/ELFEmitter.cpp index bc5c68d08d11..2386a2e3e6c4 100644 --- a/llvm/lib/ObjectYAML/ELFEmitter.cpp +++ b/llvm/lib/ObjectYAML/ELFEmitter.cpp @@ -1487,8 +1487,8 @@ void ELFState<ELFT>::writeSectionContent( if (!E.BBRanges) continue; uint64_t TotalNumBlocks = 0; - bool EmitCallsiteOffsets = - FeatureOrErr->CallsiteOffsets || E.hasAnyCallsiteOffsets(); + bool EmitCallsiteEndOffsets = + FeatureOrErr->CallsiteEndOffsets || E.hasAnyCallsiteEndOffsets(); for (const ELFYAML::BBAddrMapEntry::BBRangeEntry &BBR : *E.BBRanges) { // Write the base address of the range. CBA.write<uintX_t>(BBR.BaseAddress, ELFT::Endianness); @@ -1506,12 +1506,12 @@ void ELFState<ELFT>::writeSectionContent( if (Section.Type == llvm::ELF::SHT_LLVM_BB_ADDR_MAP && E.Version > 1) SHeader.sh_size += CBA.writeULEB128(BBE.ID); SHeader.sh_size += CBA.writeULEB128(BBE.AddressOffset); - if (EmitCallsiteOffsets) { - size_t NumCallsiteOffsets = - BBE.CallsiteOffsets ? BBE.CallsiteOffsets->size() : 0; - SHeader.sh_size += CBA.writeULEB128(NumCallsiteOffsets); - if (BBE.CallsiteOffsets) { - for (uint32_t Offset : *BBE.CallsiteOffsets) + if (EmitCallsiteEndOffsets) { + size_t NumCallsiteEndOffsets = + BBE.CallsiteEndOffsets ? BBE.CallsiteEndOffsets->size() : 0; + SHeader.sh_size += CBA.writeULEB128(NumCallsiteEndOffsets); + if (BBE.CallsiteEndOffsets) { + for (uint32_t Offset : *BBE.CallsiteEndOffsets) SHeader.sh_size += CBA.writeULEB128(Offset); } } diff --git a/llvm/lib/ObjectYAML/ELFYAML.cpp b/llvm/lib/ObjectYAML/ELFYAML.cpp index c27339de67ef..62d80a24f478 100644 --- a/llvm/lib/ObjectYAML/ELFYAML.cpp +++ b/llvm/lib/ObjectYAML/ELFYAML.cpp @@ -1884,7 +1884,7 @@ void MappingTraits<ELFYAML::BBAddrMapEntry::BBEntry>::mapping( IO.mapRequired("AddressOffset", E.AddressOffset); IO.mapRequired("Size", E.Size); IO.mapRequired("Metadata", E.Metadata); - IO.mapOptional("CallsiteOffsets", E.CallsiteOffsets); + IO.mapOptional("CallsiteEndOffsets", E.CallsiteEndOffsets); } void MappingTraits<ELFYAML::PGOAnalysisMapEntry>::mapping( |
