#llvm #run-time #vm #编译器 #webassembly

wasmlite-llvm

此软件包创建 LLVM 模块和 AOT/JIT 功能

1 个不稳定版本

0.0.1 2019年2月14日

#141#llvm


3 个软件包中使用(通过 wasmlite-parser

Apache-2.0

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

  • 其他功能

待办事项

依赖项

~0.3–0.8MB
~17K SLoC