[llvm] [IR2Vec] llvm-ir2vec python bindings scaffolding (PR #176571)
Nishant Sachdeva via llvm-commits
llvm-commits at lists.llvm.org
Tue Jan 20 05:10:46 PST 2026
https://github.com/nishant-sachdeva updated https://github.com/llvm/llvm-project/pull/176571
>From 94e70f7ae9484321134e6cc58edb09afe3ae1449 Mon Sep 17 00:00:00 2001
From: nishant-sachdeva <nishant.sachdeva at research.iiit.ac.in>
Date: Sat, 17 Jan 2026 18:56:03 +0530
Subject: [PATCH 1/2] Work Commit. llvm-ir2vec python bindings scaffolding
---
llvm/test/lit.site.cfg.py.in | 1 +
.../tools/llvm-ir2vec/bindings/ir2vec_bindings.py | 7 +++++++
llvm/test/tools/llvm-ir2vec/bindings/lit.local.cfg | 9 +++++++++
llvm/tools/llvm-ir2vec/CMakeLists.txt | 13 ++++++++++++-
llvm/tools/llvm-ir2vec/bindings/CMakeLists.txt | 9 +++++++++
llvm/tools/llvm-ir2vec/bindings/ir2vec_bindings.cpp | 13 +++++++++++++
6 files changed, 51 insertions(+), 1 deletion(-)
create mode 100644 llvm/test/tools/llvm-ir2vec/bindings/ir2vec_bindings.py
create mode 100644 llvm/test/tools/llvm-ir2vec/bindings/lit.local.cfg
create mode 100644 llvm/tools/llvm-ir2vec/bindings/CMakeLists.txt
create mode 100644 llvm/tools/llvm-ir2vec/bindings/ir2vec_bindings.cpp
diff --git a/llvm/test/lit.site.cfg.py.in b/llvm/test/lit.site.cfg.py.in
index 193f351ef52ef..6fe48f21cc685 100644
--- a/llvm/test/lit.site.cfg.py.in
+++ b/llvm/test/lit.site.cfg.py.in
@@ -7,6 +7,7 @@ config.target_triple = "@LLVM_TARGET_TRIPLE@"
config.llvm_src_root = path(r"@LLVM_SOURCE_DIR@")
config.llvm_obj_root = path(r"@LLVM_BINARY_DIR@")
config.llvm_tools_dir = lit_config.substitute(path(r"@LLVM_TOOLS_DIR@"))
+config.llvm_ir2vec_test_python_bindings = @LLVM_IR2VEC_TEST_PYTHON_BINDINGS@
config.llvm_lib_dir = lit_config.substitute(path(r"@LLVM_LIBS_DIR@"))
config.llvm_shlib_dir = lit_config.substitute(path(r"@SHLIBDIR@"))
config.llvm_shlib_ext = "@SHLIBEXT@"
diff --git a/llvm/test/tools/llvm-ir2vec/bindings/ir2vec_bindings.py b/llvm/test/tools/llvm-ir2vec/bindings/ir2vec_bindings.py
new file mode 100644
index 0000000000000..926a85aa35c99
--- /dev/null
+++ b/llvm/test/tools/llvm-ir2vec/bindings/ir2vec_bindings.py
@@ -0,0 +1,7 @@
+# RUN: env PYTHONPATH=%llvm_lib_dir %python %s
+
+import py_ir2vec
+
+print("SUCCESS: Module imported")
+
+# CHECK: SUCCESS: Module imported
diff --git a/llvm/test/tools/llvm-ir2vec/bindings/lit.local.cfg b/llvm/test/tools/llvm-ir2vec/bindings/lit.local.cfg
new file mode 100644
index 0000000000000..af02c9e434923
--- /dev/null
+++ b/llvm/test/tools/llvm-ir2vec/bindings/lit.local.cfg
@@ -0,0 +1,9 @@
+import sys
+
+# Only run if user explicitly enabled bindings
+if not config.llvm_ir2vec_test_python_bindings:
+ config.unsupported = True
+else:
+ config.substitutions.append(('%python', sys.executable))
+ config.substitutions.append(('%llvm_lib_dir', config.llvm_lib_dir))
+ config.suffixes = ['.py']
diff --git a/llvm/tools/llvm-ir2vec/CMakeLists.txt b/llvm/tools/llvm-ir2vec/CMakeLists.txt
index 446654b983405..4736d30492412 100644
--- a/llvm/tools/llvm-ir2vec/CMakeLists.txt
+++ b/llvm/tools/llvm-ir2vec/CMakeLists.txt
@@ -19,7 +19,7 @@ set(LLVM_LINK_COMPONENTS
TargetParser
)
-# Add the utils subdirectory for the library
+# Add the lib subdirectory
add_subdirectory(lib)
# Main executable
@@ -32,3 +32,14 @@ add_llvm_tool(llvm-ir2vec
target_include_directories(llvm-ir2vec PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/lib)
target_link_libraries(llvm-ir2vec PRIVATE LLVMEmbUtils)
+
+option(LLVM_IR2VEC_ENABLE_PYTHON_BINDINGS
+ "Build Python bindings for llvm-ir2vec"
+ OFF)
+
+set(LLVM_IR2VEC_TEST_PYTHON_BINDINGS False CACHE INTERNAL "")
+
+if(LLVM_IR2VEC_ENABLE_PYTHON_BINDINGS)
+ add_subdirectory(bindings)
+ set(LLVM_IR2VEC_TEST_PYTHON_BINDINGS True CACHE INTERNAL "" FORCE)
+endif()
diff --git a/llvm/tools/llvm-ir2vec/bindings/CMakeLists.txt b/llvm/tools/llvm-ir2vec/bindings/CMakeLists.txt
new file mode 100644
index 0000000000000..17dadee2d7f61
--- /dev/null
+++ b/llvm/tools/llvm-ir2vec/bindings/CMakeLists.txt
@@ -0,0 +1,9 @@
+find_package(Python3 COMPONENTS Interpreter Development.Module REQUIRED)
+find_package(pybind11 CONFIG REQUIRED)
+
+set_target_properties(LLVMEmbUtils PROPERTIES POSITION_INDEPENDENT_CODE ON)
+
+pybind11_add_module(py_ir2vec MODULE ir2vec_bindings.cpp)
+target_link_libraries(py_ir2vec PRIVATE LLVMEmbUtils)
+
+message(STATUS "Python bindings for llvm-ir2vec will be built")
diff --git a/llvm/tools/llvm-ir2vec/bindings/ir2vec_bindings.cpp b/llvm/tools/llvm-ir2vec/bindings/ir2vec_bindings.cpp
new file mode 100644
index 0000000000000..d0eb34389347b
--- /dev/null
+++ b/llvm/tools/llvm-ir2vec/bindings/ir2vec_bindings.cpp
@@ -0,0 +1,13 @@
+//===- ir2vec_bindings.cpp - Python Bindings for IR2Vec ------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include <pybind11/pybind11.h>
+
+namespace py = pybind11;
+
+PYBIND11_MODULE(py_ir2vec, m) { m.doc() = "Python bindings for IR2Vec"; }
>From a54904e81b44ec8540cc9accf5f31ba054fb7be9 Mon Sep 17 00:00:00 2001
From: nishant-sachdeva <nishant.sachdeva at research.iiit.ac.in>
Date: Tue, 20 Jan 2026 18:40:20 +0530
Subject: [PATCH 2/2] Moving from pybind11 bindings to nanobind bindings to
reflect latest consensus
---
llvm/tools/llvm-ir2vec/bindings/CMakeLists.txt | 13 +++++++++----
llvm/tools/llvm-ir2vec/bindings/ir2vec_bindings.cpp | 6 +++---
2 files changed, 12 insertions(+), 7 deletions(-)
diff --git a/llvm/tools/llvm-ir2vec/bindings/CMakeLists.txt b/llvm/tools/llvm-ir2vec/bindings/CMakeLists.txt
index 17dadee2d7f61..ad0f742510656 100644
--- a/llvm/tools/llvm-ir2vec/bindings/CMakeLists.txt
+++ b/llvm/tools/llvm-ir2vec/bindings/CMakeLists.txt
@@ -1,9 +1,14 @@
-find_package(Python3 COMPONENTS Interpreter Development.Module REQUIRED)
-find_package(pybind11 CONFIG REQUIRED)
+find_package(Python COMPONENTS Interpreter Development.Module REQUIRED)
+
+execute_process(
+ COMMAND "${Python_EXECUTABLE}" -m nanobind --cmake_dir
+ OUTPUT_STRIP_TRAILING_WHITESPACE OUTPUT_VARIABLE nanobind_ROOT
+)
+find_package(nanobind CONFIG REQUIRED)
set_target_properties(LLVMEmbUtils PROPERTIES POSITION_INDEPENDENT_CODE ON)
-pybind11_add_module(py_ir2vec MODULE ir2vec_bindings.cpp)
+nanobind_add_module(py_ir2vec MODULE ir2vec_bindings.cpp)
target_link_libraries(py_ir2vec PRIVATE LLVMEmbUtils)
-message(STATUS "Python bindings for llvm-ir2vec will be built")
+message(STATUS "Python bindings for llvm-ir2vec will be built with nanobind")
diff --git a/llvm/tools/llvm-ir2vec/bindings/ir2vec_bindings.cpp b/llvm/tools/llvm-ir2vec/bindings/ir2vec_bindings.cpp
index d0eb34389347b..bdd3b6962f9d6 100644
--- a/llvm/tools/llvm-ir2vec/bindings/ir2vec_bindings.cpp
+++ b/llvm/tools/llvm-ir2vec/bindings/ir2vec_bindings.cpp
@@ -6,8 +6,8 @@
//
//===----------------------------------------------------------------------===//
-#include <pybind11/pybind11.h>
+#include <nanobind/nanobind.h>
-namespace py = pybind11;
+namespace nb = nanobind;
-PYBIND11_MODULE(py_ir2vec, m) { m.doc() = "Python bindings for IR2Vec"; }
+NB_MODULE(py_ir2vec, m) {m.doc() = "Python bindings for IR2Vec"; }
More information about the llvm-commits
mailing list