diff options
Diffstat (limited to 'third_party/wasm2c/src/emscripten-helpers.cc')
-rw-r--r-- | third_party/wasm2c/src/emscripten-helpers.cc | 403 |
1 files changed, 403 insertions, 0 deletions
diff --git a/third_party/wasm2c/src/emscripten-helpers.cc b/third_party/wasm2c/src/emscripten-helpers.cc new file mode 100644 index 0000000000..127a8c458d --- /dev/null +++ b/third_party/wasm2c/src/emscripten-helpers.cc @@ -0,0 +1,403 @@ +/* + * Copyright 2016 WebAssembly Community Group participants + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef WABT_EMSCRIPTEN_HELPERS_H_ +#define WABT_EMSCRIPTEN_HELPERS_H_ + +#include <cstddef> + +#include <algorithm> +#include <iterator> +#include <memory> +#include <utility> +#include <vector> + +#include "wabt/apply-names.h" +#include "wabt/binary-reader-ir.h" +#include "wabt/binary-reader.h" +#include "wabt/binary-writer-spec.h" +#include "wabt/binary-writer.h" +#include "wabt/common.h" +#include "wabt/error-formatter.h" +#include "wabt/feature.h" +#include "wabt/filenames.h" +#include "wabt/generate-names.h" +#include "wabt/ir.h" +#include "wabt/stream.h" +#include "wabt/validator.h" +#include "wabt/wast-lexer.h" +#include "wabt/wast-parser.h" +#include "wabt/wat-writer.h" + +using WabtOutputBufferPtr = std::unique_ptr<wabt::OutputBuffer>; +using WabtFilenameOutputBufferPair = + std::pair<std::string, WabtOutputBufferPtr>; + +struct WabtParseWatResult { + wabt::Result result; + std::unique_ptr<wabt::Module> module; +}; + +struct WabtReadBinaryResult { + wabt::Result result; + std::unique_ptr<wabt::Module> module; +}; + +struct WabtWriteModuleResult { + wabt::Result result; + WabtOutputBufferPtr buffer; + WabtOutputBufferPtr log_buffer; +}; + +struct WabtWriteScriptResult { + wabt::Result result; + WabtOutputBufferPtr json_buffer; + WabtOutputBufferPtr log_buffer; + std::vector<WabtFilenameOutputBufferPair> module_buffers; +}; + +struct WabtParseWastResult { + wabt::Result result; + std::unique_ptr<wabt::Script> script; +}; + +extern "C" { + +wabt::Features* wabt_new_features(void) { + return new wabt::Features(); +} + +void wabt_destroy_features(wabt::Features* f) { + delete f; +} + +#define WABT_FEATURE(variable, flag, default_, help) \ + bool wabt_##variable##_enabled(wabt::Features* f) { \ + return f->variable##_enabled(); \ + } \ + void wabt_set_##variable##_enabled(wabt::Features* f, int enabled) { \ + f->set_##variable##_enabled(enabled); \ + } +#include "wabt/feature.def" +#undef WABT_FEATURE + +wabt::WastLexer* wabt_new_wast_buffer_lexer(const char* filename, + const void* data, + size_t size, + wabt::Errors* errors) { + std::unique_ptr<wabt::WastLexer> lexer = + wabt::WastLexer::CreateBufferLexer(filename, data, size, errors); + return lexer.release(); +} + +WabtParseWatResult* wabt_parse_wat(wabt::WastLexer* lexer, + wabt::Features* features, + wabt::Errors* errors) { + wabt::WastParseOptions options(*features); + WabtParseWatResult* result = new WabtParseWatResult(); + std::unique_ptr<wabt::Module> module; + result->result = wabt::ParseWatModule(lexer, &module, errors, &options); + result->module = std::move(module); + return result; +} + +WabtParseWastResult* wabt_parse_wast(wabt::WastLexer* lexer, + wabt::Features* features, + wabt::Errors* errors) { + wabt::WastParseOptions options(*features); + WabtParseWastResult* result = new WabtParseWastResult(); + std::unique_ptr<wabt::Script> script; + result->result = wabt::ParseWastScript(lexer, &script, errors, &options); + result->script = std::move(script); + return result; +} + +WabtReadBinaryResult* wabt_read_binary(const void* data, + size_t size, + int read_debug_names, + wabt::Features* features, + wabt::Errors* errors) { + wabt::ReadBinaryOptions options; + options.features = *features; + options.read_debug_names = read_debug_names; + + WabtReadBinaryResult* result = new WabtReadBinaryResult(); + wabt::Module* module = new wabt::Module(); + // TODO(binji): Pass through from wabt_read_binary parameter. + const char* filename = "<binary>"; + result->result = + wabt::ReadBinaryIr(filename, data, size, options, errors, module); + result->module.reset(module); + return result; +} + +wabt::Result::Enum wabt_validate_module(wabt::Module* module, + wabt::Features* features, + wabt::Errors* errors) { + wabt::ValidateOptions options; + options.features = *features; + return ValidateModule(module, errors, options); +} + +wabt::Result::Enum wabt_validate_script(wabt::Script* script, + wabt::Features* features, + wabt::Errors* errors) { + wabt::ValidateOptions options; + options.features = *features; + return ValidateScript(script, errors, options); +} + +WabtWriteScriptResult* wabt_write_binary_spec_script( + wabt::Script* script, + const char* source_filename, + const char* out_filename, + int log, + int canonicalize_lebs, + int relocatable, + int write_debug_names) { + wabt::MemoryStream log_stream; + wabt::MemoryStream* log_stream_p = log ? &log_stream : nullptr; + + wabt::WriteBinaryOptions options; + options.canonicalize_lebs = canonicalize_lebs; + options.relocatable = relocatable; + options.write_debug_names = write_debug_names; + + std::vector<wabt::FilenameMemoryStreamPair> module_streams; + wabt::MemoryStream json_stream(log_stream_p); + + std::string module_filename_noext( + wabt::StripExtension(out_filename ? out_filename : source_filename)); + + WabtWriteScriptResult* result = new WabtWriteScriptResult(); + result->result = WriteBinarySpecScript(&json_stream, script, source_filename, + module_filename_noext, options, + &module_streams, log_stream_p); + + if (result->result == wabt::Result::Ok) { + result->json_buffer = json_stream.ReleaseOutputBuffer(); + result->log_buffer = log ? log_stream.ReleaseOutputBuffer() : nullptr; + std::transform(module_streams.begin(), module_streams.end(), + std::back_inserter(result->module_buffers), + [](wabt::FilenameMemoryStreamPair& pair) { + return WabtFilenameOutputBufferPair( + pair.filename, pair.stream->ReleaseOutputBuffer()); + }); + } + return result; +} + +wabt::Result::Enum wabt_apply_names_module(wabt::Module* module) { + return ApplyNames(module); +} + +wabt::Result::Enum wabt_generate_names_module(wabt::Module* module) { + return GenerateNames(module); +} + +WabtWriteModuleResult* wabt_write_binary_module(wabt::Module* module, + int log, + int canonicalize_lebs, + int relocatable, + int write_debug_names) { + wabt::MemoryStream log_stream; + wabt::WriteBinaryOptions options; + options.canonicalize_lebs = canonicalize_lebs; + options.relocatable = relocatable; + options.write_debug_names = write_debug_names; + + wabt::MemoryStream stream(log ? &log_stream : nullptr); + WabtWriteModuleResult* result = new WabtWriteModuleResult(); + result->result = WriteBinaryModule(&stream, module, options); + if (result->result == wabt::Result::Ok) { + result->buffer = stream.ReleaseOutputBuffer(); + result->log_buffer = log ? log_stream.ReleaseOutputBuffer() : nullptr; + } + return result; +} + +WabtWriteModuleResult* wabt_write_text_module(wabt::Module* module, + int fold_exprs, + int inline_export) { + wabt::WriteWatOptions options; + options.fold_exprs = fold_exprs; + options.inline_export = inline_export; + + wabt::MemoryStream stream; + WabtWriteModuleResult* result = new WabtWriteModuleResult(); + result->result = WriteWat(&stream, module, options); + if (result->result == wabt::Result::Ok) { + result->buffer = stream.ReleaseOutputBuffer(); + } + return result; +} + +void wabt_destroy_module(wabt::Module* module) { + delete module; +} + +void wabt_destroy_wast_lexer(wabt::WastLexer* lexer) { + delete lexer; +} + +// Errors +wabt::Errors* wabt_new_errors(void) { + return new wabt::Errors(); +} + +wabt::OutputBuffer* wabt_format_text_errors(wabt::Errors* errors, + wabt::WastLexer* lexer) { + auto line_finder = lexer->MakeLineFinder(); + std::string string_result = FormatErrorsToString( + *errors, wabt::Location::Type::Text, line_finder.get()); + + wabt::OutputBuffer* result = new wabt::OutputBuffer(); + std::copy(string_result.begin(), string_result.end(), + std::back_inserter(result->data)); + return result; +} + +wabt::OutputBuffer* wabt_format_binary_errors(wabt::Errors* errors) { + std::string string_result = + FormatErrorsToString(*errors, wabt::Location::Type::Binary); + + wabt::OutputBuffer* result = new wabt::OutputBuffer(); + std::copy(string_result.begin(), string_result.end(), + std::back_inserter(result->data)); + return result; +} + +void wabt_destroy_errors(wabt::Errors* errors) { + delete errors; +} + +// WabtParseWatResult +wabt::Result::Enum wabt_parse_wat_result_get_result( + WabtParseWatResult* result) { + return result->result; +} + +wabt::Module* wabt_parse_wat_result_release_module(WabtParseWatResult* result) { + return result->module.release(); +} + +void wabt_destroy_parse_wat_result(WabtParseWatResult* result) { + delete result; +} + +// WabtParseWastResult +wabt::Result::Enum wabt_parse_wast_result_get_result( + WabtParseWastResult* result) { + return result->result; +} + +wabt::Script* wabt_parse_wast_result_release_module( + WabtParseWastResult* result) { + return result->script.release(); +} + +void wabt_destroy_parse_wast_result(WabtParseWastResult* result) { + delete result; +} + +// WabtReadBinaryResult +wabt::Result::Enum wabt_read_binary_result_get_result( + WabtReadBinaryResult* result) { + return result->result; +} + +wabt::Module* wabt_read_binary_result_release_module( + WabtReadBinaryResult* result) { + return result->module.release(); +} + +void wabt_destroy_read_binary_result(WabtReadBinaryResult* result) { + delete result; +} + +// WabtWriteModuleResult +wabt::Result::Enum wabt_write_module_result_get_result( + WabtWriteModuleResult* result) { + return result->result; +} + +wabt::OutputBuffer* wabt_write_module_result_release_output_buffer( + WabtWriteModuleResult* result) { + return result->buffer.release(); +} + +wabt::OutputBuffer* wabt_write_module_result_release_log_output_buffer( + WabtWriteModuleResult* result) { + return result->log_buffer.release(); +} + +void wabt_destroy_write_module_result(WabtWriteModuleResult* result) { + delete result; +} + +// WabtWriteScriptResult +wabt::Result::Enum wabt_write_script_result_get_result( + WabtWriteScriptResult* result) { + return result->result; +} + +wabt::OutputBuffer* wabt_write_script_result_release_json_output_buffer( + WabtWriteScriptResult* result) { + return result->json_buffer.release(); +} + +wabt::OutputBuffer* wabt_write_script_result_release_log_output_buffer( + WabtWriteScriptResult* result) { + return result->log_buffer.release(); +} + +size_t wabt_write_script_result_get_module_count( + WabtWriteScriptResult* result) { + return result->module_buffers.size(); +} + +const char* wabt_write_script_result_get_module_filename( + WabtWriteScriptResult* result, + size_t index) { + return result->module_buffers[index].first.c_str(); +} + +wabt::OutputBuffer* wabt_write_script_result_release_module_output_buffer( + WabtWriteScriptResult* result, + size_t index) { + return result->module_buffers[index].second.release(); +} + +void wabt_destroy_write_script_result(WabtWriteScriptResult* result) { + delete result; +} + +// wabt::OutputBuffer* +const void* wabt_output_buffer_get_data(wabt::OutputBuffer* output_buffer) { + return output_buffer->data.data(); +} + +size_t wabt_output_buffer_get_size(wabt::OutputBuffer* output_buffer) { + return output_buffer->data.size(); +} + +void wabt_destroy_output_buffer(wabt::OutputBuffer* output_buffer) { + delete output_buffer; +} + +} // extern "C" + +#endif /* WABT_EMSCRIPTEN_HELPERS_H_ */ |