diff options
author | Andrew Rogers <andrurogerz@gmail.com> | 2025-07-24 11:03:58 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2025-07-24 11:03:58 -0700 |
commit | 04892228b1125723666c0df874797c51e4620e50 (patch) | |
tree | f67ca488202a049851d4f3862a743c98e1053768 /clang/test/AST/ast-print-openacc-wait-construct.cpp | |
parent | 967626b842551ecd997c0d10eb68c3015b63a3d7 (diff) | |
download | llvm-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