(Reproduces on LLVM version 22.1.4)
; ModuleID = 'repro.ll'
source_filename = "repro.ll"
target datalayout = "e-m:o-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-n32:64-S128-Fn32"
target triple = "aarch64-apple-macosx13.0.0-unknown"
define internal void @foo_internal() {
ret void
}
@foo_external = weak_odr hidden alias void (), ptr @foo_internal
$ llc repro.ll -filetype=obj -o repro.o
$ llvm-nm -m repro.o
0000000000000000 (__TEXT,__text) private external _foo_external
0000000000000000 (__TEXT,__text) non-external _foo_internal
0000000000000000 (__TEXT,__text) non-external ltmp0
0000000000000008 (__LD,__compact_unwind) non-external ltmp1
I expect _foo_external to be marked as weak external, but it is marked as private external.
Oddly, if the alias has default visibility, then the symbol isn't even marked as external anymore:
-@foo_external = weak_odr hidden alias void (), ptr @foo_internal
+@foo_external = weak_odr alias void (), ptr @foo_internal
$ llc repro.ll -filetype=obj -o repro.o
$ llvm-nm -m repro.o
0000000000000000 (__TEXT,__text) non-external _foo_external
0000000000000000 (__TEXT,__text) non-external _foo_internal
0000000000000000 (__TEXT,__text) non-external ltmp0
0000000000000008 (__LD,__compact_unwind) non-external ltmp1
Of course, if @foo_external is a separate function instead of an alias, it works as expected:
-@foo_external = weak_odr hidden alias void (), ptr @foo_internal
+define weak_odr hidden void @foo_external() { ret void }
$ llc repro.ll -filetype=obj -o repro.o
$ llvm-nm -m repro.o
0000000000000004 (__TEXT,__text) weak private external _foo_external
0000000000000000 (__TEXT,__text) non-external _foo_internal
0000000000000000 (__TEXT,__text) non-external ltmp0
0000000000000008 (__LD,__compact_unwind) non-external ltmp1
(Reproduces on LLVM version 22.1.4)
I expect
_foo_externalto be marked asweak external, but it is marked asprivate external.Oddly, if the alias has
defaultvisibility, then the symbol isn't even marked asexternalanymore:Of course, if
@foo_externalis a separate function instead of an alias, it works as expected: