1 个不稳定版本
0.0.1 | 2019年2月14日 |
---|
#141 在 #llvm
在 3 个软件包中使用(通过 wasmlite-parser)
3KB
WASMLITE (WASM TO LLVM)
此项目旨在提供编译 wasm 二进制文件到 LLVM IR 所需的工具,该 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