1 个不稳定版本
0.0.1 | 2019年2月14日 |
---|
#87 在 #runtime
65KB
1.5K SLoC
WASMLITE (WASM TO LLVM)
本项目旨在提供将 wasm 二进制编译为 LLVM IR 所需的工具,LLVM IR 可以进一步编译为特定机器的代码。
本项目旨在让编译到 wasm 的语言更容易利用 LLVM 基础设施。
它还允许去除昂贵的 wasm 运行时元素,在不需要完整的 wasm 规范时。
最后,它是一个了解 WebAssembly、LLVM 以及它们如何协同工作的平台。
可能的 API (非最终版本)
编译管道
// Create compiler flags.
let compiler_flags = Some(CompilerOptions {
optimization_level: 3,
exclude_passes: vec![
LLVMPass::InstCombine,
],
runtime_ignores: vec![
RuntimeProperty::SignatureChecks,
RuntimeProperty::MemoryBoundsChecks,
],
strategy: CompilationStrategy::Normal,
});
// Create wasm instance options.
let instance_options = Some(InstanceOptions {
compiler_flags,
abi: vec![ABI::LLVMMusl],
});
// JIT compile module in current process.
let (module, instance) = Runtime::instantiate(wasm_binary, imports, instance_options);
// Get the exported main function from instance.
let main = instance.get_func("main");
// Store array of items in wasm memory 0
let wasm_array = instance.set_array(&arguments);
// Call the function.
main.call(5, wasm_array);
编译类型
AOT 编译
// Create compiler flags.
let compiler_flags = Some(CompilerOptions {
strategy: CompilationStrategy::AheadOfTime,
..
});
// Create wasm instance options.
let instance_options = Some(InstanceOptions { compiler_flags, .. });
// instance holds an in-memory object code of the entire wasm program.
// Possibly generates a dylib for known imports as well.
let (module, instantiate) = Runtime::instantiate(wasm_binary, imports, instance_options);
// Create executables.
let (imports_dylib, wasm_exe) = module.create_executables();
懒编译
// Create compiler flags.
let compiler_flags = Some(CompilerOptions {
strategy: CompilationStrategy::LazyCompilation,
..
});
// Create wasm instance options.
let instance_options = Some(InstanceOptions { compiler_flags, .. });
// Functions are not compiled until their first call.
let (module, instance) = Runtime::instantiate(wasm_binary, imports, instance_options);
REPL 类型懒编译
// Create compiler flags.
let compiler_flags = Some(CompilerOptions {
strategy: CompilationStrategy::REPL,
..
});
// Create wasm instance options.
let instance_options = Some(InstanceOptions { compiler_flags, .. });
// Lazily compiles the entire wasm instance.
let (module, instance) = Runtime::instantiate(wasm_binary, imports, instance_options);
// ???
let func = module.add_function(wasm_function_binary, instance);
let expression = module.add_expression(wasm_expression_binary, instance);
非目标
- 具有多个后端
策略
- 单遍解析、验证和从 wasm 二进制到 LLVM IR 的代码生成
当前支持
-
解析器
- 前缀
- 类型
- 导入
- 内部内存、表格
- 元素、数据、全局变量
- 函数体
- 导出
-
代码生成
-
运行时
-
编译策略
-
编译标志
-
一个 ABI
-
其他特性
待办事项
-
wasm32 到 LLVMIR 到机器代码
-
模糊测试
-
单元测试
-
验证(UTF-8 [Unicode 标准第 11.0 版,第 3.9 节,表 3-7。有效的 UTF-8 字节序列] 和语义)
-
错误消息以及使错误位置指向错误而不是起始位置
依赖项
~0.3–0.8MB
~17K SLoC