Skip to content

[Mach-O] wrong lowering for alias with weak linkage #196047

@mlugg

Description

@mlugg

(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

Metadata

Metadata

Assignees

No one assigned

    Type

    No fields configured for Bug.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions