aboutsummaryrefslogtreecommitdiff
path: root/clang/test/AST/ast-print-openacc-wait-construct.cpp
diff options
context:
space:
mode:
authorAndrew Rogers <andrurogerz@gmail.com>2025-07-24 11:03:58 -0700
committerGitHub <noreply@github.com>2025-07-24 11:03:58 -0700
commit04892228b1125723666c0df874797c51e4620e50 (patch)
treef67ca488202a049851d4f3862a743c98e1053768 /clang/test/AST/ast-print-openacc-wait-construct.cpp
parent967626b842551ecd997c0d10eb68c3015b63a3d7 (diff)
downloadllvm-04892228b1125723666c0df874797c51e4620e50.zip
llvm-04892228b1125723666c0df874797c51e4620e50.tar.gz
llvm-04892228b1125723666c0df874797c51e4620e50.tar.bz2
[llvm] get cl::opt instantiations working with MSVC DLL build (#147810)
## Purpose This patch is one in a series of code-mods that annotate LLVM’s public interface for export. This patch annotates the `llvm::cl::opt` explicit template instantiations for export with `LLVM_TEMPLATE_ABI` and `LLVM_EXPORT_TEMPLATE`. This annotation currently has no meaningful impact on the LLVM build; however, it is a prerequisite to support an LLVM Windows DLL (shared library) build. ## 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). Annotating the `llvm::cl::opt` template instances for DLL export was not straight-forward like other explicit template instances that have already been annotated. Annotating them as documented [here](https://github.com/llvm/llvm-project/blob/main/llvm/docs/InterfaceExportAnnotations.rst#templates) results in link errors when building a Windows DLL using MSVC. ## Overview There are two specific issues that appear when exporting the `llvm::cl::opt` templates and compiling a Windows DLL with MSVC: 1. We cannot export `opt<std::string>`. This is because MSVC exports all ancestor classes when exporting an instantiated template class. Since one of `opt`'s ancestor classes is its type argument (via `opt_storage`), it is an ancestor of `std::string`. Therefore, if we export `opt<std::string>` from the LLVM DLL, MSVC forces `std::basic_string` to also be exported. This leads to duplicate symbol errors and generally seems like a bad idea. Compiling with `clang-cl` does not exhibit this behavior. 2. The `opt` template instances other than `opt<bool>` get optimized out because they are not referenced in the TU (`opt<bool>` actually is). It is unclear exactly why MSVC optimizes these template instances away, but `clang-cl` does not. Adding explicit references to the instantiated `opt` template classes' vtables via implicit virtual destructor forces MSVC to export them. ## Validation Windows with MSVC Windows with Clang
Diffstat (limited to 'clang/test/AST/ast-print-openacc-wait-construct.cpp')
0 files changed, 0 insertions, 0 deletions