[llvm] cb5b25c - [llvm-c] Added a C-API binding to query the LLVM version

Nikita Popov via llvm-commits llvm-commits at lists.llvm.org
Wed Dec 7 02:18:43 PST 2022


Author: Wenzel Jakob
Date: 2022-12-07T11:18:32+01:00
New Revision: cb5b25c587833317fd0bb93daf702f4c47048fb1

URL: https://github.com/llvm/llvm-project/commit/cb5b25c587833317fd0bb93daf702f4c47048fb1
DIFF: https://github.com/llvm/llvm-project/commit/cb5b25c587833317fd0bb93daf702f4c47048fb1.diff

LOG: [llvm-c] Added a C-API binding to query the LLVM version

The LLVM C bindings currently offer no way to query the version string
dynamically. This is a useful feature in situations where a program
isn't compiled against a specific version of LLVM but rather loads it
dynamically (e.g. using dlopen()).

In situations where the shared library filename doesn't reveal the
version (e.g. LLVM-C.dll) and to adapt to version-specific API
differences, it is then useful to be able to query the version string by
calling the proposed LLVMGetVersion function.

Differential Revision: https://reviews.llvm.org/D139381

Added: 
    llvm/unittests/IR/CoreBindings.cpp

Modified: 
    llvm/include/llvm-c/Core.h
    llvm/lib/IR/Core.cpp
    llvm/unittests/IR/CMakeLists.txt

Removed: 
    


################################################################################
diff  --git a/llvm/include/llvm-c/Core.h b/llvm/include/llvm-c/Core.h
index 124bea4a67e01..1a02a07c783f6 100644
--- a/llvm/include/llvm-c/Core.h
+++ b/llvm/include/llvm-c/Core.h
@@ -479,6 +479,16 @@ void LLVMInitializeCore(LLVMPassRegistryRef R);
     @see ManagedStatic */
 void LLVMShutdown(void);
 
+/*===-- Version query -----------------------------------------------------===*/
+
+/**
+ * Return the major, minor, and patch version of LLVM
+ *
+ * The version components are returned via the function's three output
+ * parameters or skipped if a NULL pointer was supplied.
+ */
+void LLVMGetVersion(unsigned *Major, unsigned *Minor, unsigned *Patch);
+
 /*===-- Error handling ----------------------------------------------------===*/
 
 char *LLVMCreateMessage(const char *Message);

diff  --git a/llvm/lib/IR/Core.cpp b/llvm/lib/IR/Core.cpp
index 1235c46f8516c..f376bfb9d0fda 100644
--- a/llvm/lib/IR/Core.cpp
+++ b/llvm/lib/IR/Core.cpp
@@ -61,6 +61,17 @@ void LLVMShutdown() {
   llvm_shutdown();
 }
 
+/*===-- Version query -----------------------------------------------------===*/
+
+void LLVMGetVersion(unsigned *Major, unsigned *Minor, unsigned *Patch) {
+    if (Major)
+        *Major = LLVM_VERSION_MAJOR;
+    if (Minor)
+        *Minor = LLVM_VERSION_MINOR;
+    if (Patch)
+        *Patch = LLVM_VERSION_PATCH;
+}
+
 /*===-- Error handling ----------------------------------------------------===*/
 
 char *LLVMCreateMessage(const char *Message) {

diff  --git a/llvm/unittests/IR/CMakeLists.txt b/llvm/unittests/IR/CMakeLists.txt
index 2ce8596446d62..12d865026d7fd 100644
--- a/llvm/unittests/IR/CMakeLists.txt
+++ b/llvm/unittests/IR/CMakeLists.txt
@@ -46,6 +46,7 @@ add_llvm_unittest(IRTests
   VectorTypesTest.cpp
   VerifierTest.cpp
   VPIntrinsicTest.cpp
+  CoreBindings.cpp
   )
 
 target_link_libraries(IRTests PRIVATE LLVMTestingSupport)

diff  --git a/llvm/unittests/IR/CoreBindings.cpp b/llvm/unittests/IR/CoreBindings.cpp
new file mode 100644
index 0000000000000..037926462c792
--- /dev/null
+++ b/llvm/unittests/IR/CoreBindings.cpp
@@ -0,0 +1,26 @@
+//===- llvm/unittest/IR/CoreBindings.cpp - Tests for C-API bindings -------===//
+//
+// 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 "llvm-c/Core.h"
+#include "llvm/Config/llvm-config.h"
+#include "gtest/gtest.h"
+
+namespace {
+
+TEST(CoreBindings, VersionTest) {
+  // Test ability to ignore output parameters
+  LLVMGetVersion(nullptr, nullptr, nullptr);
+
+  unsigned Major, Minor, Patch;
+  LLVMGetVersion(&Major, &Minor, &Patch);
+  EXPECT_EQ(Major, (unsigned)LLVM_VERSION_MAJOR);
+  EXPECT_EQ(Minor, (unsigned)LLVM_VERSION_MINOR);
+  EXPECT_EQ(Patch, (unsigned)LLVM_VERSION_PATCH);
+}
+
+} // end anonymous namespace


        


More information about the llvm-commits mailing list