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) {}
86 raw_ostream &getStream() {
return StringStream; }
126void WasmWriter::reportError(
const Twine &Msg) {
131void WasmWriter::writeInitExpr(raw_ostream &OS,
132 const WasmYAML::InitExpr &InitExpr) {
162void WasmWriter::writeSectionContent(raw_ostream &OS,
163 WasmYAML::DylinkSection &Section) {
167 SubSectionWriter SubSection(OS);
168 raw_ostream &SubOS = SubSection.getStream();
177 raw_ostream &SubOS = SubSection.getStream();
179 for (StringRef Needed :
Section.Needed)
183 if (
Section.RuntimePath.size()) {
185 raw_ostream &SubOS = SubSection.getStream();
187 for (StringRef Path :
Section.RuntimePath)
193void WasmWriter::writeSectionContent(raw_ostream &OS,
194 WasmYAML::LinkingSection &Section) {
198 SubSectionWriter SubSection(OS);
201 if (
Section.SymbolTable.size()) {
205 const WasmYAML::SymbolInfo &
Info = Sym.value();
239 if (
Section.SegmentInfos.size()) {
242 for (
const WasmYAML::SegmentInfo &SegmentInfo :
Section.SegmentInfos) {
251 if (
Section.InitFunctions.size()) {
254 for (
const WasmYAML::InitFunction &Func :
Section.InitFunctions) {
265 for (
const auto &
C :
Section.Comdats) {
269 for (
const WasmYAML::ComdatEntry &Entry :
C.Entries) {
278void WasmWriter::writeSectionContent(raw_ostream &OS,
279 WasmYAML::NameSection &Section) {
281 if (
Section.FunctionNames.size()) {
284 SubSectionWriter SubSection(OS);
287 for (
const WasmYAML::NameEntry &NameEntry :
Section.FunctionNames) {
294 if (
Section.GlobalNames.size()) {
297 SubSectionWriter SubSection(OS);
300 for (
const WasmYAML::NameEntry &NameEntry :
Section.GlobalNames) {
307 if (
Section.DataSegmentNames.size()) {
310 SubSectionWriter SubSection(OS);
313 for (
const WasmYAML::NameEntry &NameEntry :
Section.DataSegmentNames) {
322void WasmWriter::writeSectionContent(raw_ostream &OS,
323 WasmYAML::ProducersSection &Section) {
325 int Fields = int(!
Section.Languages.empty()) + int(!
Section.Tools.empty()) +
330 for (
auto &
Field : {std::make_pair(StringRef(
"language"), &
Section.Languages),
331 std::make_pair(StringRef(
"processed-by"), &
Section.Tools),
332 std::make_pair(StringRef(
"sdk"), &
Section.SDKs)}) {
333 if (
Field.second->empty())
337 for (
auto &Entry : *
Field.second) {
344void WasmWriter::writeSectionContent(raw_ostream &OS,
345 WasmYAML::TargetFeaturesSection &Section) {
354void WasmWriter::writeSectionContent(raw_ostream &OS,
355 WasmYAML::CustomSection &Section) {
357 writeSectionContent(OS, *S);
359 writeSectionContent(OS, *S);
361 writeSectionContent(OS, *S);
363 writeSectionContent(OS, *S);
365 writeSectionContent(OS, *S);
368 Section.Payload.writeAsBinary(OS);
372void WasmWriter::writeSectionContent(raw_ostream &OS,
373 WasmYAML::TypeSection &Section) {
375 uint32_t ExpectedIndex = 0;
376 for (
const WasmYAML::Signature &Sig :
Section.Signatures) {
377 if (Sig.
Index != ExpectedIndex) {
392void WasmWriter::writeSectionContent(raw_ostream &OS,
393 WasmYAML::ImportSection &Section) {
402 NumImportedFunctions++;
407 NumImportedGlobals++;
429void WasmWriter::writeSectionContent(raw_ostream &OS,
430 WasmYAML::FunctionSection &Section) {
432 for (uint32_t FuncType :
Section.FunctionTypes)
436void WasmWriter::writeSectionContent(raw_ostream &OS,
437 WasmYAML::ExportSection &Section) {
446void WasmWriter::writeSectionContent(raw_ostream &OS,
447 WasmYAML::StartSection &Section) {
451void WasmWriter::writeSectionContent(raw_ostream &OS,
452 WasmYAML::TableSection &Section) {
454 uint32_t ExpectedIndex = NumImportedTables;
455 for (
auto &Table :
Section.Tables) {
456 if (Table.Index != ExpectedIndex) {
457 reportError(
"unexpected table index: " + Twine(Table.Index));
466void WasmWriter::writeSectionContent(raw_ostream &OS,
467 WasmYAML::MemorySection &Section) {
469 for (
const WasmYAML::Limits &Mem :
Section.Memories)
473void WasmWriter::writeSectionContent(raw_ostream &OS,
474 WasmYAML::TagSection &Section) {
476 for (uint32_t TagType :
Section.TagTypes) {
482void WasmWriter::writeSectionContent(raw_ostream &OS,
483 WasmYAML::GlobalSection &Section) {
485 uint32_t ExpectedIndex = NumImportedGlobals;
487 if (
Global.Index != ExpectedIndex) {
494 writeInitExpr(OS,
Global.Init);
498void WasmWriter::writeSectionContent(raw_ostream &OS,
499 WasmYAML::ElemSection &Section) {
501 for (
auto &Segment :
Section.Segments) {
506 writeInitExpr(OS, Segment.Offset);
512 if (Segment.ElemKind != uint32_t(wasm::ValType::FUNCREF)) {
513 reportError(
"unexpected elemkind: " + Twine(Segment.ElemKind));
516 const uint8_t ElemKind = 0;
521 for (
auto &Function : Segment.Functions)
526void WasmWriter::writeSectionContent(raw_ostream &OS,
527 WasmYAML::CodeSection &Section) {
529 uint32_t ExpectedIndex = NumImportedFunctions;
530 for (
auto &Func :
Section.Functions) {
531 std::string OutString;
532 raw_string_ostream StringStream(OutString);
533 if (
Func.Index != ExpectedIndex) {
540 for (
auto &LocalDecl :
Func.Locals) {
545 Func.Body.writeAsBinary(StringStream);
548 StringStream.
flush();
554void WasmWriter::writeSectionContent(raw_ostream &OS,
555 WasmYAML::DataSection &Section) {
557 for (
auto &Segment :
Section.Segments) {
562 writeInitExpr(OS, Segment.Offset);
564 Segment.Content.writeAsBinary(OS);
568void WasmWriter::writeSectionContent(raw_ostream &OS,
569 WasmYAML::DataCountSection &Section) {
573void WasmWriter::writeRelocSection(raw_ostream &OS, WasmYAML::Section &Sec,
574 uint32_t SectionIndex) {
603bool WasmWriter::writeWasm(raw_ostream &OS) {
609 llvm::object::WasmSectionOrderChecker Checker;
610 for (
const std::unique_ptr<WasmYAML::Section> &Sec : Obj.
Sections) {
611 StringRef SecName =
"";
620 std::string OutString;
621 raw_string_ostream StringStream(OutString);
623 writeSectionContent(StringStream, *S);
625 writeSectionContent(StringStream, *S);
627 writeSectionContent(StringStream, *S);
629 writeSectionContent(StringStream, *S);
631 writeSectionContent(StringStream, *S);
633 writeSectionContent(StringStream, *S);
635 writeSectionContent(StringStream, *S);
637 writeSectionContent(StringStream, *S);
639 writeSectionContent(StringStream, *S);
641 writeSectionContent(StringStream, *S);
643 writeSectionContent(StringStream, *S);
645 writeSectionContent(StringStream, *S);
647 writeSectionContent(StringStream, *S);
649 writeSectionContent(StringStream, *S);
651 reportError(
"unknown section type: " + Twine(Sec->Type));
656 StringStream.
flush();
658 unsigned HeaderSecSizeEncodingLen =
659 Sec->HeaderSecSizeEncodingLen.value_or(5);
663 if (HeaderSecSizeEncodingLen < RequiredLen) {
664 reportError(
"section header length can't be encoded in a LEB of size " +
665 Twine(HeaderSecSizeEncodingLen));
669 encodeULEB128(OutString.size(), OS, HeaderSecSizeEncodingLen);
674 uint32_t SectionIndex = 0;
675 for (
const std::unique_ptr<WasmYAML::Section> &Sec : Obj.
Sections) {
676 if (Sec->Relocations.empty()) {
682 std::string OutString;
683 raw_string_ostream StringStream(OutString);
684 writeRelocSection(StringStream, *Sec, SectionIndex++);
685 StringStream.
flush();
698 WasmWriter Writer(Doc, EH);
699 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")
Analysis containing CSE Info
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_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.