[llvm] [llvm] revisions to `LLVM_ABI` export macro definitions (PR #144598)
Andrew Rogers via llvm-commits
llvm-commits at lists.llvm.org
Tue Jun 17 15:31:26 PDT 2025
https://github.com/andrurogerz updated https://github.com/llvm/llvm-project/pull/144598
>From 2b8ec5dee368ec694699cbb710955a527e0baee4 Mon Sep 17 00:00:00 2001
From: Andrew Rogers <andrurogerz at gmail.com>
Date: Mon, 16 Jun 2025 15:20:14 -0700
Subject: [PATCH 1/4] [llvm] simplify export annotation control
---
llvm/CMakeLists.txt | 7 +++++++
llvm/include/llvm/Config/llvm-config.h.cmake | 3 +++
llvm/include/llvm/Support/Compiler.h | 18 ++++--------------
3 files changed, 14 insertions(+), 14 deletions(-)
diff --git a/llvm/CMakeLists.txt b/llvm/CMakeLists.txt
index 0849bec26d56a..35e868886a4bd 100644
--- a/llvm/CMakeLists.txt
+++ b/llvm/CMakeLists.txt
@@ -935,6 +935,13 @@ if (LLVM_LINK_LLVM_DYLIB AND BUILD_SHARED_LIBS)
message(FATAL_ERROR "Cannot enable BUILD_SHARED_LIBS with LLVM_LINK_LLVM_DYLIB. We recommend disabling BUILD_SHARED_LIBS.")
endif()
+set(LLVM_ENABLE_LLVM_EXPORT_ANNOTATIONS OFF)
+if (LLVM_BUILD_LLVM_DYLIB OR LLVM_BUILD_SHARED_LIBS OR LLVM_ENABLE_PLUGINS)
+ # Export annotations for LLVM must be enabled if building as a shared lib or
+ # enabling plugins.
+ set(LLVM_ENABLE_LLVM_EXPORT_ANNOTATIONS ON)
+endif()
+
option(LLVM_OPTIMIZED_TABLEGEN "Force TableGen to be built with optimization" OFF)
if(CMAKE_CROSSCOMPILING OR (LLVM_OPTIMIZED_TABLEGEN AND (LLVM_ENABLE_ASSERTIONS OR CMAKE_CONFIGURATION_TYPES)))
set(LLVM_USE_HOST_TOOLS ON)
diff --git a/llvm/include/llvm/Config/llvm-config.h.cmake b/llvm/include/llvm/Config/llvm-config.h.cmake
index a0ad517a6ecf4..0d8db0b6b52f1 100644
--- a/llvm/include/llvm/Config/llvm-config.h.cmake
+++ b/llvm/include/llvm/Config/llvm-config.h.cmake
@@ -110,6 +110,9 @@
/* Define if building LLVM with BUILD_SHARED_LIBS */
#cmakedefine LLVM_BUILD_SHARED_LIBS
+/* Define if exporting LLVM public interface for shared library */
+#cmakedefine LLVM_ENABLE_LLVM_EXPORT_ANNOTATIONS
+
/* Define if building LLVM with LLVM_FORCE_USE_OLD_TOOLCHAIN_LIBS */
#cmakedefine LLVM_FORCE_USE_OLD_TOOLCHAIN ${LLVM_FORCE_USE_OLD_TOOLCHAIN}
diff --git a/llvm/include/llvm/Support/Compiler.h b/llvm/include/llvm/Support/Compiler.h
index 0de789ec68c49..b11473192a508 100644
--- a/llvm/include/llvm/Support/Compiler.h
+++ b/llvm/include/llvm/Support/Compiler.h
@@ -184,19 +184,8 @@
// Marker to add to classes or functions in public headers that should not have
// export macros added to them by the clang tool
#define LLVM_ABI_NOT_EXPORTED
-#if defined(LLVM_BUILD_LLVM_DYLIB) || defined(LLVM_BUILD_SHARED_LIBS) || \
- defined(LLVM_ENABLE_PLUGINS)
-// Some libraries like those for tablegen are linked in to tools that used
-// in the build so can't depend on the llvm shared library. If export macros
-// were left enabled when building these we would get duplicate or
-// missing symbol linker errors on windows.
-#if defined(LLVM_BUILD_STATIC)
-#define LLVM_ABI
-#define LLVM_ABI_FRIEND
-#define LLVM_TEMPLATE_ABI
-#define LLVM_EXPORT_TEMPLATE
-#define LLVM_ABI_EXPORT
-#elif defined(_WIN32) && !defined(__MINGW32__)
+#if defined(LLVM_ENABLE_LLVM_EXPORT_ANNOTATIONS) && !defined(LLVM_BUILD_STATIC)
+#if defined(_WIN32) && !defined(__MINGW32__)
#if defined(LLVM_EXPORTS)
#define LLVM_ABI __declspec(dllexport)
#define LLVM_TEMPLATE_ABI
@@ -222,7 +211,8 @@
#define LLVM_EXPORT_TEMPLATE
#define LLVM_ABI_EXPORT LLVM_ATTRIBUTE_VISIBILITY_DEFAULT
#endif
-#else
+#endif
+#if !defined(LLVM_ABI)
#define LLVM_ABI
#define LLVM_ABI_FRIEND
#define LLVM_TEMPLATE_ABI
>From d385dc20b2a9de15053662144c043cc704548a4c Mon Sep 17 00:00:00 2001
From: Andrew Rogers <andrurogerz at gmail.com>
Date: Mon, 16 Jun 2025 11:06:53 -0700
Subject: [PATCH 2/4] [llvm] remove LLVM_ABI_FRIEND in favor of LLVM_ABI
---
llvm/include/llvm/ADT/APFloat.h | 21 +++++++++----------
llvm/include/llvm/ADT/SlowDynamicAPInt.h | 17 +++++++--------
llvm/include/llvm/Bitcode/BitcodeReader.h | 2 +-
llvm/include/llvm/CodeGen/MachineOperand.h | 2 +-
llvm/include/llvm/CodeGen/PseudoSourceValue.h | 4 ++--
llvm/include/llvm/ExecutionEngine/Orc/LLJIT.h | 3 +--
.../ExecutionEngine/Orc/SymbolStringPool.h | 8 +++----
.../llvm/ExecutionEngine/RuntimeDyld.h | 2 +-
llvm/include/llvm/IR/Function.h | 5 ++---
.../llvm/ProfileData/SampleProfWriter.h | 4 ++--
llvm/include/llvm/Support/Compiler.h | 9 --------
llvm/include/llvm/Support/Error.h | 2 +-
llvm/include/llvm/Support/FileSystem.h | 2 +-
llvm/include/llvm/Support/JSON.h | 4 ++--
llvm/include/llvm/Support/Path.h | 8 +++----
llvm/include/llvm/Support/PrettyStackTrace.h | 2 +-
llvm/include/llvm/XRay/InstrumentationMap.h | 2 +-
llvm/include/llvm/XRay/Trace.h | 2 +-
18 files changed, 43 insertions(+), 56 deletions(-)
diff --git a/llvm/include/llvm/ADT/APFloat.h b/llvm/include/llvm/ADT/APFloat.h
index 13df838da3dad..300f83dcf9ef6 100644
--- a/llvm/include/llvm/ADT/APFloat.h
+++ b/llvm/include/llvm/ADT/APFloat.h
@@ -572,7 +572,7 @@ class IEEEFloat final {
/// emphasizes producing different codes for different inputs in order to
/// be used in canonicalization and memoization. As such, equality is
/// bitwiseIsEqual, and 0 != -0.
- LLVM_ABI_FRIEND friend hash_code hash_value(const IEEEFloat &Arg);
+ LLVM_ABI friend hash_code hash_value(const IEEEFloat &Arg);
/// Converts this value into a decimal string.
///
@@ -629,13 +629,12 @@ class IEEEFloat final {
/// 0 -> \c IEK_Zero
/// Inf -> \c IEK_Inf
///
- LLVM_ABI_FRIEND friend int ilogb(const IEEEFloat &Arg);
+ LLVM_ABI friend int ilogb(const IEEEFloat &Arg);
/// Returns: X * 2^Exp for integral exponents.
- LLVM_ABI_FRIEND friend IEEEFloat scalbn(IEEEFloat X, int Exp, roundingMode);
+ LLVM_ABI friend IEEEFloat scalbn(IEEEFloat X, int Exp, roundingMode);
- LLVM_ABI_FRIEND friend IEEEFloat frexp(const IEEEFloat &X, int &Exp,
- roundingMode);
+ LLVM_ABI friend IEEEFloat frexp(const IEEEFloat &X, int &Exp, roundingMode);
/// \name Special value setters.
/// @{
@@ -906,11 +905,11 @@ class DoubleAPFloat final {
LLVM_ABI LLVM_READONLY int getExactLog2() const;
LLVM_ABI LLVM_READONLY int getExactLog2Abs() const;
- LLVM_ABI_FRIEND friend DoubleAPFloat scalbn(const DoubleAPFloat &X, int Exp,
- roundingMode);
- LLVM_ABI_FRIEND friend DoubleAPFloat frexp(const DoubleAPFloat &X, int &Exp,
- roundingMode);
- LLVM_ABI_FRIEND friend hash_code hash_value(const DoubleAPFloat &Arg);
+ LLVM_ABI friend DoubleAPFloat scalbn(const DoubleAPFloat &X, int Exp,
+ roundingMode);
+ LLVM_ABI friend DoubleAPFloat frexp(const DoubleAPFloat &X, int &Exp,
+ roundingMode);
+ LLVM_ABI friend hash_code hash_value(const DoubleAPFloat &Arg);
};
LLVM_ABI hash_code hash_value(const DoubleAPFloat &Arg);
@@ -1518,7 +1517,7 @@ class APFloat : public APFloatBase {
APFLOAT_DISPATCH_ON_SEMANTICS(getExactLog2());
}
- LLVM_ABI_FRIEND friend hash_code hash_value(const APFloat &Arg);
+ LLVM_ABI friend hash_code hash_value(const APFloat &Arg);
friend int ilogb(const APFloat &Arg) { return ilogb(Arg.getIEEE()); }
friend APFloat scalbn(APFloat X, int Exp, roundingMode RM);
friend APFloat frexp(const APFloat &X, int &Exp, roundingMode RM);
diff --git a/llvm/include/llvm/ADT/SlowDynamicAPInt.h b/llvm/include/llvm/ADT/SlowDynamicAPInt.h
index 702e0398e40fc..a9db8a3ae00c0 100644
--- a/llvm/include/llvm/ADT/SlowDynamicAPInt.h
+++ b/llvm/include/llvm/ADT/SlowDynamicAPInt.h
@@ -62,18 +62,17 @@ class SlowDynamicAPInt {
LLVM_ABI SlowDynamicAPInt &operator++();
LLVM_ABI SlowDynamicAPInt &operator--();
- LLVM_ABI_FRIEND friend SlowDynamicAPInt abs(const SlowDynamicAPInt &X);
- LLVM_ABI_FRIEND friend SlowDynamicAPInt ceilDiv(const SlowDynamicAPInt &LHS,
- const SlowDynamicAPInt &RHS);
- LLVM_ABI_FRIEND friend SlowDynamicAPInt floorDiv(const SlowDynamicAPInt &LHS,
- const SlowDynamicAPInt &RHS);
+ LLVM_ABI friend SlowDynamicAPInt abs(const SlowDynamicAPInt &X);
+ LLVM_ABI friend SlowDynamicAPInt ceilDiv(const SlowDynamicAPInt &LHS,
+ const SlowDynamicAPInt &RHS);
+ LLVM_ABI friend SlowDynamicAPInt floorDiv(const SlowDynamicAPInt &LHS,
+ const SlowDynamicAPInt &RHS);
/// The operands must be non-negative for gcd.
- LLVM_ABI_FRIEND friend SlowDynamicAPInt gcd(const SlowDynamicAPInt &A,
- const SlowDynamicAPInt &B);
+ LLVM_ABI friend SlowDynamicAPInt gcd(const SlowDynamicAPInt &A,
+ const SlowDynamicAPInt &B);
/// Overload to compute a hash_code for a SlowDynamicAPInt value.
- LLVM_ABI_FRIEND friend hash_code
- hash_value(const SlowDynamicAPInt &X); // NOLINT
+ LLVM_ABI friend hash_code hash_value(const SlowDynamicAPInt &X); // NOLINT
// Make DynamicAPInt a friend so it can access Val directly.
friend DynamicAPInt;
diff --git a/llvm/include/llvm/Bitcode/BitcodeReader.h b/llvm/include/llvm/Bitcode/BitcodeReader.h
index e7451a3f1bac9..4f839d4cd1575 100644
--- a/llvm/include/llvm/Bitcode/BitcodeReader.h
+++ b/llvm/include/llvm/Bitcode/BitcodeReader.h
@@ -120,7 +120,7 @@ struct ParserCallbacks {
IdentificationBit(IdentificationBit), ModuleBit(ModuleBit) {}
// Calls the ctor.
- LLVM_ABI_FRIEND friend Expected<BitcodeFileContents>
+ LLVM_ABI friend Expected<BitcodeFileContents>
getBitcodeFileContents(MemoryBufferRef Buffer);
Expected<std::unique_ptr<Module>>
diff --git a/llvm/include/llvm/CodeGen/MachineOperand.h b/llvm/include/llvm/CodeGen/MachineOperand.h
index 161a1cdbff98e..646588a2a92a5 100644
--- a/llvm/include/llvm/CodeGen/MachineOperand.h
+++ b/llvm/include/llvm/CodeGen/MachineOperand.h
@@ -764,7 +764,7 @@ class MachineOperand {
/// isIdenticalTo uses for comparison. It is thus suited for use in hash
/// tables which use that function for equality comparisons only. This must
/// stay exactly in sync with isIdenticalTo above.
- LLVM_ABI_FRIEND friend hash_code hash_value(const MachineOperand &MO);
+ LLVM_ABI friend hash_code hash_value(const MachineOperand &MO);
/// ChangeToImmediate - Replace this operand with a new immediate operand of
/// the specified value. If an operand is known to be an immediate already,
diff --git a/llvm/include/llvm/CodeGen/PseudoSourceValue.h b/llvm/include/llvm/CodeGen/PseudoSourceValue.h
index 01402c31a1e30..aec19005278a4 100644
--- a/llvm/include/llvm/CodeGen/PseudoSourceValue.h
+++ b/llvm/include/llvm/CodeGen/PseudoSourceValue.h
@@ -46,8 +46,8 @@ class LLVM_ABI PseudoSourceValue {
private:
unsigned Kind;
unsigned AddressSpace;
- LLVM_ABI_FRIEND friend raw_ostream &
- llvm::operator<<(raw_ostream &OS, const PseudoSourceValue *PSV);
+ LLVM_ABI friend raw_ostream &llvm::operator<<(raw_ostream &OS,
+ const PseudoSourceValue *PSV);
friend class MachineMemOperand; // For printCustom().
friend class MIRFormatter; // For printCustom().
diff --git a/llvm/include/llvm/ExecutionEngine/Orc/LLJIT.h b/llvm/include/llvm/ExecutionEngine/Orc/LLJIT.h
index cb8fdd650a2aa..9c0d6e86d279f 100644
--- a/llvm/include/llvm/ExecutionEngine/Orc/LLJIT.h
+++ b/llvm/include/llvm/ExecutionEngine/Orc/LLJIT.h
@@ -42,8 +42,7 @@ class ExecutorProcessControl;
class LLVM_ABI LLJIT {
template <typename, typename, typename> friend class LLJITBuilderSetters;
- LLVM_ABI_FRIEND friend Expected<JITDylibSP>
- setUpGenericLLVMIRPlatform(LLJIT &J);
+ LLVM_ABI friend Expected<JITDylibSP> setUpGenericLLVMIRPlatform(LLJIT &J);
public:
/// Initializer support for LLJIT.
diff --git a/llvm/include/llvm/ExecutionEngine/Orc/SymbolStringPool.h b/llvm/include/llvm/ExecutionEngine/Orc/SymbolStringPool.h
index d92c029ff84dc..ed6ea961bccfe 100644
--- a/llvm/include/llvm/ExecutionEngine/Orc/SymbolStringPool.h
+++ b/llvm/include/llvm/ExecutionEngine/Orc/SymbolStringPool.h
@@ -36,8 +36,8 @@ class SymbolStringPool {
friend class SymbolStringPoolEntryUnsafe;
// Implemented in DebugUtils.h.
- LLVM_ABI_FRIEND friend raw_ostream &operator<<(raw_ostream &OS,
- const SymbolStringPool &SSP);
+ LLVM_ABI friend raw_ostream &operator<<(raw_ostream &OS,
+ const SymbolStringPool &SSP);
public:
/// Destroy a SymbolStringPool.
@@ -94,8 +94,8 @@ class SymbolStringPtrBase {
return LHS.S < RHS.S;
}
- LLVM_ABI_FRIEND friend raw_ostream &
- operator<<(raw_ostream &OS, const SymbolStringPtrBase &Sym);
+ LLVM_ABI friend raw_ostream &operator<<(raw_ostream &OS,
+ const SymbolStringPtrBase &Sym);
#ifndef NDEBUG
// Returns true if the pool entry's ref count is above zero (or if the entry
diff --git a/llvm/include/llvm/ExecutionEngine/RuntimeDyld.h b/llvm/include/llvm/ExecutionEngine/RuntimeDyld.h
index c1fab1199f512..57387f029b6cf 100644
--- a/llvm/include/llvm/ExecutionEngine/RuntimeDyld.h
+++ b/llvm/include/llvm/ExecutionEngine/RuntimeDyld.h
@@ -287,7 +287,7 @@ class RuntimeDyld {
LLVM_ABI void finalizeWithMemoryManagerLocking();
private:
- LLVM_ABI_FRIEND friend void jitLinkForORC(
+ LLVM_ABI friend void jitLinkForORC(
object::OwningBinary<object::ObjectFile> O,
RuntimeDyld::MemoryManager &MemMgr, JITSymbolResolver &Resolver,
bool ProcessAllSections,
diff --git a/llvm/include/llvm/IR/Function.h b/llvm/include/llvm/IR/Function.h
index c361be3e752a9..d3497716ca844 100644
--- a/llvm/include/llvm/IR/Function.h
+++ b/llvm/include/llvm/IR/Function.h
@@ -783,9 +783,8 @@ class LLVM_ABI Function : public GlobalObject, public ilist_node<Function> {
private:
// These need access to the underlying BB list.
- LLVM_ABI_FRIEND friend void BasicBlock::removeFromParent();
- LLVM_ABI_FRIEND friend iplist<BasicBlock>::iterator
- BasicBlock::eraseFromParent();
+ LLVM_ABI friend void BasicBlock::removeFromParent();
+ LLVM_ABI friend iplist<BasicBlock>::iterator BasicBlock::eraseFromParent();
template <class BB_t, class BB_i_t, class BI_t, class II_t>
friend class InstIterator;
friend class llvm::SymbolTableListTraits<llvm::BasicBlock>;
diff --git a/llvm/include/llvm/ProfileData/SampleProfWriter.h b/llvm/include/llvm/ProfileData/SampleProfWriter.h
index 146d051f770a3..e84b2095efd7b 100644
--- a/llvm/include/llvm/ProfileData/SampleProfWriter.h
+++ b/llvm/include/llvm/ProfileData/SampleProfWriter.h
@@ -193,7 +193,7 @@ class LLVM_ABI SampleProfileWriterText : public SampleProfileWriter {
/// cannot be skipped.
bool MarkFlatProfiles = false;
- LLVM_ABI_FRIEND friend ErrorOr<std::unique_ptr<SampleProfileWriter>>
+ LLVM_ABI friend ErrorOr<std::unique_ptr<SampleProfileWriter>>
SampleProfileWriter::create(std::unique_ptr<raw_ostream> &OS,
SampleProfileFormat Format);
};
@@ -225,7 +225,7 @@ class LLVM_ABI SampleProfileWriterBinary : public SampleProfileWriter {
void addNames(const FunctionSamples &S);
private:
- LLVM_ABI_FRIEND friend ErrorOr<std::unique_ptr<SampleProfileWriter>>
+ LLVM_ABI friend ErrorOr<std::unique_ptr<SampleProfileWriter>>
SampleProfileWriter::create(std::unique_ptr<raw_ostream> &OS,
SampleProfileFormat Format);
};
diff --git a/llvm/include/llvm/Support/Compiler.h b/llvm/include/llvm/Support/Compiler.h
index b11473192a508..c921558d909aa 100644
--- a/llvm/include/llvm/Support/Compiler.h
+++ b/llvm/include/llvm/Support/Compiler.h
@@ -171,11 +171,6 @@
/// for both functions and classes. On windows its turned in to dllimport for
/// library consumers, for other platforms its a default visibility attribute.
///
-/// LLVM_ABI_FRIEND is for annotating friend function declarations when the
-/// target function's original declaration is annotated with LLVM_ABI. This
-/// macro matches the LLVM_ABI macro on Windows, on other platforms it does
-/// nothing.
-///
/// LLVM_C_ABI is used to annotated functions and data that need to be exported
/// for the libllvm-c API. This used both for the llvm-c headers and for the
/// functions declared in the different Target's c++ source files that don't
@@ -195,18 +190,15 @@
#define LLVM_TEMPLATE_ABI __declspec(dllimport)
#define LLVM_EXPORT_TEMPLATE
#endif
-#define LLVM_ABI_FRIEND LLVM_ABI
#define LLVM_ABI_EXPORT __declspec(dllexport)
#elif defined(__ELF__) || defined(__MINGW32__) || defined(_AIX) || \
defined(__MVS__) || defined(__CYGWIN__)
#define LLVM_ABI LLVM_ATTRIBUTE_VISIBILITY_DEFAULT
-#define LLVM_ABI_FRIEND
#define LLVM_TEMPLATE_ABI LLVM_ATTRIBUTE_VISIBILITY_DEFAULT
#define LLVM_EXPORT_TEMPLATE
#define LLVM_ABI_EXPORT LLVM_ATTRIBUTE_VISIBILITY_DEFAULT
#elif defined(__MACH__) || defined(__WASM__) || defined(__EMSCRIPTEN__)
#define LLVM_ABI LLVM_ATTRIBUTE_VISIBILITY_DEFAULT
-#define LLVM_ABI_FRIEND
#define LLVM_TEMPLATE_ABI
#define LLVM_EXPORT_TEMPLATE
#define LLVM_ABI_EXPORT LLVM_ATTRIBUTE_VISIBILITY_DEFAULT
@@ -214,7 +206,6 @@
#endif
#if !defined(LLVM_ABI)
#define LLVM_ABI
-#define LLVM_ABI_FRIEND
#define LLVM_TEMPLATE_ABI
#define LLVM_EXPORT_TEMPLATE
#define LLVM_ABI_EXPORT
diff --git a/llvm/include/llvm/Support/Error.h b/llvm/include/llvm/Support/Error.h
index 9bb952ceb0dc2..ed83e6e3a40ed 100644
--- a/llvm/include/llvm/Support/Error.h
+++ b/llvm/include/llvm/Support/Error.h
@@ -1191,7 +1191,7 @@ class ExpectedAsOutParameter {
/// (or Expected) and you want to call code that still returns
/// std::error_codes.
class LLVM_ABI ECError : public ErrorInfo<ECError> {
- LLVM_ABI_FRIEND friend Error errorCodeToError(std::error_code);
+ LLVM_ABI friend Error errorCodeToError(std::error_code);
void anchor() override;
diff --git a/llvm/include/llvm/Support/FileSystem.h b/llvm/include/llvm/Support/FileSystem.h
index ae4a212b553c8..31fedc37bf776 100644
--- a/llvm/include/llvm/Support/FileSystem.h
+++ b/llvm/include/llvm/Support/FileSystem.h
@@ -220,7 +220,7 @@ class basic_file_status {
/// Represents the result of a call to sys::fs::status().
class file_status : public basic_file_status {
- LLVM_ABI_FRIEND friend bool equivalent(file_status A, file_status B);
+ LLVM_ABI friend bool equivalent(file_status A, file_status B);
#if defined(LLVM_ON_UNIX)
dev_t fs_st_dev = 0;
diff --git a/llvm/include/llvm/Support/JSON.h b/llvm/include/llvm/Support/JSON.h
index 962d79de8dd1d..74858ec559932 100644
--- a/llvm/include/llvm/Support/JSON.h
+++ b/llvm/include/llvm/Support/JSON.h
@@ -531,7 +531,7 @@ class Value {
llvm::StringRef, std::string, json::Array,
json::Object>
Union;
- LLVM_ABI_FRIEND friend bool operator==(const Value &, const Value &);
+ LLVM_ABI friend bool operator==(const Value &, const Value &);
};
LLVM_ABI bool operator==(const Value &, const Value &);
@@ -713,7 +713,7 @@ class Path::Root {
llvm::StringLiteral ErrorMessage;
std::vector<Path::Segment> ErrorPath; // Only valid in error state. Reversed.
- LLVM_ABI_FRIEND friend void Path::report(llvm::StringLiteral Message);
+ LLVM_ABI friend void Path::report(llvm::StringLiteral Message);
public:
Root(llvm::StringRef Name = "") : Name(Name), ErrorMessage("") {}
diff --git a/llvm/include/llvm/Support/Path.h b/llvm/include/llvm/Support/Path.h
index 32144a0d53488..0d8881359b806 100644
--- a/llvm/include/llvm/Support/Path.h
+++ b/llvm/include/llvm/Support/Path.h
@@ -80,8 +80,8 @@ class const_iterator
Style S = Style::native; ///< The path style to use.
// An end iterator has Position = Path.size() + 1.
- LLVM_ABI_FRIEND friend const_iterator begin(StringRef path, Style style);
- LLVM_ABI_FRIEND friend const_iterator end(StringRef path);
+ LLVM_ABI friend const_iterator begin(StringRef path, Style style);
+ LLVM_ABI friend const_iterator end(StringRef path);
public:
reference operator*() const { return Component; }
@@ -105,8 +105,8 @@ class reverse_iterator
size_t Position = 0; ///< The iterators current position within Path.
Style S = Style::native; ///< The path style to use.
- LLVM_ABI_FRIEND friend reverse_iterator rbegin(StringRef path, Style style);
- LLVM_ABI_FRIEND friend reverse_iterator rend(StringRef path);
+ LLVM_ABI friend reverse_iterator rbegin(StringRef path, Style style);
+ LLVM_ABI friend reverse_iterator rend(StringRef path);
public:
reference operator*() const { return Component; }
diff --git a/llvm/include/llvm/Support/PrettyStackTrace.h b/llvm/include/llvm/Support/PrettyStackTrace.h
index 33d95f1c5ec74..cf695089b44e7 100644
--- a/llvm/include/llvm/Support/PrettyStackTrace.h
+++ b/llvm/include/llvm/Support/PrettyStackTrace.h
@@ -51,7 +51,7 @@ namespace llvm {
/// constructed and destructed, they will add their symbolic frames to a
/// virtual stack trace. This gets dumped out if the program crashes.
class LLVM_ABI PrettyStackTraceEntry {
- LLVM_ABI_FRIEND friend PrettyStackTraceEntry *
+ LLVM_ABI friend PrettyStackTraceEntry *
ReverseStackTrace(PrettyStackTraceEntry *);
PrettyStackTraceEntry *NextEntry;
diff --git a/llvm/include/llvm/XRay/InstrumentationMap.h b/llvm/include/llvm/XRay/InstrumentationMap.h
index 54737e226df89..b5371478680ef 100644
--- a/llvm/include/llvm/XRay/InstrumentationMap.h
+++ b/llvm/include/llvm/XRay/InstrumentationMap.h
@@ -85,7 +85,7 @@ class InstrumentationMap {
FunctionAddressMap FunctionAddresses;
FunctionAddressReverseMap FunctionIds;
- LLVM_ABI_FRIEND friend Expected<InstrumentationMap>
+ LLVM_ABI friend Expected<InstrumentationMap>
loadInstrumentationMap(StringRef);
public:
diff --git a/llvm/include/llvm/XRay/Trace.h b/llvm/include/llvm/XRay/Trace.h
index af1d35c67817b..5e4e40aa7ca90 100644
--- a/llvm/include/llvm/XRay/Trace.h
+++ b/llvm/include/llvm/XRay/Trace.h
@@ -51,7 +51,7 @@ class Trace {
typedef std::vector<XRayRecord>::const_iterator citerator;
- LLVM_ABI_FRIEND friend Expected<Trace> loadTrace(const DataExtractor &, bool);
+ LLVM_ABI friend Expected<Trace> loadTrace(const DataExtractor &, bool);
public:
using size_type = RecordVector::size_type;
>From e5c8e4e56684cb0e932367a95fc8d9580b9738de Mon Sep 17 00:00:00 2001
From: Andrew Rogers <andrurogerz at gmail.com>
Date: Mon, 16 Jun 2025 11:10:04 -0700
Subject: [PATCH 3/4] [llvm] remove LLVM_ABI_FRIEND documentation
---
llvm/docs/InterfaceExportAnnotations.rst | 7 +++----
1 file changed, 3 insertions(+), 4 deletions(-)
diff --git a/llvm/docs/InterfaceExportAnnotations.rst b/llvm/docs/InterfaceExportAnnotations.rst
index afea5b461d16c..ec1f907b5f645 100644
--- a/llvm/docs/InterfaceExportAnnotations.rst
+++ b/llvm/docs/InterfaceExportAnnotations.rst
@@ -222,7 +222,7 @@ method in a C++ class, it may be annotated for export.
Friend Functions
~~~~~~~~~~~~~~~~
Friend functions declared in a class, struct or union must be annotated with
-``LLVM_ABI_FRIEND`` if the corresponding function declaration is annotated with
+``LLVM_ABI`` if the corresponding function declaration is annotated with
``LLVM_ABI``. This requirement applies even when the class containing the friend
declaration is annotated with ``LLVM_ABI``.
@@ -236,14 +236,13 @@ declaration is annotated with ``LLVM_ABI``.
class ExampleClass {
// Friend declaration of a function must be annotated the same as the actual
// function declaration.
- LLVM_ABI_FRIEND friend int friend_function(ExampleClass &obj);
+ LLVM_ABI friend int friend_function(ExampleClass &obj);
};
.. note::
Annotating the friend declaration avoids an “inconsistent dll linkage”
- compiler error when building a DLL for Windows. The ``LLVM_ABI_FRIEND``
- annotation is a no-op when building ELF or Mach-O shared libraries.
+ compiler error when building a DLL for Windows.
Virtual Table and Type Info
~~~~~~~~~~~~~~~~~~~~~~~~~~~
>From 15fcc4042b4949cf7699dce242a793ec15a4fdde Mon Sep 17 00:00:00 2001
From: Andrew Rogers <andrurogerz at gmail.com>
Date: Tue, 17 Jun 2025 13:17:48 -0700
Subject: [PATCH 4/4] [llvm] always define LLVM_ABI using __attribute__
---
llvm/include/llvm/Support/Compiler.h | 14 ++++++++------
1 file changed, 8 insertions(+), 6 deletions(-)
diff --git a/llvm/include/llvm/Support/Compiler.h b/llvm/include/llvm/Support/Compiler.h
index c921558d909aa..0ad40a56b6558 100644
--- a/llvm/include/llvm/Support/Compiler.h
+++ b/llvm/include/llvm/Support/Compiler.h
@@ -191,17 +191,19 @@
#define LLVM_EXPORT_TEMPLATE
#endif
#define LLVM_ABI_EXPORT __declspec(dllexport)
-#elif defined(__ELF__) || defined(__MINGW32__) || defined(_AIX) || \
+#elif __has_attribute(visibility)
+#if defined(__ELF__) || defined(__MINGW32__) || defined(_AIX) || \
defined(__MVS__) || defined(__CYGWIN__)
-#define LLVM_ABI LLVM_ATTRIBUTE_VISIBILITY_DEFAULT
-#define LLVM_TEMPLATE_ABI LLVM_ATTRIBUTE_VISIBILITY_DEFAULT
+#define LLVM_ABI __attribute__((visibility("default")))
+#define LLVM_TEMPLATE_ABI LLVM_ABI
#define LLVM_EXPORT_TEMPLATE
-#define LLVM_ABI_EXPORT LLVM_ATTRIBUTE_VISIBILITY_DEFAULT
+#define LLVM_ABI_EXPORTL LLVM_ABI
#elif defined(__MACH__) || defined(__WASM__) || defined(__EMSCRIPTEN__)
-#define LLVM_ABI LLVM_ATTRIBUTE_VISIBILITY_DEFAULT
+#define LLVM_ABI __attribute__((visibility("default")))
#define LLVM_TEMPLATE_ABI
#define LLVM_EXPORT_TEMPLATE
-#define LLVM_ABI_EXPORT LLVM_ATTRIBUTE_VISIBILITY_DEFAULT
+#define LLVM_ABI_EXPORT LLVM_ABI
+#endif
#endif
#endif
#if !defined(LLVM_ABI)
More information about the llvm-commits
mailing list