Skip to content

Commit 8c9feb7

Browse files
authored
[llvm] get Linux -fvisibility=hidden shared library build working with GCC (#151365)
## Purpose Add missing annotations so that LLVM can build as a shared library on Linux with `-fvisibility=hidden` using GCC. ## Overview Add a couple of annotations that make GCC happy: * Add `LLVM_TEMPLATE_ABI` to the `extern` declaration of `LoopBase<MachineBasicBlock, MachineLoop>`. The instantiation of this of this template is already properly annotated with `LLVM_EXPORT_TEMPLATE` and this declaration was missed. This omission did not cause problems with MSVC or Clang but results in undefined reference to the destructor with GCC. * Add `LLVM_ATTRIBUTE_VISIBILITY_DEFAULT` to the template declaration for `InnerAnalysisManagerProxy::Key`. `LLVM_ABI` cannot be used here because MSVC disallows storage-class specifiers on class members outside of the class declaration (C2720). Since `LLVM_ATTRIBUTE_VISIBILITY_DEFAULT` only applies to non-Windows targets, it can be used in its place. Omitting this annotation does not cause problems with Clang but results in undefined reference to `InnerAnalysisManagerProxy::Key` fields for for explicitly instantiated declarations when compiling with GCC. ## Background This effort is tracked in #109483. Additional context is provided in [this discourse](https://discourse.llvm.org/t/psa-annotating-llvm-public-interface/85307), and documentation for `LLVM_ABI` and related annotations is found in the LLVM repo [here](https://github.com/llvm/llvm-project/blob/main/llvm/docs/InterfaceExportAnnotations.rst). ## Validation On Fedora 42, build with GCC `LLVM_BUILD_LLVM_DYLIB=ON`, `LLVM_BUILD_LLVM_DYLIB_VIS=ON`, and `LLVM_LINK_LLVM_DYLIB=ON`. ``` cmake -B build -S llvm -G Ninja -DLLVM_ENABLE_PROJECTS="llvm;clang;clang-tools-extra;lldb;lld" -DLLVM_OPTIMIZED_TABLEGEN=ON -DLLVM_BUILD_TESTS=ON -DLLVM_BUILD_EXAMPLES=ON -DLLDB_ENABLE_PYTHON=NO -DLLVM_BUILD_LLVM_DYLIB=ON -DLLVM_BUILD_LLVM_DYLIB_VIS=ON -DLLVM_LINK_LLVM_DYLIB=ON -DCLANG_LINK_CLANG_DYLIB=OFF -DCMAKE_BUILD_TYPE=Release ninja -C build ```
1 parent f9386d3 commit 8c9feb7

File tree

2 files changed

+9
-2
lines changed

2 files changed

+9
-2
lines changed

llvm/include/llvm/CodeGen/MachineLoopInfo.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,8 @@ namespace llvm {
4242
class MachineDominatorTree;
4343
// Implementation in LoopInfoImpl.h
4444
class MachineLoop;
45-
extern template class LoopBase<MachineBasicBlock, MachineLoop>;
45+
extern template class LLVM_TEMPLATE_ABI
46+
LoopBase<MachineBasicBlock, MachineLoop>;
4647

4748
class MachineLoop : public LoopBase<MachineBasicBlock, MachineLoop> {
4849
public:

llvm/include/llvm/IR/PassManager.h

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -657,8 +657,14 @@ class LLVM_TEMPLATE_ABI InnerAnalysisManagerProxy
657657
AnalysisManagerT *InnerAM;
658658
};
659659

660+
// NOTE: The LLVM_ABI annotation cannot be used here because MSVC disallows
661+
// storage-class specifiers on class members outside of the class declaration
662+
// (C2720). LLVM_ATTRIBUTE_VISIBILITY_DEFAULT only applies to non-Windows
663+
// targets so it is used instead. Without this annotation, compiling LLVM as a
664+
// shared library with -fvisibility=hidden using GCC fails to export the symbol
665+
// even though InnerAnalysisManagerProxy is already annotated with LLVM_ABI.
660666
template <typename AnalysisManagerT, typename IRUnitT, typename... ExtraArgTs>
661-
AnalysisKey
667+
LLVM_ATTRIBUTE_VISIBILITY_DEFAULT AnalysisKey
662668
InnerAnalysisManagerProxy<AnalysisManagerT, IRUnitT, ExtraArgTs...>::Key;
663669

664670
/// Provide the \c FunctionAnalysisManager to \c Module proxy.

0 commit comments

Comments
 (0)