[clang] [MS][clang] Add support for vector deleting destructors (PR #126240)
Mariya Podchishchaeva via cfe-commits
cfe-commits at lists.llvm.org
Fri Mar 14 10:46:22 PDT 2025
Fznamznon wrote:
Reduced linkage failure reproducer (can be reduced further, I'm sure), it consists of 4 files
t.h:
```
#include <new>
struct Base {
Base() {}
virtual ~Base() {}
};
struct ClassA : public Base {
inline ClassA();
virtual ~ClassA(){} ;
};
inline
ClassA::ClassA() {}
void foo();
```
t.cpp
```
#include "t.h"
int main()
{ ClassA* objs = new ClassA[5]; delete[] objs;
foo(); return 0; }
```
t1.cpp
```
#include "t.h"
void foo()
{ ClassA* objs = new ClassA[5]; delete[] objs; }
```
t3.cpp
```
#include "t.h"
void foobar()
{ ClassA* objs = new ClassA; delete objs; }
```
Then
```
clang-cl -c t.cpp /Zi -fsanitize=address,fuzzer-no-link
clang-cl -c t1.cpp /Zi -fsanitize=address,fuzzer-no-link
clang-cl -c t3.cpp /Zi -fsanitize=address,fuzzer-no-link
lld-link.exe t.obj t1.obj t1.obj t3.obj "-libpath:path_to_llvm\lib\clang\21\lib\windows" "path_to_llvm\lib\clang\21\lib\windows\clang_rt.asan_dynamic-x86_64.lib" "-wholearchive:path_to_llvm\lib\clang\21\lib\windows\clang_rt.asan_static_runtime_thunk-x86_64.lib"\
lld-link: error: relocation against symbol in discarded section: .text
>>> referenced by t1.obj:(.SCOVP$M)
>>> referenced by t1.obj:(.SCOVP$M)
>>> referenced by t1.obj:(.SCOVP$M)
>>> referenced by t1.obj:(.SCOVP$M)
>>> referenced by t1.obj:(.SCOVP$M)
lld-link: error: relocation against symbol in discarded section: .text
>>> referenced by t1.obj:(.SCOVP$M)
>>> referenced by t1.obj:(.SCOVP$M)
>>> referenced by t1.obj:(.SCOVP$M)
>>> referenced by t1.obj:(.SCOVP$M)
>>> referenced by t1.obj:(.SCOVP$M)
lld-link: error: relocation against symbol in discarded section: .text
>>> referenced by t1.obj:(.SCOVP$M)
>>> referenced by t1.obj:(.SCOVP$M)
>>> referenced by t1.obj:(.SCOVP$M)
>>> referenced by t1.obj:(.SCOVP$M)
>>> referenced by t1.obj:(.SCOVP$M)
lld-link: error: relocation against symbol in discarded section: .text
>>> referenced by t1.obj:(.SCOVP$M)
>>> referenced by t1.obj:(.SCOVP$M)
>>> referenced by t1.obj:(.SCOVP$M)
>>> referenced by t1.obj:(.SCOVP$M)
>>> referenced by t1.obj:(.SCOVP$M)
lld-link: error: relocation against symbol in discarded section: .text
>>> referenced by t1.obj:(.SCOVP$M)
>>> referenced by t1.obj:(.SCOVP$M)
>>> referenced by t1.obj:(.SCOVP$M)
>>> referenced by t1.obj:(.SCOVP$M)
>>> referenced by t1.obj:(.SCOVP$M)
```
t.obj and t1.cpp will trigger vector deleting destructor, t3.cpp will trigger scalar deleting destructor and a weak alias. What I've noticed is that LINK.exe (Microsoft linker) is fine with these 3 object files. I don't know what is going on during linkage when one object file has a definition of vector deleting destructor, but another object file has only an alias. vector deleting destructors are generated by this patch with weak linkage. Perhaps support is needed in lld-link for that case?
The reason why it is triggered by sanitizer build, adding -fsanitize=fuzzer-no-link option causes adding a bunch of global variables to IR that reference the destructors and marked with SCOVP$M section:
```
@__sancov_gen_.3 = private constant [10 x ptr] [ptr @"??_EClassA@@UEAAPEAXI at Z", ptr inttoptr (i64 1 to ptr), ptr blockaddress(@"??_EClassA@@UEAAPEAXI at Z", %dtor.vector.dtor.continue_crit_edge), ptr null, ptr blockaddress(@"??_EClassA@@UEAAPEAXI at Z", %dtor.call_delete_after_array_destroy), ptr null, ptr blockaddress(@"??_EClassA@@UEAAPEAXI at Z", %dtor.scalar.dtor.continue.sink.split_crit_edge), ptr null, ptr blockaddress(@"??_EClassA@@UEAAPEAXI at Z", %dtor.scalar.dtor.continue_crit_edge), ptr null], section ".SCOVP$M", align 8
```
I'm now heading to the weekend, but I'll look a bit more before claiming problems in lld-link
@zmodem , thanks for the findings
> So maybe there is something wrong with the vector deleting destructor for ICU's UnicodeString or how it's being used.
but, that is still not a great reproducer for a reverted patch. Especially if the link issue is due to a missing support in linker. I would appreciate if you could maybe point to how exactly `UnicodeString` is used in failing scenario.
https://github.com/llvm/llvm-project/pull/126240
More information about the cfe-commits
mailing list