diff options
Diffstat (limited to 'tools/yaml2obj/yaml2wasm.cpp')
-rw-r--r-- | tools/yaml2obj/yaml2wasm.cpp | 60 |
1 files changed, 44 insertions, 16 deletions
diff --git a/tools/yaml2obj/yaml2wasm.cpp b/tools/yaml2obj/yaml2wasm.cpp index cf591e16317c..110700d40c32 100644 --- a/tools/yaml2obj/yaml2wasm.cpp +++ b/tools/yaml2obj/yaml2wasm.cpp @@ -110,22 +110,52 @@ static int writeInitExpr(const wasm::WasmInitExpr &InitExpr, raw_ostream &OS) { return 0; } +class SubSectionWriter { + raw_ostream &OS; + std::string OutString; + raw_string_ostream StringStream; + +public: + SubSectionWriter(raw_ostream &OS) : OS(OS), StringStream(OutString) {} + + void Done() { + StringStream.flush(); + encodeULEB128(OutString.size(), OS); + OS << OutString; + OutString.clear(); + } + + raw_ostream& GetStream() { + return StringStream; + } +}; + int WasmWriter::writeSectionContent(raw_ostream &OS, WasmYAML::LinkingSection &Section) { writeStringRef(Section.Name, OS); + + SubSectionWriter SubSection(OS); + + // DATA_SIZE subsection + encodeULEB128(wasm::WASM_DATA_SIZE, OS); + encodeULEB128(Section.DataSize, SubSection.GetStream()); + SubSection.Done(); + + // DATA_ALIGNMENT subsection + encodeULEB128(wasm::WASM_DATA_ALIGNMENT, OS); + encodeULEB128(Section.DataAlignment, SubSection.GetStream()); + SubSection.Done(); + + // SYMBOL_INFO subsection if (Section.SymbolInfos.size()) { encodeULEB128(wasm::WASM_SYMBOL_INFO, OS); - std::string OutString; - raw_string_ostream StringStream(OutString); - encodeULEB128(Section.SymbolInfos.size(), StringStream); + encodeULEB128(Section.SymbolInfos.size(), SubSection.GetStream()); for (const WasmYAML::SymbolInfo &Info : Section.SymbolInfos) { - writeStringRef(Info.Name, StringStream); - encodeULEB128(Info.Flags, StringStream); + writeStringRef(Info.Name, SubSection.GetStream()); + encodeULEB128(Info.Flags, SubSection.GetStream()); } - StringStream.flush(); - encodeULEB128(OutString.size(), OS); - OS << OutString; + SubSection.Done(); } return 0; } @@ -134,18 +164,16 @@ int WasmWriter::writeSectionContent(raw_ostream &OS, WasmYAML::NameSection &Sect writeStringRef(Section.Name, OS); if (Section.FunctionNames.size()) { encodeULEB128(wasm::WASM_NAMES_FUNCTION, OS); - std::string OutString; - raw_string_ostream StringStream(OutString); - encodeULEB128(Section.FunctionNames.size(), StringStream); + SubSectionWriter SubSection(OS); + + encodeULEB128(Section.FunctionNames.size(), SubSection.GetStream()); for (const WasmYAML::NameEntry &NameEntry : Section.FunctionNames) { - encodeULEB128(NameEntry.Index, StringStream); - writeStringRef(NameEntry.Name, StringStream); + encodeULEB128(NameEntry.Index, SubSection.GetStream()); + writeStringRef(NameEntry.Name, SubSection.GetStream()); } - StringStream.flush(); - encodeULEB128(OutString.size(), OS); - OS << OutString; + SubSection.Done(); } return 0; } |