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();
259 if (
Section.SegmentInfos.size()) {
262 for (
const WasmYAML::SegmentInfo &SegmentInfo :
Section.SegmentInfos) {
271 if (
Section.InitFunctions.size()) {
274 for (
const WasmYAML::InitFunction &Func :
Section.InitFunctions) {
285 for (
const auto &
C :
Section.Comdats) {
289 for (
const WasmYAML::ComdatEntry &Entry :
C.Entries) {
298void WasmWriter::writeSectionContent(raw_ostream &OS,
299 WasmYAML::NameSection &Section) {
301 if (
Section.FunctionNames.size()) {
304 SubSectionWriter SubSection(OS);
307 for (
const WasmYAML::NameEntry &NameEntry :
Section.FunctionNames) {
314 if (
Section.GlobalNames.size()) {
317 SubSectionWriter SubSection(OS);
320 for (
const WasmYAML::NameEntry &NameEntry :
Section.GlobalNames) {
327 if (
Section.DataSegmentNames.size()) {
330 SubSectionWriter SubSection(OS);
333 for (
const WasmYAML::NameEntry &NameEntry :
Section.DataSegmentNames) {
342void WasmWriter::writeSectionContent(raw_ostream &OS,
343 WasmYAML::ProducersSection &Section) {
345 int Fields = int(!
Section.Languages.empty()) + int(!
Section.Tools.empty()) +
350 for (
auto &
Field : {std::make_pair(StringRef(
"language"), &
Section.Languages),
351 std::make_pair(StringRef(
"processed-by"), &
Section.Tools),
352 std::make_pair(StringRef(
"sdk"), &
Section.SDKs)}) {
353 if (
Field.second->empty())
357 for (
auto &Entry : *
Field.second) {
364void WasmWriter::writeSectionContent(raw_ostream &OS,
365 WasmYAML::TargetFeaturesSection &Section) {
374void WasmWriter::writeSectionContent(raw_ostream &OS,
375 WasmYAML::CustomSection &Section) {
377 writeSectionContent(OS, *S);
379 writeSectionContent(OS, *S);
381 writeSectionContent(OS, *S);
383 writeSectionContent(OS, *S);
385 writeSectionContent(OS, *S);
388 Section.Payload.writeAsBinary(OS);
392void WasmWriter::writeSectionContent(raw_ostream &OS,
393 WasmYAML::TypeSection &Section) {
395 uint32_t ExpectedIndex = 0;
396 for (
const WasmYAML::Signature &Sig :
Section.Signatures) {
397 if (Sig.
Index != ExpectedIndex) {
412void WasmWriter::writeSectionContent(raw_ostream &OS,
413 WasmYAML::ImportSection &Section) {
422 NumImportedFunctions++;
427 NumImportedGlobals++;
449void WasmWriter::writeSectionContent(raw_ostream &OS,
450 WasmYAML::FunctionSection &Section) {
452 for (uint32_t FuncType :
Section.FunctionTypes)
456void WasmWriter::writeSectionContent(raw_ostream &OS,
457 WasmYAML::ExportSection &Section) {
466void WasmWriter::writeSectionContent(raw_ostream &OS,
467 WasmYAML::StartSection &Section) {
471void WasmWriter::writeSectionContent(raw_ostream &OS,
472 WasmYAML::TableSection &Section) {
474 uint32_t ExpectedIndex = NumImportedTables;
475 for (
auto &Table :
Section.Tables) {
476 if (Table.Index != ExpectedIndex) {
477 reportError(
"unexpected table index: " + Twine(Table.Index));
486void WasmWriter::writeSectionContent(raw_ostream &OS,
487 WasmYAML::MemorySection &Section) {
489 for (
const WasmYAML::Limits &Mem :
Section.Memories)
493void WasmWriter::writeSectionContent(raw_ostream &OS,
494 WasmYAML::TagSection &Section) {
496 for (uint32_t TagType :
Section.TagTypes) {
502void WasmWriter::writeSectionContent(raw_ostream &OS,
503 WasmYAML::GlobalSection &Section) {
505 uint32_t ExpectedIndex = NumImportedGlobals;
507 if (
Global.Index != ExpectedIndex) {
514 writeInitExpr(OS,
Global.Init);
518void WasmWriter::writeSectionContent(raw_ostream &OS,
519 WasmYAML::ElemSection &Section) {
521 for (
auto &Segment :
Section.Segments) {
526 writeInitExpr(OS, Segment.Offset);
532 if (Segment.ElemKind != uint32_t(wasm::ValType::FUNCREF)) {
533 reportError(
"unexpected elemkind: " + Twine(Segment.ElemKind));
536 const uint8_t ElemKind = 0;
541 for (
auto &Function : Segment.Functions)
546void WasmWriter::writeSectionContent(raw_ostream &OS,
547 WasmYAML::CodeSection &Section) {
549 uint32_t ExpectedIndex = NumImportedFunctions;
550 for (
auto &Func :
Section.Functions) {
551 std::string OutString;
552 raw_string_ostream StringStream(OutString);
553 if (
Func.Index != ExpectedIndex) {
560 for (
auto &LocalDecl :
Func.Locals) {
565 Func.Body.writeAsBinary(StringStream);
573void WasmWriter::writeSectionContent(raw_ostream &OS,
574 WasmYAML::DataSection &Section) {
576 for (
auto &Segment :
Section.Segments) {
581 writeInitExpr(OS, Segment.Offset);
583 Segment.Content.writeAsBinary(OS);
587void WasmWriter::writeSectionContent(raw_ostream &OS,
588 WasmYAML::DataCountSection &Section) {
592void WasmWriter::writeRelocSection(raw_ostream &OS, WasmYAML::Section &Sec,
593 uint32_t SectionIndex) {
622bool WasmWriter::writeWasm(raw_ostream &OS) {
628 llvm::object::WasmSectionOrderChecker Checker;
629 for (
const std::unique_ptr<WasmYAML::Section> &Sec : Obj.
Sections) {
630 StringRef SecName =
"";
639 std::string OutString;
640 raw_string_ostream StringStream(OutString);
642 writeSectionContent(StringStream, *S);
644 writeSectionContent(StringStream, *S);
646 writeSectionContent(StringStream, *S);
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 reportError(
"unknown section type: " + Twine(Sec->Type));
675 unsigned HeaderSecSizeEncodingLen =
676 Sec->HeaderSecSizeEncodingLen.value_or(5);
680 if (HeaderSecSizeEncodingLen < RequiredLen) {
681 reportError(
"section header length can't be encoded in a LEB of size " +
682 Twine(HeaderSecSizeEncodingLen));
686 encodeULEB128(OutString.size(), OS, HeaderSecSizeEncodingLen);
691 uint32_t SectionIndex = 0;
692 for (
const std::unique_ptr<WasmYAML::Section> &Sec : Obj.
Sections) {
693 if (Sec->Relocations.empty()) {
699 std::string OutString;
700 raw_string_ostream StringStream(OutString);
701 writeRelocSection(StringStream, *Sec, SectionIndex++);
714 WasmWriter Writer(Doc, EH);
715 return Writer.writeWasm(Out);
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
static Error reportError(StringRef Message)
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)
StringRef - 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.
@ C
The default llvm calling convention, compatible with C.
NodeAddr< FuncNode * > Func
void write64le(void *P, uint64_t V)
void write32le(void *P, uint32_t V)
const unsigned WASM_SYMBOL_UNDEFINED
@ WASM_LIMITS_FLAG_HAS_MAX
@ WASM_DATA_SEGMENT_IS_PASSIVE
@ WASM_DATA_SEGMENT_HAS_MEMINDEX
@ WASM_SYMBOL_TYPE_GLOBAL
@ WASM_SYMBOL_TYPE_SECTION
@ WASM_SYMBOL_TYPE_FUNCTION
@ WASM_ELEM_SEGMENT_HAS_TABLE_NUMBER
LLVM_ABI bool relocTypeHasAddend(uint32_t type)
@ WASM_DYLINK_RUNTIME_PATH
@ WASM_DYLINK_EXPORT_INFO
@ WASM_DYLINK_IMPORT_INFO
@ WASM_NAMES_DATA_SEGMENT
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.
FunctionAddr VTableAddr uintptr_t uintptr_t Data
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::@021046217255127373215144224227277301132130072341 Value
Common declarations for yaml2obj.