[clang] [llvm] [Clang] Reintroduce obsolete libclang symbols to avoid an ABI break (PR #149079)

via llvm-commits llvm-commits at lists.llvm.org
Wed Jul 16 04:48:11 PDT 2025


https://github.com/Sirraide created https://github.com/llvm/llvm-project/pull/149079

For more context, see https://github.com/llvm/llvm-project/pull/119269#issuecomment-3075444493, but briefly, when removing ARCMigrate, I also removed some symbols in libclang, which constitutes an ABI break that we don’t want, so this pr reintroduces the removed symbols; the declarations are marked as deprecated for future removal, and the implementations print an error and do nothing, which is what we used to do when ARCMigrate was disabled.

>From c9b28116f0caed28c58b2cf5e3df14170998f8c7 Mon Sep 17 00:00:00 2001
From: Sirraide <aeternalmail at gmail.com>
Date: Tue, 15 Jul 2025 23:04:29 +0200
Subject: [PATCH 1/3] Reintroduce obsolete symbols

---
 clang/tools/libclang/CMakeLists.txt           |  1 +
 clang/tools/libclang/Obsolete.cpp             | 46 +++++++++++++++++++
 .../secondary/clang/tools/libclang/BUILD.gn   |  1 +
 3 files changed, 48 insertions(+)
 create mode 100644 clang/tools/libclang/Obsolete.cpp

diff --git a/clang/tools/libclang/CMakeLists.txt b/clang/tools/libclang/CMakeLists.txt
index b6662b66206b2..2b1e266f07392 100644
--- a/clang/tools/libclang/CMakeLists.txt
+++ b/clang/tools/libclang/CMakeLists.txt
@@ -42,6 +42,7 @@ set(SOURCES
   Indexing.cpp
   FatalErrorHandler.cpp
   Rewrite.cpp
+  Obsolete.cpp
 
   ADDITIONAL_HEADERS
   CIndexDiagnostic.h
diff --git a/clang/tools/libclang/Obsolete.cpp b/clang/tools/libclang/Obsolete.cpp
new file mode 100644
index 0000000000000..0790e5b5e9ac9
--- /dev/null
+++ b/clang/tools/libclang/Obsolete.cpp
@@ -0,0 +1,46 @@
+//===- Obsolete.cpp - Obsolete libclang functions and types -------------===//
+//
+// 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
+//
+//===--------------------------------------------------------------------===//
+//
+// This file contains libclang symbols whose underlying functionality has been
+// removed from Clang, but which need to be kept around so as to retain ABI
+// compatibility.
+//
+//===--------------------------------------------------------------------===//
+
+#include "clang-c/CXString.h"
+#include "clang-c/Platform.h"
+#include "llvm/Support/raw_ostream.h"
+
+// The functions below used to be part of the C API for ARCMigrate, which has
+// since been removed from Clang; they already used to print an error if Clang
+// was compiled without arcmt support, so we continue doing so.
+typedef void *CXRemapping;
+CINDEX_LINKAGE CXRemapping clang_getRemappings(const char *) {
+  llvm::errs() << "error: ARCMigrate has been removed from Clang";
+  return nullptr;
+}
+
+CINDEX_LINKAGE
+CXRemapping clang_getRemappingsFromFileList(const char **, unsigned) {
+  llvm::errs() << "error: ARCMigrate has been removed from Clang";
+  return nullptr;
+}
+
+CINDEX_LINKAGE unsigned clang_remap_getNumFiles(CXRemapping) {
+  llvm::errs() << "error: ARCMigrate has been removed from Clang";
+  return 0;
+}
+
+CINDEX_LINKAGE void clang_remap_getFilenames(CXRemapping, unsigned, CXString *,
+                                             CXString *) {
+  llvm::errs() << "error: ARCMigrate has been removed from Clang";
+}
+
+CINDEX_LINKAGE void clang_remap_dispose(CXRemapping) {
+  llvm::errs() << "error: ARCMigrate has been removed from Clang";
+}
diff --git a/llvm/utils/gn/secondary/clang/tools/libclang/BUILD.gn b/llvm/utils/gn/secondary/clang/tools/libclang/BUILD.gn
index 8f7beea152ab7..30b8bb61184bd 100644
--- a/llvm/utils/gn/secondary/clang/tools/libclang/BUILD.gn
+++ b/llvm/utils/gn/secondary/clang/tools/libclang/BUILD.gn
@@ -87,6 +87,7 @@ shared_library("libclang") {
     "Index_Internal.h",
     "Indexing.cpp",
     "Rewrite.cpp",
+    "Obsolete.cpp",
   ]
   if (host_os == "mac") {
     ldflags = [

>From c93e0cf4b8d04002bb091d464286f43bac9e3bcb Mon Sep 17 00:00:00 2001
From: Sirraide <aeternalmail at gmail.com>
Date: Tue, 15 Jul 2025 23:08:18 +0200
Subject: [PATCH 2/3] forgot to add extern C ...

---
 clang/tools/libclang/Obsolete.cpp | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/clang/tools/libclang/Obsolete.cpp b/clang/tools/libclang/Obsolete.cpp
index 0790e5b5e9ac9..32102afdd8858 100644
--- a/clang/tools/libclang/Obsolete.cpp
+++ b/clang/tools/libclang/Obsolete.cpp
@@ -16,6 +16,8 @@
 #include "clang-c/Platform.h"
 #include "llvm/Support/raw_ostream.h"
 
+extern "C" {
+
 // The functions below used to be part of the C API for ARCMigrate, which has
 // since been removed from Clang; they already used to print an error if Clang
 // was compiled without arcmt support, so we continue doing so.
@@ -44,3 +46,5 @@ CINDEX_LINKAGE void clang_remap_getFilenames(CXRemapping, unsigned, CXString *,
 CINDEX_LINKAGE void clang_remap_dispose(CXRemapping) {
   llvm::errs() << "error: ARCMigrate has been removed from Clang";
 }
+
+} // extern "C"

>From 35a03baf6819836f82df3c4434db85db76de5a51 Mon Sep 17 00:00:00 2001
From: Sirraide <aeternalmail at gmail.com>
Date: Wed, 16 Jul 2025 13:44:05 +0200
Subject: [PATCH 3/3] Reintroduce declarations and mark them as deprecated

---
 clang/include/clang-c/Index.h     | 15 +++++++++++++++
 clang/tools/libclang/Obsolete.cpp | 12 +++++-------
 2 files changed, 20 insertions(+), 7 deletions(-)

diff --git a/clang/include/clang-c/Index.h b/clang/include/clang-c/Index.h
index c35311c886413..b929585205aee 100644
--- a/clang/include/clang-c/Index.h
+++ b/clang/include/clang-c/Index.h
@@ -6953,6 +6953,21 @@ clang_getCursorUnaryOperatorKind(CXCursor cursor);
  * @}
  */
 
+CINDEX_DEPRECATED
+typedef void *CXRemapping;
+
+CINDEX_DEPRECATED CINDEX_LINKAGE CXRemapping clang_getRemappings(const char *);
+
+CINDEX_DEPRECATED CINDEX_LINKAGE CXRemapping
+clang_getRemappingsFromFileList(const char **, unsigned);
+
+CINDEX_DEPRECATED CINDEX_LINKAGE unsigned clang_remap_getNumFiles(CXRemapping);
+
+CINDEX_DEPRECATED CINDEX_LINKAGE void
+clang_remap_getFilenames(CXRemapping, unsigned, CXString *, CXString *);
+
+CINDEX_DEPRECATED CINDEX_LINKAGE void clang_remap_dispose(CXRemapping);
+
 LLVM_CLANG_C_EXTERN_C_END
 
 #endif
diff --git a/clang/tools/libclang/Obsolete.cpp b/clang/tools/libclang/Obsolete.cpp
index 32102afdd8858..3596f76e1be6f 100644
--- a/clang/tools/libclang/Obsolete.cpp
+++ b/clang/tools/libclang/Obsolete.cpp
@@ -13,6 +13,7 @@
 //===--------------------------------------------------------------------===//
 
 #include "clang-c/CXString.h"
+#include "clang-c/Index.h"
 #include "clang-c/Platform.h"
 #include "llvm/Support/raw_ostream.h"
 
@@ -21,29 +22,26 @@ extern "C" {
 // The functions below used to be part of the C API for ARCMigrate, which has
 // since been removed from Clang; they already used to print an error if Clang
 // was compiled without arcmt support, so we continue doing so.
-typedef void *CXRemapping;
-CINDEX_LINKAGE CXRemapping clang_getRemappings(const char *) {
+CXRemapping clang_getRemappings(const char *) {
   llvm::errs() << "error: ARCMigrate has been removed from Clang";
   return nullptr;
 }
 
-CINDEX_LINKAGE
 CXRemapping clang_getRemappingsFromFileList(const char **, unsigned) {
   llvm::errs() << "error: ARCMigrate has been removed from Clang";
   return nullptr;
 }
 
-CINDEX_LINKAGE unsigned clang_remap_getNumFiles(CXRemapping) {
+unsigned clang_remap_getNumFiles(CXRemapping) {
   llvm::errs() << "error: ARCMigrate has been removed from Clang";
   return 0;
 }
 
-CINDEX_LINKAGE void clang_remap_getFilenames(CXRemapping, unsigned, CXString *,
-                                             CXString *) {
+void clang_remap_getFilenames(CXRemapping, unsigned, CXString *, CXString *) {
   llvm::errs() << "error: ARCMigrate has been removed from Clang";
 }
 
-CINDEX_LINKAGE void clang_remap_dispose(CXRemapping) {
+void clang_remap_dispose(CXRemapping) {
   llvm::errs() << "error: ARCMigrate has been removed from Clang";
 }
 



More information about the llvm-commits mailing list