summaryrefslogtreecommitdiff
path: root/llvm/lib/ObjectYAML
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/lib/ObjectYAML')
-rw-r--r--llvm/lib/ObjectYAML/DXContainerEmitter.cpp79
-rw-r--r--llvm/lib/ObjectYAML/DXContainerYAML.cpp4
-rw-r--r--llvm/lib/ObjectYAML/ELFEmitter.cpp16
-rw-r--r--llvm/lib/ObjectYAML/ELFYAML.cpp2
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(