29 : Obj(Obj), ErrHandler(EH) {}
30 bool writeWasm(raw_ostream &OS);
33 void writeRelocSection(raw_ostream &OS, WasmYAML::Section &Sec,
34 uint32_t SectionIndex);
36 void writeInitExpr(raw_ostream &OS,
const WasmYAML::InitExpr &InitExpr);
38 void writeSectionContent(raw_ostream &OS, WasmYAML::CustomSection &Section);
39 void writeSectionContent(raw_ostream &OS, WasmYAML::TypeSection &Section);
40 void writeSectionContent(raw_ostream &OS, WasmYAML::ImportSection &Section);
41 void writeSectionContent(raw_ostream &OS, WasmYAML::FunctionSection &Section);
42 void writeSectionContent(raw_ostream &OS, WasmYAML::TableSection &Section);
43 void writeSectionContent(raw_ostream &OS, WasmYAML::MemorySection &Section);
44 void writeSectionContent(raw_ostream &OS, WasmYAML::TagSection &Section);
45 void writeSectionContent(raw_ostream &OS, WasmYAML::GlobalSection &Section);
46 void writeSectionContent(raw_ostream &OS, WasmYAML::ExportSection &Section);
47 void writeSectionContent(raw_ostream &OS, WasmYAML::StartSection &Section);
48 void writeSectionContent(raw_ostream &OS, WasmYAML::ElemSection &Section);
49 void writeSectionContent(raw_ostream &OS, WasmYAML::CodeSection &Section);
50 void writeSectionContent(raw_ostream &OS, WasmYAML::DataSection &Section);
51 void writeSectionContent(raw_ostream &OS, WasmYAML::DataCountSection &Section);
54 void writeSectionContent(raw_ostream &OS, WasmYAML::DylinkSection &Section);
55 void writeSectionContent(raw_ostream &OS, WasmYAML::NameSection &Section);
56 void writeSectionContent(raw_ostream &OS, WasmYAML::LinkingSection &Section);
57 void writeSectionContent(raw_ostream &OS, WasmYAML::ProducersSection &Section);
58 void writeSectionContent(raw_ostream &OS,
59 WasmYAML::TargetFeaturesSection &Section);
60 WasmYAML::Object &Obj;
61 uint32_t NumImportedFunctions = 0;
62 uint32_t NumImportedGlobals = 0;
63 uint32_t NumImportedTables = 0;
64 uint32_t NumImportedTags = 0;
66 bool HasError =
false;
71class SubSectionWriter {
73 std::string OutString;
74 raw_string_ostream StringStream;
77 SubSectionWriter(raw_ostream &OS) : OS(OS), StringStream(OutString) {}
85 raw_ostream &getStream() {
return StringStream; }
125void WasmWriter::reportError(
const Twine &
Msg) {
130void WasmWriter::writeInitExpr(raw_ostream &OS,
131 const WasmYAML::InitExpr &InitExpr) {
161void WasmWriter::writeSectionContent(raw_ostream &OS,
162 WasmYAML::DylinkSection &Section) {
166 SubSectionWriter SubSection(OS);
167 raw_ostream &SubOS = SubSection.getStream();
176 raw_ostream &SubOS = SubSection.getStream();
178 for (StringRef Needed :
Section.Needed)
182 if (
Section.ExportInfo.size()) {
184 raw_ostream &SubOS = SubSection.getStream();
186 for (
const WasmYAML::DylinkExportInfo &Info :
Section.ExportInfo) {
192 if (
Section.ImportInfo.size()) {
194 raw_ostream &SubOS = SubSection.getStream();
196 for (
const WasmYAML::DylinkImportInfo &Info :
Section.ImportInfo) {
203 if (
Section.RuntimePath.size()) {
205 raw_ostream &SubOS = SubSection.getStream();
207 for (StringRef Path :
Section.RuntimePath)
213void WasmWriter::writeSectionContent(raw_ostream &OS,
214 WasmYAML::LinkingSection &Section) {
218 SubSectionWriter SubSection(OS);
221 if (
Section.SymbolTable.size()) {
225 const WasmYAML::SymbolInfo &
Info = Sym.value();
265 if (
Section.SegmentInfos.size()) {
268 for (
const WasmYAML::SegmentInfo &SegmentInfo :
Section.SegmentInfos) {
277 if (
Section.InitFunctions.size()) {
280 for (
const WasmYAML::InitFunction &Func :
Section.InitFunctions) {
291 for (
const auto &
C :
Section.Comdats) {
295 for (
const WasmYAML::ComdatEntry &Entry :
C.Entries) {
304void WasmWriter::writeSectionContent(raw_ostream &OS,
305 WasmYAML::NameSection &Section) {
307 if (
Section.FunctionNames.size()) {
310 SubSectionWriter SubSection(OS);
313 for (
const WasmYAML::NameEntry &NameEntry :
Section.FunctionNames) {
320 if (
Section.GlobalNames.size()) {
323 SubSectionWriter SubSection(OS);
326 for (
const WasmYAML::NameEntry &NameEntry :
Section.GlobalNames) {
333 if (
Section.DataSegmentNames.size()) {
336 SubSectionWriter SubSection(OS);
339 for (
const WasmYAML::NameEntry &NameEntry :
Section.DataSegmentNames) {
348void WasmWriter::writeSectionContent(raw_ostream &OS,
349 WasmYAML::ProducersSection &Section) {
351 int Fields = int(!
Section.Languages.empty()) + int(!
Section.Tools.empty()) +
356 for (
auto &
Field : {std::make_pair(StringRef(
"language"), &
Section.Languages),
357 std::make_pair(StringRef(
"processed-by"), &
Section.Tools),
358 std::make_pair(StringRef(
"sdk"), &
Section.SDKs)}) {
359 if (
Field.second->empty())
363 for (
auto &Entry : *
Field.second) {
370void WasmWriter::writeSectionContent(raw_ostream &OS,
371 WasmYAML::TargetFeaturesSection &Section) {
380void WasmWriter::writeSectionContent(raw_ostream &OS,
381 WasmYAML::CustomSection &Section) {
383 writeSectionContent(OS, *S);
385 writeSectionContent(OS, *S);
387 writeSectionContent(OS, *S);
389 writeSectionContent(OS, *S);
391 writeSectionContent(OS, *S);
394 Section.Payload.writeAsBinary(OS);
398void WasmWriter::writeSectionContent(raw_ostream &OS,
399 WasmYAML::TypeSection &Section) {
401 uint32_t ExpectedIndex = 0;
402 for (
const WasmYAML::Signature &Sig :
Section.Signatures) {
403 if (Sig.
Index != ExpectedIndex) {
418void WasmWriter::writeSectionContent(raw_ostream &OS,
419 WasmYAML::ImportSection &Section) {
428 NumImportedFunctions++;
433 NumImportedGlobals++;
455void WasmWriter::writeSectionContent(raw_ostream &OS,
456 WasmYAML::FunctionSection &Section) {
458 for (uint32_t FuncType :
Section.FunctionTypes)
462void WasmWriter::writeSectionContent(raw_ostream &OS,
463 WasmYAML::ExportSection &Section) {
472void WasmWriter::writeSectionContent(raw_ostream &OS,
473 WasmYAML::StartSection &Section) {
477void WasmWriter::writeSectionContent(raw_ostream &OS,
478 WasmYAML::TableSection &Section) {
480 uint32_t ExpectedIndex = NumImportedTables;
482 if (
Table.Index != ExpectedIndex) {
492void WasmWriter::writeSectionContent(raw_ostream &OS,
493 WasmYAML::MemorySection &Section) {
495 for (
const WasmYAML::Limits &Mem :
Section.Memories)
499void WasmWriter::writeSectionContent(raw_ostream &OS,
500 WasmYAML::TagSection &Section) {
502 for (uint32_t TagType :
Section.TagTypes) {
508void WasmWriter::writeSectionContent(raw_ostream &OS,
509 WasmYAML::GlobalSection &Section) {
511 uint32_t ExpectedIndex = NumImportedGlobals;
513 if (
Global.Index != ExpectedIndex) {
520 writeInitExpr(OS,
Global.Init);
524void WasmWriter::writeSectionContent(raw_ostream &OS,
525 WasmYAML::ElemSection &Section) {
527 for (
auto &Segment :
Section.Segments) {
532 writeInitExpr(OS, Segment.Offset);
538 if (Segment.ElemKind != uint32_t(wasm::ValType::FUNCREF)) {
539 reportError(
"unexpected elemkind: " + Twine(Segment.ElemKind));
542 const uint8_t ElemKind = 0;
547 for (
auto &
Function : Segment.Functions)
552void WasmWriter::writeSectionContent(raw_ostream &OS,
553 WasmYAML::CodeSection &Section) {
555 uint32_t ExpectedIndex = NumImportedFunctions;
556 for (
auto &Func :
Section.Functions) {
557 std::string OutString;
558 raw_string_ostream StringStream(OutString);
559 if (
Func.Index != ExpectedIndex) {
566 for (
auto &LocalDecl :
Func.Locals) {
571 Func.Body.writeAsBinary(StringStream);
579void WasmWriter::writeSectionContent(raw_ostream &OS,
580 WasmYAML::DataSection &Section) {
582 for (
auto &Segment :
Section.Segments) {
587 writeInitExpr(OS, Segment.Offset);
589 Segment.Content.writeAsBinary(OS);
593void WasmWriter::writeSectionContent(raw_ostream &OS,
594 WasmYAML::DataCountSection &Section) {
598void WasmWriter::writeRelocSection(raw_ostream &OS, WasmYAML::Section &Sec,
599 uint32_t SectionIndex) {
628bool WasmWriter::writeWasm(raw_ostream &OS) {
634 llvm::object::WasmSectionOrderChecker Checker;
635 for (
const std::unique_ptr<WasmYAML::Section> &Sec : Obj.
Sections) {
636 StringRef SecName =
"";
645 std::string OutString;
646 raw_string_ostream StringStream(OutString);
648 writeSectionContent(StringStream, *S);
650 writeSectionContent(StringStream, *S);
652 writeSectionContent(StringStream, *S);
654 writeSectionContent(StringStream, *S);
656 writeSectionContent(StringStream, *S);
658 writeSectionContent(StringStream, *S);
660 writeSectionContent(StringStream, *S);
662 writeSectionContent(StringStream, *S);
664 writeSectionContent(StringStream, *S);
666 writeSectionContent(StringStream, *S);
668 writeSectionContent(StringStream, *S);
670 writeSectionContent(StringStream, *S);
672 writeSectionContent(StringStream, *S);
674 writeSectionContent(StringStream, *S);
676 reportError(
"unknown section type: " + Twine(Sec->Type));
681 unsigned HeaderSecSizeEncodingLen =
682 Sec->HeaderSecSizeEncodingLen.value_or(5);
686 if (HeaderSecSizeEncodingLen < RequiredLen) {
687 reportError(
"section header length can't be encoded in a LEB of size " +
688 Twine(HeaderSecSizeEncodingLen));
692 encodeULEB128(OutString.size(), OS, HeaderSecSizeEncodingLen);
697 uint32_t SectionIndex = 0;
698 for (
const std::unique_ptr<WasmYAML::Section> &Sec : Obj.
Sections) {
699 if (Sec->Relocations.empty()) {
705 std::string OutString;
706 raw_string_ostream StringStream(OutString);
707 writeRelocSection(StringStream, *Sec, SectionIndex++);
720 WasmWriter Writer(Doc, EH);
721 return Writer.writeWasm(Out);
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
static Error reportError(StringRef Message)
static GCRegistry::Add< ShadowStackGC > C("shadow-stack", "Very portable GC for uncooperative code generators")
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
OptimizedStructLayoutField Field
static int writeUint32(raw_ostream &OS, uint32_t Value)
static int writeLimits(const WasmYAML::Limits &Lim, raw_ostream &OS)
static int writeStringRef(const StringRef &Str, raw_ostream &OS)
static int writeUint8(raw_ostream &OS, uint8_t Value)
static int writeUint64(raw_ostream &OS, uint64_t Value)
Represent a constant reference to a string, i.e.
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
LLVM Value Representation.
LLVM_ABI bool isValidSectionOrder(unsigned ID, StringRef CustomSectionName="")
This class implements an extremely fast bulk output stream that can only output to a stream.
raw_ostream & write(unsigned char C)
LLVM_ABI void writeAsBinary(raw_ostream &OS, uint64_t N=UINT64_MAX) const
Write the contents (regardless of whether it is binary or a hex string) as binary to the given raw_os...
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
NodeAddr< FuncNode * > Func
void write64le(void *P, uint64_t V)
void write32le(void *P, uint32_t V)
const unsigned WASM_SYMBOL_UNDEFINED
@ WASM_NAMES_DATA_SEGMENT
@ WASM_LIMITS_FLAG_HAS_MAX
@ WASM_SYMBOL_TYPE_GLOBAL
@ WASM_SYMBOL_TYPE_SECTION
@ WASM_SYMBOL_TYPE_FUNCTION
const unsigned WASM_SYMBOL_BINDING_COMMON
const unsigned WASM_SYMBOL_BINDING_MASK
@ WASM_ELEM_SEGMENT_HAS_TABLE_NUMBER
@ WASM_DYLINK_RUNTIME_PATH
@ WASM_DYLINK_EXPORT_INFO
@ WASM_DYLINK_IMPORT_INFO
@ WASM_DATA_SEGMENT_IS_PASSIVE
@ WASM_DATA_SEGMENT_HAS_MEMINDEX
LLVM_ABI bool relocTypeHasAddend(uint32_t type)
LLVM_ABI llvm::StringRef sectionTypeToString(uint32_t type)
const unsigned WASM_SYMBOL_EXPLICIT_NAME
const unsigned WASM_ELEM_SEGMENT_MASK_HAS_ELEM_DESC
llvm::function_ref< void(const Twine &Msg)> ErrorHandler
LLVM_ABI bool yaml2wasm(WasmYAML::Object &Doc, raw_ostream &Out, ErrorHandler EH)
This is an optimization pass for GlobalISel generic memory operations.
auto enumerate(FirstRange &&First, RestRanges &&...Rest)
Given two or more input ranges, returns a new range whose values are tuples (A, B,...
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
@ Export
Export information to summary.
@ Import
Import information from summary.
@ Global
Append to llvm.global_dtors.
LLVM_ABI unsigned getULEB128Size(uint64_t Value)
Utility function to get the size of the ULEB128-encoded value.
unsigned encodeSLEB128(int64_t Value, raw_ostream &OS, unsigned PadTo=0)
Utility function to encode a SLEB128 value to an output stream.
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
unsigned encodeULEB128(uint64_t Value, raw_ostream &OS, unsigned PadTo=0)
Utility function to encode a ULEB128 value to an output stream.
wasm::WasmInitExprMVP Inst
std::vector< std::unique_ptr< Section > > Sections
std::vector< Relocation > Relocations
std::vector< ValueType > ReturnTypes
std::vector< ValueType > ParamTypes
union llvm::wasm::WasmInitExprMVP::@234311111124136373374304035273310237314141125040 Value
Common declarations for yaml2obj.