Skip to content

Commit b232967

Browse files
author
joaosaffran
committed
adding support for obj2yaml and initial tests
1 parent 08f6ddc commit b232967

File tree

13 files changed

+212
-88
lines changed

13 files changed

+212
-88
lines changed

llvm/include/llvm/BinaryFormat/DXContainer.h

Lines changed: 27 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -160,14 +160,14 @@ enum class RootElementFlag : uint32_t {
160160
};
161161

162162
#define ROOT_PARAMETER(Val, Enum) Enum = Val,
163-
enum class RootParameterType: uint32_t {
163+
enum class RootParameterType : uint32_t {
164164
#include "DXContainerConstants.def"
165165
};
166166

167167
ArrayRef<EnumEntry<RootParameterType>> getRootParameterTypes();
168168

169169
#define SHADER_VISIBILITY(Val, Enum) Enum = Val,
170-
enum class ShaderVisibilityFlag: uint32_t {
170+
enum class ShaderVisibilityFlag : uint32_t {
171171
#include "DXContainerConstants.def"
172172
};
173173

@@ -566,21 +566,40 @@ struct RootConstants {
566566
uint32_t ShaderRegister;
567567
uint32_t RegisterSpace;
568568
uint32_t Num32BitValues;
569+
570+
void swapBytes() {
571+
sys::swapByteOrder(ShaderRegister);
572+
sys::swapByteOrder(RegisterSpace);
573+
sys::swapByteOrder(Num32BitValues);
574+
}
569575
};
570576

571577
struct RootParameter {
572-
dxbc::RootParameterType ParameterType;
573-
union {
574-
RootConstants Constants;
575-
};
576-
dxbc::ShaderVisibilityFlag ShaderVisibility;
578+
dxbc::RootParameterType ParameterType;
579+
union {
580+
RootConstants Constants;
581+
};
582+
dxbc::ShaderVisibilityFlag ShaderVisibility;
583+
584+
void swapBytes() {
585+
sys::swapByteOrder(ParameterType);
586+
sys::swapByteOrder(ShaderVisibility);
587+
switch (ParameterType) {
588+
589+
case RootParameterType::Constants32Bit:
590+
Constants.swapBytes();
591+
break;
592+
}
593+
}
577594
};
578595

579596
struct RootSignatureHeader {
580597
uint32_t Version = 2;
581598
uint32_t Flags = 0;
599+
void swapBytes() {
600+
// nothing to swap
601+
}
582602
};
583-
584603

585604
struct RootSignatureValidations {
586605

llvm/include/llvm/MC/DXContainerRootSignature.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ namespace llvm {
1515
class raw_ostream;
1616

1717
namespace mcdxbc {
18-
18+
1919
struct RootSignatureDesc {
2020
dxbc::RootSignatureHeader Header;
2121
SmallVector<dxbc::RootParameter> Parameters;

llvm/include/llvm/Object/DXContainer.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
#include "llvm/Support/MemoryBufferRef.h"
2323
#include "llvm/TargetParser/Triple.h"
2424
#include <array>
25+
#include <cstdint>
2526
#include <variant>
2627

2728
namespace llvm {
@@ -126,6 +127,8 @@ class RootSignature {
126127
uint32_t StaticSamplersOffset;
127128
uint32_t Flags;
128129

130+
SmallVector<dxbc::RootParameter> Parameters;
131+
129132
public:
130133
RootSignature() {}
131134

@@ -135,6 +138,7 @@ class RootSignature {
135138
uint32_t getRootParametersOffset() const { return RootParametersOffset; }
136139
uint32_t getNumStaticSamplers() const { return NumStaticSamplers; }
137140
uint32_t getStaticSamplersOffset() const { return StaticSamplersOffset; }
141+
SmallVector<dxbc::RootParameter> getParameters() const { return Parameters; }
138142
uint32_t getFlags() const { return Flags; }
139143
};
140144

llvm/include/llvm/ObjectYAML/DXContainerYAML.h

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,6 @@ struct RootSignatureYamlDesc {
8484

8585
SmallVector<dxbc::RootParameter> Parameters;
8686

87-
8887
uint32_t getEncodedFlags();
8988

9089
#include "llvm/BinaryFormat/DXContainerConstants.def"
@@ -269,13 +268,11 @@ template <> struct MappingTraits<DXContainerYAML::RootSignatureYamlDesc> {
269268
};
270269

271270
template <> struct MappingTraits<dxbc::RootParameter> {
272-
static void mapping(IO &IO,
273-
dxbc::RootParameter &P);
271+
static void mapping(IO &IO, dxbc::RootParameter &P);
274272
};
275273

276274
template <> struct MappingTraits<dxbc::RootConstants> {
277-
static void mapping(IO &IO,
278-
dxbc::RootConstants &C);
275+
static void mapping(IO &IO, dxbc::RootConstants &C);
279276
};
280277

281278
} // namespace yaml

llvm/lib/MC/DXContainerRootSignature.cpp

Lines changed: 27 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -16,56 +16,52 @@
1616
using namespace llvm;
1717
using namespace llvm::mcdxbc;
1818

19-
template <typename T>
20-
static uint32_t getSizeOf () {
21-
return static_cast<uint32_t>(sizeof(T));
19+
template <typename T> static uint32_t getSizeOf() {
20+
return static_cast<uint32_t>(sizeof(T));
2221
}
2322

24-
25-
2623
void RootSignatureDesc::write(raw_ostream &OS) const {
2724
uint32_t Offset = 16;
28-
const uint32_t ParametersOffset = getSizeOf<dxbc::RootSignatureHeader>() + Offset;
25+
const uint32_t ParametersOffset =
26+
getSizeOf<dxbc::RootSignatureHeader>() + Offset;
2927
const uint32_t ParameterByteSize = Parameters.size_in_bytes();
3028

31-
3229
// Writing header information
3330
support::endian::write(OS, Header.Version, llvm::endianness::little);
34-
Offset += getSizeOf<uint32_t>();
31+
Offset += getSizeOf<uint32_t>();
3532

36-
support::endian::write(OS, (uint32_t)Parameters.size(), llvm::endianness::little);
37-
Offset += getSizeOf<uint32_t>();
33+
support::endian::write(OS, (uint32_t)Parameters.size(),
34+
llvm::endianness::little);
35+
Offset += getSizeOf<uint32_t>();
3836

3937
support::endian::write(OS, ParametersOffset, llvm::endianness::little);
40-
Offset += getSizeOf<uint32_t>();
38+
Offset += getSizeOf<uint32_t>();
4139

4240
support::endian::write(OS, ((uint32_t)0), llvm::endianness::little);
43-
Offset += getSizeOf<uint32_t>();
41+
Offset += getSizeOf<uint32_t>();
4442

45-
support::endian::write(OS, ParameterByteSize + ParametersOffset, llvm::endianness::little);
46-
Offset += getSizeOf<uint32_t>();
43+
support::endian::write(OS, ParameterByteSize + ParametersOffset,
44+
llvm::endianness::little);
45+
Offset += getSizeOf<uint32_t>();
4746

4847
support::endian::write(OS, Header.Flags, llvm::endianness::little);
4948

50-
for (const dxbc::RootParameter &P : Parameters){
51-
support::endian::write(OS, P.ParameterType, llvm::endianness::little);
49+
for (const dxbc::RootParameter &P : Parameters) {
50+
support::endian::write(OS, P.ParameterType, llvm::endianness::little);
5251
support::endian::write(OS, P.ShaderVisibility, llvm::endianness::little);
5352
support::endian::write(OS, Offset, llvm::endianness::little);
54-
Offset += getSizeOf<uint32_t>();
55-
56-
57-
switch(P.ParameterType){
58-
case dxbc::RootParameterType::Constants32Bit:{
59-
support::endian::write(OS, P.Constants.ShaderRegister, llvm::endianness::little);
60-
Offset += getSizeOf<uint32_t>();
61-
62-
support::endian::write(OS, P.Constants.RegisterSpace, llvm::endianness::little);
63-
Offset += getSizeOf<uint32_t>();
64-
65-
support::endian::write(OS, P.Constants.Num32BitValues, llvm::endianness::little);
66-
Offset += getSizeOf<uint32_t>();
6753

68-
} break;
69-
}
54+
switch (P.ParameterType) {
55+
case dxbc::RootParameterType::Constants32Bit: {
56+
support::endian::write(OS, P.Constants.ShaderRegister,
57+
llvm::endianness::little);
58+
support::endian::write(OS, P.Constants.RegisterSpace,
59+
llvm::endianness::little);
60+
support::endian::write(OS, P.Constants.Num32BitValues,
61+
llvm::endianness::little);
62+
Offset += getSizeOf<dxbc::RootConstants>() + 3 * getSizeOf<uint32_t>();
63+
64+
} break;
65+
}
7066
}
7167
}

llvm/lib/Object/DXContainer.cpp

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@
1212
#include "llvm/Support/Alignment.h"
1313
#include "llvm/Support/Endian.h"
1414
#include "llvm/Support/FormatVariadic.h"
15+
#include <cstddef>
16+
#include <cstdint>
1517

1618
using namespace llvm;
1719
using namespace llvm::object;
@@ -247,6 +249,7 @@ void DXContainer::PartIterator::updateIteratorImpl(const uint32_t Offset) {
247249
}
248250

249251
Error DirectX::RootSignature::parse(StringRef Data) {
252+
const char *Begin = Data.begin();
250253
const char *Current = Data.begin();
251254

252255
// Root Signature headers expects 6 integers to be present.
@@ -288,6 +291,37 @@ Error DirectX::RootSignature::parse(StringRef Data) {
288291
llvm::Twine(FValue));
289292
Flags = FValue;
290293

294+
Current = Begin + RootParametersOffset;
295+
for (uint32_t It = 0; It < NumParameters; It++) {
296+
dxbc::RootParameter NewParam;
297+
298+
NewParam.ParameterType =
299+
support::endian::read<dxbc::RootParameterType,
300+
llvm::endianness::little>(Current);
301+
Current += sizeof(dxbc::RootParameterType);
302+
303+
NewParam.ShaderVisibility =
304+
support::endian::read<dxbc::ShaderVisibilityFlag,
305+
llvm::endianness::little>(Current);
306+
Current += sizeof(dxbc::ShaderVisibilityFlag);
307+
308+
uint32_t Offset =
309+
support::endian::read<uint32_t, llvm::endianness::little>(Current);
310+
Current += sizeof(uint32_t);
311+
312+
switch (NewParam.ParameterType) {
313+
314+
case dxbc::RootParameterType::Constants32Bit: {
315+
if (Error Err = readStruct(Data, Current, NewParam.Constants))
316+
return Err;
317+
if (sys::IsBigEndianHost)
318+
NewParam.Constants.swapBytes();
319+
} break;
320+
}
321+
322+
Parameters.push_back(NewParam);
323+
}
324+
291325
return Error::success();
292326
}
293327

llvm/lib/ObjectYAML/DXContainerYAML.cpp

Lines changed: 22 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ DXContainerYAML::RootSignatureYamlDesc::RootSignatureYamlDesc(
3535
NumStaticSamplers(Data.getNumStaticSamplers()),
3636
StaticSamplersOffset(Data.getStaticSamplersOffset()) {
3737
uint32_t Flags = Data.getFlags();
38+
Parameters = Data.getParameters();
3839
#define ROOT_ELEMENT_FLAG(Num, Val) \
3940
Val = (Flags & (uint32_t)dxbc::RootElementFlag::Val) > 0;
4041
#include "llvm/BinaryFormat/DXContainerConstants.def"
@@ -218,26 +219,25 @@ void MappingTraits<DXContainerYAML::RootSignatureYamlDesc>::mapping(
218219
#include "llvm/BinaryFormat/DXContainerConstants.def"
219220
}
220221

221-
void MappingTraits<dxbc::RootConstants>::mapping(
222-
IO &IO, dxbc::RootConstants &C) {
223-
IO.mapRequired("Num32BitValues", C.Num32BitValues);
224-
IO.mapRequired("RegisterSpace", C.RegisterSpace);
225-
IO.mapRequired("ShaderRegister", C.ShaderRegister);
226-
227-
}
222+
void MappingTraits<dxbc::RootConstants>::mapping(IO &IO,
223+
dxbc::RootConstants &C) {
224+
IO.mapRequired("Num32BitValues", C.Num32BitValues);
225+
IO.mapRequired("RegisterSpace", C.RegisterSpace);
226+
IO.mapRequired("ShaderRegister", C.ShaderRegister);
227+
}
228228

229-
void MappingTraits<dxbc::RootParameter>::mapping(
230-
IO &IO, dxbc::RootParameter &P) {
231-
IO.mapRequired("ParameterType", P.ParameterType);
232-
IO.mapRequired("ShaderVisibility", P.ShaderVisibility);
233-
switch (P.ParameterType) {
229+
void MappingTraits<dxbc::RootParameter>::mapping(IO &IO,
230+
dxbc::RootParameter &P) {
231+
IO.mapRequired("ParameterType", P.ParameterType);
232+
IO.mapRequired("ShaderVisibility", P.ShaderVisibility);
233+
switch (P.ParameterType) {
234234

235-
case dxbc::RootParameterType::Constants32Bit:
236-
IO.mapRequired("Constants", P.Constants);
235+
case dxbc::RootParameterType::Constants32Bit:
236+
IO.mapRequired("Constants", P.Constants);
237237

238-
break;
239-
}
238+
break;
240239
}
240+
}
241241

242242
void MappingTraits<DXContainerYAML::Part>::mapping(IO &IO,
243243
DXContainerYAML::Part &P) {
@@ -343,15 +343,15 @@ void ScalarEnumerationTraits<dxbc::SigComponentType>::enumeration(
343343
}
344344

345345
void ScalarEnumerationTraits<dxbc::RootParameterType>::enumeration(
346-
IO &IO, dxbc::RootParameterType &Value) {
347-
for (const auto &E : dxbc::getRootParameterTypes())
348-
IO.enumCase(Value, E.Name.str().c_str(), E.Value);
346+
IO &IO, dxbc::RootParameterType &Value) {
347+
for (const auto &E : dxbc::getRootParameterTypes())
348+
IO.enumCase(Value, E.Name.str().c_str(), E.Value);
349349
}
350350

351351
void ScalarEnumerationTraits<dxbc::ShaderVisibilityFlag>::enumeration(
352-
IO &IO, dxbc::ShaderVisibilityFlag &Value) {
353-
for (const auto &E : dxbc::getShaderVisibilityFlags())
354-
IO.enumCase(Value, E.Name.str().c_str(), E.Value);
352+
IO &IO, dxbc::ShaderVisibilityFlag &Value) {
353+
for (const auto &E : dxbc::getShaderVisibilityFlags())
354+
IO.enumCase(Value, E.Name.str().c_str(), E.Value);
355355
}
356356

357357
} // namespace yaml

llvm/lib/Target/DirectX/DXILRootSignature.cpp

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -201,12 +201,11 @@ PreservedAnalyses RootSignatureAnalysisPrinter::run(Module &M,
201201
OS << indent(Space) << "Flags: " << format_hex(RS.Header.Flags, 8) << ":\n";
202202
OS << indent(Space) << "Version: " << RS.Header.Version << ":\n";
203203
OS << indent(Space) << "NumParameters: " << RS.Parameters.size() << ":\n";
204-
OS << indent(Space) << "RootParametersOffset: " << RS.Parameters.size_in_bytes()
205-
<< ":\n";
206-
OS << indent(Space) << "NumStaticSamplers: " << 0
207-
<< ":\n";
208-
OS << indent(Space) << "StaticSamplersOffset: " << sizeof(RS.Header) + RS.Parameters.size_in_bytes()
209-
<< ":\n";
204+
OS << indent(Space)
205+
<< "RootParametersOffset: " << RS.Parameters.size_in_bytes() << ":\n";
206+
OS << indent(Space) << "NumStaticSamplers: " << 0 << ":\n";
207+
OS << indent(Space) << "StaticSamplersOffset: "
208+
<< sizeof(RS.Header) + RS.Parameters.size_in_bytes() << ":\n";
210209
Space--;
211210
// end root signature header
212211
}

llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Flags.ll

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,7 @@ attributes #0 = { "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" }
2222
; DXC-NEXT: Size: 24
2323
; DXC-NEXT: RootSignature:
2424
; DXC-NEXT: Version: 2
25-
; DXC-NEXT: NumParameters: 0
26-
; DXC-NEXT: RootParametersOffset: 0
2725
; DXC-NEXT: NumStaticSamplers: 0
28-
; DXC-NEXT: StaticSamplersOffset: 0
26+
; DXC-NEXT: StaticSamplersOffset: 24
27+
; DXC-NEXT: Parameters: []
2928
; DXC-NEXT: AllowInputAssemblerInputLayout: true

llvm/test/CodeGen/DirectX/ContainerData/RootSignature-MultipleEntryFunctions.ll

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,12 +29,12 @@ attributes #0 = { "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" }
2929
; CHECK-NEXT: NumParameters: 0
3030
; CHECK-NEXT: RootParametersOffset: 0
3131
; CHECK-NEXT: NumStaticSamplers: 0
32-
; CHECK-NEXT: StaticSamplersOffset: 0
32+
; CHECK-NEXT: StaticSamplersOffset: 8
3333

3434
; CHECK-LABEL: Definition for 'anotherMain':
3535
; CHECK-NEXT: Flags: 0x000002
3636
; CHECK-NEXT: Version: 2
3737
; CHECK-NEXT: NumParameters: 0
3838
; CHECK-NEXT: RootParametersOffset: 0
3939
; CHECK-NEXT: NumStaticSamplers: 0
40-
; CHECK-NEXT: StaticSamplersOffset: 0
40+
; CHECK-NEXT: StaticSamplersOffset: 8

0 commit comments

Comments
 (0)