From 20894a478da224bdd69c91a22a5175b28bc08ed9 Mon Sep 17 00:00:00 2001 From: Paul Kirth Date: Thu, 5 Jan 2023 20:32:25 +0000 Subject: [PATCH] [lld-macho] Prevent assertions for aliases to weak_def_can_be_hidden symbols In https://reviews.llvm.org/D137982 we found that on Mach-O private aliases could trigger an assert in lld when the aliasee was a weak_def_can_be_hidden symbol. This appears to be incorrect, and should be allowed in Mach-O. Disallowing this behavior is also inconsistent with how ld64 handles a private alias to weak_def_can_be_hidden symbols. This patch removes the assert and tests that LLD handles such aliases gracefully. Reviewed By: #lld-macho, int3 Differential Revision: https://reviews.llvm.org/D141082 --- lld/MachO/InputFiles.cpp | 2 -- lld/test/MachO/weak-def-can-be-hidden.s | 4 ++++ 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/lld/MachO/InputFiles.cpp b/lld/MachO/InputFiles.cpp index b7d3379a12be..5a858c0205af 100644 --- a/lld/MachO/InputFiles.cpp +++ b/lld/MachO/InputFiles.cpp @@ -698,8 +698,6 @@ static macho::Symbol *createDefined(const NList &sym, StringRef name, sym.n_desc & REFERENCED_DYNAMICALLY, sym.n_desc & N_NO_DEAD_STRIP, isWeakDefCanBeHidden); } - assert(!isWeakDefCanBeHidden && - "weak_def_can_be_hidden on already-hidden symbol?"); bool includeInSymtab = !isPrivateLabel(name) && !isEhFrameSection(isec); return make( name, isec->getFile(), isec, value, size, sym.n_desc & N_WEAK_DEF, diff --git a/lld/test/MachO/weak-def-can-be-hidden.s b/lld/test/MachO/weak-def-can-be-hidden.s index 4552582df3d1..091ad618dba9 100644 --- a/lld/test/MachO/weak-def-can-be-hidden.s +++ b/lld/test/MachO/weak-def-can-be-hidden.s @@ -116,6 +116,10 @@ _foo: _foo: retq +# An alias is the only way to set .weak_def_can_be_hidden on an already-hidden symbol. +# Veryify that LLD can handle these double-hidden symbols gracefully. +.set l_foo, _foo + #--- weak-foo-pe.s .private_extern _foo .globl _foo