29 : Obj(Obj), ErrHandler(EH) {}
66 bool HasError =
false;
71class SubSectionWriter {
73 std::string OutString;
92 char Data[
sizeof(
Value)];
99 char Data[
sizeof(
Value)];
106 char Data[
sizeof(
Value)];
107 memcpy(Data, &
Value,
sizeof(Data));
126void WasmWriter::reportError(
const Twine &Msg) {
167 SubSectionWriter SubSection(
OS);
190 SubSectionWriter SubSection(
OS);
193 if (
Section.SymbolTable.size()) {
231 if (
Section.SegmentInfos.size()) {
243 if (
Section.InitFunctions.size()) {
257 for (
const auto &
C :
Section.Comdats) {
273 if (
Section.FunctionNames.size()) {
276 SubSectionWriter SubSection(
OS);
286 if (
Section.GlobalNames.size()) {
289 SubSectionWriter SubSection(
OS);
299 if (
Section.DataSegmentNames.size()) {
302 SubSectionWriter SubSection(
OS);
317 int Fields = int(!
Section.Languages.empty()) + int(!
Section.Tools.empty()) +
325 if (
Field.second->empty())
329 for (
auto &Entry : *
Field.second) {
340 for (
auto &E :
Section.Features) {
348 if (
auto S = dyn_cast<WasmYAML::DylinkSection>(&Section)) {
349 writeSectionContent(
OS, *S);
350 }
else if (
auto S = dyn_cast<WasmYAML::NameSection>(&Section)) {
351 writeSectionContent(
OS, *S);
352 }
else if (
auto S = dyn_cast<WasmYAML::LinkingSection>(&Section)) {
353 writeSectionContent(
OS, *S);
354 }
else if (
auto S = dyn_cast<WasmYAML::ProducersSection>(&Section)) {
355 writeSectionContent(
OS, *S);
356 }
else if (
auto S = dyn_cast<WasmYAML::TargetFeaturesSection>(&Section)) {
357 writeSectionContent(
OS, *S);
369 if (Sig.
Index != ExpectedIndex) {
394 NumImportedFunctions++;
399 NumImportedGlobals++;
446 uint32_t ExpectedIndex = NumImportedTables;
447 for (
auto &Table :
Section.Tables) {
448 if (Table.Index != ExpectedIndex) {
477 uint32_t ExpectedIndex = NumImportedGlobals;
479 if (
Global.Index != ExpectedIndex) {
493 for (
auto &Segment :
Section.Segments) {
498 writeInitExpr(
OS, Segment.Offset);
504 if (Segment.ElemKind !=
uint32_t(wasm::ValType::FUNCREF)) {
513 for (
auto &
Function : Segment.Functions)
521 uint32_t ExpectedIndex = NumImportedFunctions;
522 for (
auto &Func :
Section.Functions) {
523 std::string OutString;
525 if (
Func.Index != ExpectedIndex) {
532 for (
auto &LocalDecl :
Func.Locals) {
537 Func.Body.writeAsBinary(StringStream);
540 StringStream.
flush();
549 for (
auto &Segment :
Section.Segments) {
554 writeInitExpr(
OS, Segment.Offset);
556 Segment.Content.writeAsBinary(
OS);
575 auto *CustomSection = cast<WasmYAML::CustomSection>(&Sec);
602 for (
const std::unique_ptr<WasmYAML::Section> &Sec : Obj.Sections) {
604 if (
auto S = dyn_cast<WasmYAML::CustomSection>(Sec.get()))
606 if (!Checker.isValidSectionOrder(Sec->Type, SecName)) {
612 std::string OutString;
614 if (
auto S = dyn_cast<WasmYAML::CustomSection>(Sec.get()))
615 writeSectionContent(StringStream, *S);
616 else if (
auto S = dyn_cast<WasmYAML::TypeSection>(Sec.get()))
617 writeSectionContent(StringStream, *S);
618 else if (
auto S = dyn_cast<WasmYAML::ImportSection>(Sec.get()))
619 writeSectionContent(StringStream, *S);
620 else if (
auto S = dyn_cast<WasmYAML::FunctionSection>(Sec.get()))
621 writeSectionContent(StringStream, *S);
622 else if (
auto S = dyn_cast<WasmYAML::TableSection>(Sec.get()))
623 writeSectionContent(StringStream, *S);
624 else if (
auto S = dyn_cast<WasmYAML::MemorySection>(Sec.get()))
625 writeSectionContent(StringStream, *S);
626 else if (
auto S = dyn_cast<WasmYAML::TagSection>(Sec.get()))
627 writeSectionContent(StringStream, *S);
628 else if (
auto S = dyn_cast<WasmYAML::GlobalSection>(Sec.get()))
629 writeSectionContent(StringStream, *S);
630 else if (
auto S = dyn_cast<WasmYAML::ExportSection>(Sec.get()))
631 writeSectionContent(StringStream, *S);
632 else if (
auto S = dyn_cast<WasmYAML::StartSection>(Sec.get()))
633 writeSectionContent(StringStream, *S);
634 else if (
auto S = dyn_cast<WasmYAML::ElemSection>(Sec.get()))
635 writeSectionContent(StringStream, *S);
636 else if (
auto S = dyn_cast<WasmYAML::CodeSection>(Sec.get()))
637 writeSectionContent(StringStream, *S);
638 else if (
auto S = dyn_cast<WasmYAML::DataSection>(Sec.get()))
639 writeSectionContent(StringStream, *S);
640 else if (
auto S = dyn_cast<WasmYAML::DataCountSection>(Sec.get()))
641 writeSectionContent(StringStream, *S);
648 StringStream.
flush();
650 unsigned HeaderSecSizeEncodingLen =
651 Sec->HeaderSecSizeEncodingLen.value_or(5);
655 if (HeaderSecSizeEncodingLen < RequiredLen) {
656 reportError(
"section header length can't be encoded in a LEB of size " +
657 Twine(HeaderSecSizeEncodingLen));
667 for (
const std::unique_ptr<WasmYAML::Section> &Sec : Obj.Sections) {
668 if (Sec->Relocations.empty()) {
674 std::string OutString;
676 writeRelocSection(StringStream, *Sec, SectionIndex++);
677 StringStream.
flush();
690 WasmWriter Writer(Doc, EH);
691 return Writer.writeWasm(Out);
static Error reportError(StringRef Message)
Analysis containing CSE Info
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
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.
An efficient, type-erasing, non-owning reference to a callable.
This class implements an extremely fast bulk output stream that can only output to a stream.
raw_ostream & write(unsigned char C)
A raw_ostream that writes to an std::string.
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_ELEM_SEGMENT_HAS_TABLE_NUMBER
const unsigned WASM_ELEM_SEGMENT_MASK_HAS_ELEM_KIND
@ WASM_NAMES_DATA_SEGMENT
@ WASM_SYMBOL_TYPE_GLOBAL
@ WASM_SYMBOL_TYPE_SECTION
@ WASM_SYMBOL_TYPE_FUNCTION
@ WASM_LIMITS_FLAG_HAS_MAX
bool relocTypeHasAddend(uint32_t type)
@ WASM_DATA_SEGMENT_IS_PASSIVE
@ WASM_DATA_SEGMENT_HAS_MEMINDEX
llvm::StringRef sectionTypeToString(uint32_t type)
const unsigned WASM_SYMBOL_EXPLICIT_NAME
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,...
@ Export
Export information to summary.
@ Import
Import information from summary.
@ Global
Append to llvm.global_dtors.
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.
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< Relocation > Relocations
std::vector< ValueType > ReturnTypes
std::vector< ValueType > ParamTypes
union llvm::wasm::WasmInitExprMVP::@187 Value
Common declarations for yaml2obj.