LLVM bindings for Node.js/JavaScript/TypeScript
| x86_64 | ARM64 | |
|---|---|---|
| macOS 10.15 Catalina | ✅ | / | 
| macOS 11 Big Sur | ✅ | ✅ | 
| macOS 12 Monterey | ✅ | ✅ | 
| Ubuntu 18.04 | ✅ | ✅ | 
| Ubuntu 20.04 | ✅ | ✅ | 
| Ubuntu 22.04 | ✅ | ✅ | 
| Windows 10 | ✅ | |
| Windows 11 | ✅ | 
⚠️ means not tested.
listed in the TypeScript definition file.
# install cmake and llvm by homebrew
brew install cmake llvm@14
# install llvm-bindings by npm
npm install llvm-bindings#install llvm by installation script
wget https://apt.llvm.org/llvm.sh
sudo chmod +x llvm.sh
sudo ./llvm.sh 14
# install cmake and zlib by apt-get
sudo apt-get install cmake zlib1g-dev
# install llvm-bindings by npm
npm install llvm-bindingsFirst, please refer to Build LLVM from sources on Windows 10 to build LLVM. An alternative is to download prebuilt LLVM binary.
Then, find the llvm-config command in your LLVM build directory and execute llvm-config --cmakedir to get LLVM cmake directory, assuming C:\Users\dev\llvm-13.0.1.src\build\lib\cmake\llvm.
Finally, execute the following commands.
# specify the LLVM cmake directory for cmake-js
npm config set cmake_LLVM_DIR C:\Users\dev\llvm-13.0.1.src\build\lib\cmake\llvm
# install llvm-bindings by npm
npm install llvm-bindingsNote: The build type of
llvm-bindingsmust be consistent with LLVM, otherwise there will be many compilation errors when buildingllvm-bindings.
You can use the npm configuration options to set the path to the LLVM cmake directory. This is needed if you don't want to use the system default LLVM installation.
# specify the llvm cmake directory by npm and cmake-js
npm config set cmake_LLVM_DIR $(path-to-llvm/bin/llvm-config --cmakedir)
# install llvm-bindings by npm
npm install llvm-bindingsimport llvm from 'llvm-bindings';
function main(): void {
    const context = new llvm.LLVMContext();
    const module = new llvm.Module('demo', context);
    const builder = new llvm.IRBuilder(context);
    const returnType = builder.getInt32Ty();
    const paramTypes = [builder.getInt32Ty(), builder.getInt32Ty()];
    const functionType = llvm.FunctionType.get(returnType, paramTypes, false);
    const func = llvm.Function.Create(functionType, llvm.Function.LinkageTypes.ExternalLinkage, 'add', module);
    const entryBB = llvm.BasicBlock.Create(context, 'entry', func);
    builder.SetInsertPoint(entryBB);
    const a = func.getArg(0);
    const b = func.getArg(1);
    const result = builder.CreateAdd(a, b);
    builder.CreateRet(result);
    if (llvm.verifyFunction(func)) {
        console.error('Verifying function failed');
        return;
    }
    if (llvm.verifyModule(module)) {
        console.error('Verifying module failed');
        return;
    }
    console.log(module.print());
}
main();You cannot declare a variable or constant named
modulein top level, becausemoduleis a built-in object in Node.js.
Due to the limitation of node-addon-api, this project has not implemented inheritance yet, so calling the method of superclass from subclass object will report an error. Please see #1 for details.
| llvm-bindings versions | compatible LLVM versions | 
|---|---|
| 0.0.x, 0.1.x | 11.0.x, 11.1.x | 
| 0.2.x | 12.0.x | 
| 0.3.x | 13.0.x | 
| 0.4.x | 14.0.x | 
- MichaReiser: the creator of llvm-node
 
llvm-bindings is mostly inspired by llvm-node.