summaryrefslogtreecommitdiffstats
path: root/contrib/restricted/wavm/Lib/IR/Module.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/restricted/wavm/Lib/IR/Module.cpp')
-rw-r--r--contrib/restricted/wavm/Lib/IR/Module.cpp102
1 files changed, 102 insertions, 0 deletions
diff --git a/contrib/restricted/wavm/Lib/IR/Module.cpp b/contrib/restricted/wavm/Lib/IR/Module.cpp
new file mode 100644
index 00000000000..4c74489002d
--- /dev/null
+++ b/contrib/restricted/wavm/Lib/IR/Module.cpp
@@ -0,0 +1,102 @@
+#include "WAVM/IR/Module.h"
+#include "WAVM/IR/IR.h"
+
+using namespace WAVM;
+using namespace WAVM::IR;
+
+const char* IR::asString(OrderedSectionID id)
+{
+ switch(id)
+ {
+ case OrderedSectionID::moduleBeginning: return "module beginning";
+ case OrderedSectionID::type: return "type";
+ case OrderedSectionID::import: return "import";
+ case OrderedSectionID::function: return "func";
+ case OrderedSectionID::table: return "table";
+ case OrderedSectionID::memory: return "memory";
+ case OrderedSectionID::global: return "global";
+ case OrderedSectionID::exceptionType: return "exception_type";
+ case OrderedSectionID::export_: return "export";
+ case OrderedSectionID::start: return "start";
+ case OrderedSectionID::elem: return "elem";
+ case OrderedSectionID::dataCount: return "data_count";
+ case OrderedSectionID::code: return "code";
+ case OrderedSectionID::data: return "data";
+
+ default: WAVM_UNREACHABLE();
+ };
+}
+
+bool IR::findCustomSection(const Module& module,
+ const char* customSectionName,
+ Uptr& outCustomSectionIndex)
+{
+ for(Uptr sectionIndex = 0; sectionIndex < module.customSections.size(); ++sectionIndex)
+ {
+ if(module.customSections[sectionIndex].name == customSectionName)
+ {
+ outCustomSectionIndex = sectionIndex;
+ return true;
+ }
+ }
+ return false;
+}
+
+void IR::insertCustomSection(Module& module, CustomSection&& customSection)
+{
+ auto it = module.customSections.begin();
+ for(; it != module.customSections.end(); ++it)
+ {
+ if(it->afterSection > customSection.afterSection) { break; }
+ }
+ module.customSections.insert(it, std::move(customSection));
+}
+
+OrderedSectionID IR::getMaxPresentSection(const Module& module, OrderedSectionID maxSection)
+{
+ switch(maxSection)
+ {
+ case OrderedSectionID::data:
+ if(hasDataSection(module)) { return OrderedSectionID::data; }
+ // fall through
+ case OrderedSectionID::code:
+ if(hasCodeSection(module)) { return OrderedSectionID::code; }
+ // fall through
+ case OrderedSectionID::dataCount:
+ if(hasDataCountSection(module)) { return OrderedSectionID::dataCount; }
+ // fall through
+ case OrderedSectionID::elem:
+ if(hasElemSection(module)) { return OrderedSectionID::elem; }
+ // fall through
+ case OrderedSectionID::start:
+ if(hasStartSection(module)) { return OrderedSectionID::start; }
+ // fall through
+ case OrderedSectionID::export_:
+ if(hasExportSection(module)) { return OrderedSectionID::export_; }
+ // fall through
+ case OrderedSectionID::exceptionType:
+ if(hasExceptionTypeSection(module)) { return OrderedSectionID::exceptionType; }
+ // fall through
+ case OrderedSectionID::global:
+ if(hasGlobalSection(module)) { return OrderedSectionID::global; }
+ // fall through
+ case OrderedSectionID::memory:
+ if(hasMemorySection(module)) { return OrderedSectionID::memory; }
+ // fall through
+ case OrderedSectionID::table:
+ if(hasTableSection(module)) { return OrderedSectionID::table; }
+ // fall through
+ case OrderedSectionID::function:
+ if(hasFunctionSection(module)) { return OrderedSectionID::function; }
+ // fall through
+ case OrderedSectionID::import:
+ if(hasImportSection(module)) { return OrderedSectionID::import; }
+ // fall through
+ case OrderedSectionID::type:
+ if(hasTypeSection(module)) { return OrderedSectionID::type; }
+ // fall through
+ case OrderedSectionID::moduleBeginning: return OrderedSectionID::moduleBeginning;
+
+ default: WAVM_UNREACHABLE();
+ };
+}