[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
This commit is contained in:
Wenzel Jakob
2022-12-07 11:12:53 +01:00
committed by Nikita Popov
parent 93d9c2e563
commit cb5b25c587
4 changed files with 48 additions and 0 deletions

View File

@@ -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);

View File

@@ -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) {

View File

@@ -46,6 +46,7 @@ add_llvm_unittest(IRTests
VectorTypesTest.cpp
VerifierTest.cpp
VPIntrinsicTest.cpp
CoreBindings.cpp
)
target_link_libraries(IRTests PRIVATE LLVMTestingSupport)

View File

@@ -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