<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/86548>86548</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
[tapi] XCode14 *.tbd + lld (TextAPI) => invalid imports
</td>
</tr>
<tr>
<th>Labels</th>
<td>
lld
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
alx32
</td>
</tr>
</table>
<pre>
Hello,
I am seeing an issue where using an older version of `tapi` binary to generate `*.tbd`'s for libraries is ending up with invalid binaries after [this change](https://reviews.llvm.org/D149860#inline-1455260). The issue seems to be coming from [SymbolSet.h](https://github.com/llvm/llvm-project/blob/main/llvm/include/llvm/TextAPI/SymbolSet.h#L105) - where if a binary has a `_OBJC_EHTYPE_` for a class, then it is assumed that the binary also has the class. This is not always true - as the following example shows.
The issue only repro's if using XCode 14's `tapi` binary to generated the `*.tbd` for a library. This is because it exports the `_OBJC_EHTYPE_` as:
```
objc-eh-types: [ Banana ]
```
Whereas XCode 15 (as well as `llvm-readtapi -stubify`) exports the `_OBJC_EHTYPE_` as:
```
weak-symbols: [ '_OBJC_EHTYPE_$_Banana' ]
```
In the below repro, the issue is that `BananaStore_LinkTbd.dylib` is trying to import `_OBJC_CLASS_$_Banana` from `BananaPealer.dylib`. The class is actually located in `BananaLib.dylib`.
The script requires llvm's `clang`(and `ld64.lld`) and XCode14's `tapi` (or just use the linked `gist`'s).
In the script output, notice the difference when importing the library directly vs the `*.tbd`:
```
Printing where from BananaStore_LinkDirect.dylib imports _OBJC_CLASS_$_Banana:
__DATA __objc_data 0x000080C0 bind BananaLib.dylib/_OBJC_CLASS_$_Banana
Printing where from BananaStore_LinkTbd.dylib imports _OBJC_CLASS_$_Banana:
__DATA __objc_data 0x000080C0 bind BananaPealer.dylib/_OBJC_CLASS_$_Banana
```
`repro.sh` (Has to be run on MacOS - update first 2 lines with your paths)
```
CLANG_BIN=~/llvm-project/build/Debug/bin/clang
TAPI_BIN=/Applications/Xcode_14/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/tapi
mkdir -p /tmp/banana_test
cd /tmp/banana_test
rm -f /tmp/banana_test/*
echo '
__attribute__((objc_root_class)) @interface Banana @end
' > Banana.h
echo '
#import "Banana.h"
@implementation Banana @end
void *_objc_empty_vtable;
void *_objc_empty_cache;
' > BananaLib.mm
echo '
#import "Banana.h"
extern "C" void pealBanana();
extern "C" void pealBanana() {
try {} catch (Banana *error) {}
}
void *objc_ehtype_vtable;
void *objc_empty_cache;
void *objc_empty_vtable;
' > BananaPealer.mm
echo '
#import "Banana.h"
@interface BananaStore : Banana @end
@implementation BananaStore @end
' > BananaStore.mm
DYLD_INFO_BIN=$(xcrun --find dyld_info)
CLANG_COMMON="-nostdlib -fPIC -target arm64-apple-macos -arch arm64 -fuse-ld=lld -Wl,-dylib,-dynamic,-platform_version,macos,11.0.0,11.0.0 -mmacosx-version-min=11.0"
$CLANG_BIN $CLANG_COMMON -o BananaLib.dylib BananaLib.mm
$TAPI_BIN -stubify --filetype=tbd-v4 BananaLib.dylib # BananaLib.tbd - https://gist.github.com/alx32/03bbe94c2e9459bad63825e974195d48
$CLANG_BIN $CLANG_COMMON -o BananaPealer.dylib BananaPealer.mm -Wl,BananaLib.dylib
$TAPI_BIN -stubify --filetype=tbd-v4 BananaPealer.dylib # BananaPealer.tbd - https://gist.github.com/alx32/b800a8547e4686616cc986183051bbec
$CLANG_BIN $CLANG_COMMON -o BananaStore_LinkDirect.dylib BananaStore.mm -Wl,BananaPealer.dylib,BananaLib.dylib
$CLANG_BIN $CLANG_COMMON -o BananaStore_LinkTbd.dylib BananaStore.mm -Wl,BananaPealer.tbd,BananaLib.tbd
echo 'Printing where from BananaStore_LinkDirect.dylib imports _OBJC_CLASS_$_Banana:'
dyld_info -fixups BananaStore_LinkDirect.dylib | grep '_OBJC_CLASS_$_Banana'
echo 'Printing where from BananaStore_LinkTbd.dylib imports _OBJC_CLASS_$_Banana:'
dyld_info -fixups BananaStore_LinkTbd.dylib | grep '_OBJC_CLASS_$_Banana'
```
Q: Is this actually an issue in llvm or is XCode14's `tapi` producing invalid `*.tbd`'s ?
Q: Is it possible to hit this issue in any other scenario - or this is strictly related to XCode14 invalid `*.tbd`'s?
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJy0WM1u4zgSfhr6UpAhU5ItH3Jw7PZOFpnpLNLAzJwMiipZ7KZILUkl8WWffUFKluPEznZmsEHDbfOnfr76qooks1bsFeINyW5JtpmwztXa3DD5ktBJocvDzS8opSZ0TeINiVf95x2wBiyiUHtgCoS1HcJzjQahs8OgliUaeEJjhVagKyDz2LFWkHkMhVDMHMBp2KNCwxz6WUJXU1eU4dvCQqUNSFEYZgRaEBZQlV5218KzcDUI9cSkKHthfgmrHBog2a2rhQVeM7VHkm0IzWvnWkuSFaFbQrcGnwQ-26mUT81Umz2h280sXeZebyKUFAqjWZpl1A8sp_CtxsFFi9hYb3aBwHXjramMbrzOx0NTaPmIblpf0rkXru6KKdcNoVuvePgvao3-jtwRui2kLgjdNkyo0xqhuOxKPA18wxe3ergjdPtaI03uZ3FG6BKiIQ6iAnbEuWYWmEd49_X2n-vdl1--_fnwZecD4TFmwCWzltA1uBoVCOfBZtZ2DZbgaub8-FEWk1YHgX4sbPQAiRAgpR0w-cwOFpzpECIY1lVaSv3s4cIX1rQSwdb62U7hNalOMGslD2CwNToQQVQDq_5Y6xJhlobRD-lUBrVnnBp87Rl1OBldIGedRe82vrTaOHvc-w4tFuLZmzyPh3_hpy6-8wjryB1a9IsAPCfglimmGHhCXNr1u48Us0e_MiA0ZxaeUUqPHJnHgSIGWeldhci6rhDVIfi1PDP3k_Y-I_sR2UCgwdxgL6GLcyE03fU-ELq46sZQE1RPE5T6-Ri8wKghqML2XCLzuBf56LTB3b1QP74V5bQ8SFF4o_06c_DhdhpE4108Obe-Xz0-vjbLxzVk4FHqAzKJZhQ3hZC-gaiB1tx1TMoDSM0DT4Q67b0XxWnjW2pabkTrwOC_O2HQQp-PPRG5ZGofopIzVYbAlfN0KmU5hMqPhii_Jy-huTbwvbMOPA09YFKoHxjE7IV1Qz30pegM6cEg3bm2cx5rpZ3gvYRSVBUaVDyUZTXgGEAN8kMOQCkMcicP8GTf58s16jwYoYKkvs4E9N8GdBME91gOui1cieBRDQx_u91m9W01_vCZtSuZY_1A_BLHcZzH65D1JcDbyNHtFT0_bfzIRq_vrxn_kdlnf8GHC8T92IuL-TdOhdyb2nog1y_s2LFMp0Ar-JXxr48QQdeWvvFWwlgH1JMObd9ZD7oz0DJXe9JdVLm-X_32j93t3W8k2fznQivrhCx9W8Wi8-21CC2tz5I-oVYPd8N2QrertpWCMye0soRu_-C6xJ3PlO1aK4fK2SDrCaVu0fgmqLXkNROn5RusWCfd9IW74xyh286aUXvIt1dINT9KYSBqwc81rV8XIN45tK5fwssPJk0DUXV53nf8s6ggr7Uvrkey7HbMOSOKzuFuR2jua4AnjNHa7YZuvPR1g6SxUA5NxTiO3SSNUZWDeF-Wky_D1LT-SKk_3AzllNJxA6XjfBoL35sbVC7E4pJCgCctPCyrnuLYtO6we3KskEiS248Wccbr05pzy33-Ns3fsR5fHBrlJ9eE0t6AFpk8tq_cI3oy8GeWA1ncntLbmUMYWGyAM8drn1tHgOgKjdHmuGexGa0-fT1C0iNS-5PCddyuwnZxyRsx59AOdeXvoXuBh6Fggj88XKTJNTYN265yOMy_sbb_3Px5v9nd_bb9OhaOlND8hfuyFkWVr6TlQZY7oSo91q2-UK2__vrr134PjZS2rvTlPaoe7tYQOWb26ICZZp5GrG0lRg3j2kLEDK_7cYiqzmIkS5JspCwh-l0Suo6GYu2_KNYI7r-2krlKm2Y3XH0IXQdxhK5ns2k8jccvEDVh5iUalkaNUCTZ-NkR-yNG6VhyYfzRuwWRftsFL2UVTY9FdzxHBtgkeiqSZOOKMnpK34kiNHk15ooSInh7t7FuenbBCddHQrdxUhS4TDnFZZotC1bOk5xmuFyks2VWpvlnnHvdH99Se4jH27PAX3H8TM3J92H4c-4XeRyzPEsXmM7z-Xw253yZz2d5EmezokD-GfevHK7Ok-YMh_MDxVVwPqX7dDb634r9MfK1Wv_7Qgn6P5wnj3VtLAcQVeKla-3HgsliDXuD7eka9E74UfLnXfjkqfLnXTgJ_oz9l06Q__LF_M5fBV5flMb3HaHCnQe08RepK7eZ1uiy4x6L4_PM-4cdkmzhXKNw0GprRSHRn1Vr4XojRsVMHUC7Gg1YjooZoSHyhgyrwDojwk3GoOyv__po4XVDSLKdlDdJuUyWbII3s8VsluT5Mssn9Q2PizIvOE-w5LzIsgVmszJZsJRmcTXPs4m4oTFN44Rms0W6nOVTzJZJnBd5krK8yOPct7iGCTk-M02CNzf5PEvziWQFShte3Sj190RKSbaZmJtwki66vSVpLIV1p2eqiRNOhoe6AHa2GT0c3AJCb8F3J0Lz8ZloCb7tJV9GGAbuTTojbz79RhVc8Ifu4MV_AwAA___t-kEk">