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-bindings
First, 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-bindings
Note: The build type of
llvm-bindings
must 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-bindings
import 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
module
in top level, becausemodule
is 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.