LLVM: lib/MC/MCDXContainerWriter.cpp Source File (original) (raw)

22 auto &Asm = *this->Asm;

23

24

25

29 uint64_t SectionSize = Asm.getSectionAddressSize(Sec);

30

31 if (SectionSize == 0)

32 continue;

33

34 assert(SectionSize < std::numeric_limits<uint32_t>::max() &&

35 "Section size too large for DXContainer");

36

37 PartOffsets.push_back(PartOffset);

40

41

42 if (Sec.getName() == "DXIL")

44 }

45 assert(PartOffset < std::numeric_limits<uint32_t>::max() &&

46 "Part data too large for DXContainer");

47

50 uint64_t FileSize = PartStart + PartOffset;

51 assert(FileSize < std::numeric_limits<uint32_t>::max() &&

52 "File size too large for DXContainer");

53

54

55 W.write<char>({'D', 'X', 'B', 'C'});

56

57 W.OS.write_zeros(16);

58

61

63

65

68

70 uint64_t SectionSize = Asm.getSectionAddressSize(Sec);

71

72 if (SectionSize == 0)

73 continue;

74

75 unsigned Start = W.OS.tell();

76

77 W.write<char>(ArrayRef(Sec.getName().data(), 4));

78

79 uint64_t PartSize = SectionSize;

80

81 if (Sec.getName() == "DXIL")

83

86 if (Sec.getName() == "DXIL") {

88 memset(reinterpret_cast<void *>(&Header), 0, sizeof(dxbc::ProgramHeader));

89

95 Header.Version =

97 if (TT.hasEnvironment())

98 Header.ShaderKind =

100

101

103 memcpy(Header.Bitcode.Magic, "DXIL", 4);

104 VersionTuple DXILVersion = TT.getDXILVersion();

105 Header.Bitcode.MajorVersion = DXILVersion.getMajor();

106 Header.Bitcode.MinorVersion = DXILVersion.getMinor().value_or(0);

108 Header.Bitcode.Size = SectionSize;

110 Header.swapBytes();

111 W.write<char>(ArrayRef(reinterpret_cast<char *>(&Header),

113 }

114 Asm.writeSectionData(W.OS, &Sec);

115 unsigned Size = W.OS.tell() - Start;

117 }

118 return 0;

119}

const Triple & getTargetTriple() const