summaryrefslogtreecommitdiff
path: root/tools/yaml2obj/yaml2wasm.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tools/yaml2obj/yaml2wasm.cpp')
-rw-r--r--tools/yaml2obj/yaml2wasm.cpp60
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;
}