[lld] ec15263 - [lld][WebAssembly] Convert weak-alias tests to assembly. NFC (#184667)

via llvm-commits llvm-commits at lists.llvm.org
Wed Mar 4 13:05:08 PST 2026


Author: Sam Clegg
Date: 2026-03-04T13:05:02-08:00
New Revision: ec15263cb898c2055f003810848ba590b6e8b42b

URL: https://github.com/llvm/llvm-project/commit/ec15263cb898c2055f003810848ba590b6e8b42b
DIFF: https://github.com/llvm/llvm-project/commit/ec15263cb898c2055f003810848ba590b6e8b42b.diff

LOG: [lld][WebAssembly] Convert weak-alias tests to assembly. NFC (#184667)

This actually both improves and simplifies the `Inputs/weak_alias`. With
the `.ll` version we ended up using memory and `__stack_pointer` and
locals, but LLVM ended up generated `call` rather than `call_indirect`
for the `call_alias_ptr` and `call_direct_ptr`. With the assembly tests
we can ensure the usage of `call_indirect` while avoiding all the other
stuff.

Added: 
    lld/test/wasm/Inputs/weak-alias.s
    lld/test/wasm/weak-alias-overide.s
    lld/test/wasm/weak-alias.s

Modified: 
    

Removed: 
    lld/test/wasm/Inputs/weak-alias.ll
    lld/test/wasm/weak-alias-overide.ll
    lld/test/wasm/weak-alias.ll


################################################################################
diff  --git a/lld/test/wasm/Inputs/weak-alias.ll b/lld/test/wasm/Inputs/weak-alias.ll
deleted file mode 100644
index 451f09802c439..0000000000000
--- a/lld/test/wasm/Inputs/weak-alias.ll
+++ /dev/null
@@ -1,39 +0,0 @@
-target triple = "wasm32-unknown-unknown"
-
-; Function Attrs: norecurse nounwind readnone
-define i32 @direct_fn() #0 {
-entry:
-  ret i32 0
-}
-
- at alias_fn = weak alias i32 (), ptr @direct_fn
-
-define i32 @call_direct() #0 {
-entry:
-  %call = call i32 @direct_fn()
-  ret i32 %call
-}
-
-define i32 @call_alias() #0 {
-entry:
-  %call = call i32 @alias_fn()
-  ret i32 %call
-}
-
-define i32 @call_alias_ptr() #0 {
-entry:
-   %fnptr = alloca ptr, align 8
-   store ptr @alias_fn, ptr %fnptr, align 8
-   %0 = load ptr, ptr %fnptr, align 8
-   %call = call i32 %0()
-   ret i32 %call
-}
-
-define i32 @call_direct_ptr() #0 {
-entry:
-  %fnptr = alloca ptr, align 8
-  store ptr @direct_fn, ptr %fnptr, align 8
-  %0 = load ptr, ptr %fnptr, align 8
-  %call = call i32 %0()
-  ret i32 %call
-}

diff  --git a/lld/test/wasm/Inputs/weak-alias.s b/lld/test/wasm/Inputs/weak-alias.s
new file mode 100644
index 0000000000000..f0e55f1b8fbdd
--- /dev/null
+++ b/lld/test/wasm/Inputs/weak-alias.s
@@ -0,0 +1,35 @@
+.globl direct_fn
+direct_fn:
+  .functype direct_fn () -> (i32)
+  i32.const 0
+  end_function
+
+.globl call_direct
+call_direct:
+  .functype call_direct () -> (i32)
+  call direct_fn
+  end_function
+
+.functype alias_fn () -> (i32)
+.weak alias_fn
+alias_fn = direct_fn
+
+.globl call_alias
+call_alias:
+  .functype call_alias () -> (i32)
+  call alias_fn
+  end_function
+
+.globl call_alias_ptr
+call_alias_ptr:
+  .functype call_alias_ptr () -> (i32)
+  i32.const alias_fn
+  call_indirect () -> (i32)
+  end_function
+
+.globl call_direct_ptr
+call_direct_ptr:
+  .functype call_direct_ptr () -> (i32)
+  i32.const direct_fn
+  call_indirect () -> (i32)
+  end_function

diff  --git a/lld/test/wasm/weak-alias-overide.ll b/lld/test/wasm/weak-alias-overide.ll
deleted file mode 100644
index 30bf7cf3f9dff..0000000000000
--- a/lld/test/wasm/weak-alias-overide.ll
+++ /dev/null
@@ -1,135 +0,0 @@
-; RUN: llc -mcpu=mvp -filetype=obj -o %t.o %s
-; RUN: llc -mcpu=mvp -filetype=obj %S/Inputs/weak-alias.ll -o %t2.o
-; RUN: wasm-ld --export-dynamic %t.o %t2.o -o %t.wasm
-; RUN: obj2yaml %t.wasm | FileCheck %s
-
-; Test that the strongly defined alias_fn from this file is used both here
-; and in call_alias.
-
-target triple = "wasm32-unknown-unknown"
-
-define i32 @alias_fn() local_unnamed_addr #1 {
-  ret i32 1
-}
-
-; Function Attrs: nounwind uwtable
-define void @_start() local_unnamed_addr #1 {
-entry:
-  %call = tail call i32 @alias_fn() #2
-  ret void
-}
-
-; CHECK:      --- !WASM
-; CHECK-NEXT: FileHeader:
-; CHECK-NEXT:   Version:         0x1
-; CHECK-NEXT: Sections:
-; CHECK-NEXT:   - Type:            TYPE
-; CHECK-NEXT:     Signatures:
-; CHECK-NEXT:       - Index:           0
-; CHECK-NEXT:         ParamTypes:      []
-; CHECK-NEXT:         ReturnTypes:
-; CHECK-NEXT:           - I32
-; CHECK-NEXT:       - Index:           1
-; CHECK-NEXT:         ParamTypes:      []
-; CHECK-NEXT:         ReturnTypes:     []
-; CHECK-NEXT:   - Type:            FUNCTION
-; CHECK-NEXT:     FunctionTypes:   [ 0, 1, 0, 0, 0, 0, 0 ]
-; CHECK-NEXT:   - Type:            TABLE
-; CHECK-NEXT:     Tables:
-; CHECK-NEXT:       - Index:           0
-; CHECK-NEXT:         ElemType:        FUNCREF
-; CHECK-NEXT:         Limits:
-; CHECK-NEXT:           Flags:           [ HAS_MAX ]
-; CHECK-NEXT:           Minimum:         0x3
-; CHECK-NEXT:           Maximum:         0x3
-; CHECK-NEXT:   - Type:            MEMORY
-; CHECK-NEXT:     Memories:
-; CHECK-NEXT:       - Minimum:         0x1
-; CHECK-NEXT:   - Type:            GLOBAL
-; CHECK-NEXT:     Globals:
-; CHECK-NEXT:       - Index:           0
-; CHECK-NEXT:         Type:            I32
-; CHECK-NEXT:         Mutable:         true
-; CHECK-NEXT:         InitExpr:
-; CHECK-NEXT:           Opcode:          I32_CONST
-; CHECK-NEXT:           Value:           65536
-; CHECK-NEXT:   - Type:            EXPORT
-; CHECK-NEXT:     Exports:
-; CHECK-NEXT:       - Name:            memory
-; CHECK-NEXT:         Kind:            MEMORY
-; CHECK-NEXT:         Index:           0
-; CHECK-NEXT:       - Name:            alias_fn
-; CHECK-NEXT:         Kind:            FUNCTION
-; CHECK-NEXT:         Index:           0
-; CHECK-NEXT:       - Name:            _start
-; CHECK-NEXT:         Kind:            FUNCTION
-; CHECK-NEXT:         Index:           1
-; CHECK-NEXT:       - Name:            direct_fn
-; CHECK-NEXT:         Kind:            FUNCTION
-; CHECK-NEXT:         Index:           2
-; CHECK-NEXT:       - Name:            call_direct
-; CHECK-NEXT:         Kind:            FUNCTION
-; CHECK-NEXT:         Index:           3
-; CHECK-NEXT:       - Name:            call_alias
-; CHECK-NEXT:         Kind:            FUNCTION
-; CHECK-NEXT:         Index:           4
-; CHECK-NEXT:       - Name:            call_alias_ptr
-; CHECK-NEXT:         Kind:            FUNCTION
-; CHECK-NEXT:         Index:           5
-; CHECK-NEXT:       - Name:            call_direct_ptr
-; CHECK-NEXT:         Kind:            FUNCTION
-; CHECK-NEXT:         Index:           6
-; CHECK-NEXT:   - Type:            ELEM
-; CHECK-NEXT:     Segments:
-; CHECK-NEXT:       - Offset:
-; CHECK-NEXT:           Opcode:          I32_CONST
-; CHECK-NEXT:           Value:           1
-; CHECK-NEXT:         Functions:       [ 0, 2 ]
-; CHECK-NEXT:   - Type:            CODE
-; CHECK-NEXT:     Functions:
-; CHECK-NEXT:       - Index:           0
-; CHECK-NEXT:         Locals:
-; CHECK-NEXT:         Body:            41010B
-; CHECK-NEXT:       - Index:           1
-; CHECK-NEXT:         Locals:
-; CHECK-NEXT:         Body:            1080808080001A0B
-; CHECK-NEXT:       - Index:           2
-; CHECK-NEXT:         Locals:
-; CHECK-NEXT:         Body:            41000B
-; CHECK-NEXT:       - Index:           3
-; CHECK-NEXT:         Locals:
-; CHECK-NEXT:         Body:            1082808080000B
-; CHECK-NEXT:       - Index:           4
-; CHECK-NEXT:         Locals:
-; CHECK-NEXT:         Body:            1080808080000B
-; CHECK-NEXT:       - Index:           5
-; CHECK-NEXT:         Locals:
-; CHECK-NEXT:           - Type:            I32
-; CHECK-NEXT:             Count:           2
-; CHECK-NEXT:         Body:            23808080800041106B220024808080800020004181808080003602081080808080002101200041106A24808080800020010B
-; CHECK-NEXT:       - Index:           6
-; CHECK-NEXT:         Locals:
-; CHECK-NEXT:           - Type:            I32
-; CHECK-NEXT:             Count:           2
-; CHECK-NEXT:         Body:            23808080800041106B220024808080800020004182808080003602081082808080002101200041106A24808080800020010B
-; CHECK-NEXT:   - Type:            CUSTOM
-; CHECK-NEXT:     Name:            name
-; CHECK-NEXT:     FunctionNames:
-; CHECK-NEXT:       - Index:           0
-; CHECK-NEXT:         Name:            alias_fn
-; CHECK-NEXT:       - Index:           1
-; CHECK-NEXT:         Name:            _start
-; CHECK-NEXT:       - Index:           2
-; CHECK-NEXT:         Name:            direct_fn
-; CHECK-NEXT:       - Index:           3
-; CHECK-NEXT:         Name:            call_direct
-; CHECK-NEXT:       - Index:           4
-; CHECK-NEXT:         Name:            call_alias
-; CHECK-NEXT:       - Index:           5
-; CHECK-NEXT:         Name:            call_alias_ptr
-; CHECK-NEXT:       - Index:           6
-; CHECK-NEXT:         Name:            call_direct_ptr
-; CHECK-NEXT:     GlobalNames:
-; CHECK-NEXT:       - Index:           0
-; CHECK-NEXT:         Name:            __stack_pointer
-; CHECK-NEXT: ...

diff  --git a/lld/test/wasm/weak-alias-overide.s b/lld/test/wasm/weak-alias-overide.s
new file mode 100644
index 0000000000000..0ee189eef0394
--- /dev/null
+++ b/lld/test/wasm/weak-alias-overide.s
@@ -0,0 +1,131 @@
+# RUN: llvm-mc -filetype=obj -triple=wasm32-unknown-unknown -o %t.o %s
+# RUN: llvm-mc -filetype=obj -triple=wasm32-unknown-unknown %S/Inputs/weak-alias.s -o %t2.o
+# RUN: wasm-ld --export-dynamic %t.o %t2.o -o %t.wasm
+# RUN: obj2yaml %t.wasm | FileCheck %s
+
+# Test that the strongly defined alias_fn from this file is used both here
+# and in call_alias.
+
+.globl alias_fn
+alias_fn:
+  .functype alias_fn () -> (i32)
+  i32.const 1
+  end_function
+
+.globl _start
+_start:
+  .functype _start () -> ()
+  call alias_fn
+  drop
+  end_function
+
+# CHECK:      --- !WASM
+# CHECK-NEXT: FileHeader:
+# CHECK-NEXT:   Version:         0x1
+# CHECK-NEXT: Sections:
+# CHECK-NEXT:   - Type:            TYPE
+# CHECK-NEXT:     Signatures:
+# CHECK-NEXT:       - Index:           0
+# CHECK-NEXT:         ParamTypes:      []
+# CHECK-NEXT:         ReturnTypes:
+# CHECK-NEXT:           - I32
+# CHECK-NEXT:       - Index:           1
+# CHECK-NEXT:         ParamTypes:      []
+# CHECK-NEXT:         ReturnTypes:     []
+# CHECK-NEXT:   - Type:            FUNCTION
+# CHECK-NEXT:     FunctionTypes:   [ 0, 1, 0, 0, 0, 0, 0 ]
+# CHECK-NEXT:   - Type:            TABLE
+# CHECK-NEXT:     Tables:
+# CHECK-NEXT:       - Index:           0
+# CHECK-NEXT:         ElemType:        FUNCREF
+# CHECK-NEXT:         Limits:
+# CHECK-NEXT:           Flags:           [ HAS_MAX ]
+# CHECK-NEXT:           Minimum:         0x3
+# CHECK-NEXT:           Maximum:         0x3
+# CHECK-NEXT:   - Type:            MEMORY
+# CHECK-NEXT:     Memories:
+# CHECK-NEXT:       - Minimum:         0x1
+# CHECK-NEXT:   - Type:            GLOBAL
+# CHECK-NEXT:     Globals:
+# CHECK-NEXT:       - Index:           0
+# CHECK-NEXT:         Type:            I32
+# CHECK-NEXT:         Mutable:         true
+# CHECK-NEXT:         InitExpr:
+# CHECK-NEXT:           Opcode:          I32_CONST
+# CHECK-NEXT:           Value:           65536
+# CHECK-NEXT:   - Type:            EXPORT
+# CHECK-NEXT:     Exports:
+# CHECK-NEXT:       - Name:            memory
+# CHECK-NEXT:         Kind:            MEMORY
+# CHECK-NEXT:         Index:           0
+# CHECK-NEXT:       - Name:            alias_fn
+# CHECK-NEXT:         Kind:            FUNCTION
+# CHECK-NEXT:         Index:           0
+# CHECK-NEXT:       - Name:            _start
+# CHECK-NEXT:         Kind:            FUNCTION
+# CHECK-NEXT:         Index:           1
+# CHECK-NEXT:       - Name:            direct_fn
+# CHECK-NEXT:         Kind:            FUNCTION
+# CHECK-NEXT:         Index:           2
+# CHECK-NEXT:       - Name:            call_direct
+# CHECK-NEXT:         Kind:            FUNCTION
+# CHECK-NEXT:         Index:           3
+# CHECK-NEXT:       - Name:            call_alias
+# CHECK-NEXT:         Kind:            FUNCTION
+# CHECK-NEXT:         Index:           4
+# CHECK-NEXT:       - Name:            call_alias_ptr
+# CHECK-NEXT:         Kind:            FUNCTION
+# CHECK-NEXT:         Index:           5
+# CHECK-NEXT:       - Name:            call_direct_ptr
+# CHECK-NEXT:         Kind:            FUNCTION
+# CHECK-NEXT:         Index:           6
+# CHECK-NEXT:   - Type:            ELEM
+# CHECK-NEXT:     Segments:
+# CHECK-NEXT:       - Offset:
+# CHECK-NEXT:           Opcode:          I32_CONST
+# CHECK-NEXT:           Value:           1
+# CHECK-NEXT:         Functions:       [ 0, 2 ]
+# CHECK-NEXT:   - Type:            CODE
+# CHECK-NEXT:     Functions:
+# CHECK-NEXT:       - Index:           0
+# CHECK-NEXT:         Locals:
+# CHECK-NEXT:         Body:            41010B
+# CHECK-NEXT:       - Index:           1
+# CHECK-NEXT:         Locals:
+# CHECK-NEXT:         Body:            1080808080001A0B
+# CHECK-NEXT:       - Index:           2
+# CHECK-NEXT:         Locals:
+# CHECK-NEXT:         Body:            41000B
+# CHECK-NEXT:       - Index:           3
+# CHECK-NEXT:         Locals:
+# CHECK-NEXT:         Body:            1082808080000B
+# CHECK-NEXT:       - Index:           4
+# CHECK-NEXT:         Locals:
+# CHECK-NEXT:         Body:            1080808080000B
+# CHECK-NEXT:       - Index:           5
+# CHECK-NEXT:         Locals:
+# CHECK-NEXT:         Body:            41818080800011808080800080808080000B
+# CHECK-NEXT:       - Index:           6
+# CHECK-NEXT:         Locals:
+# CHECK-NEXT:         Body:            41828080800011808080800080808080000B
+# CHECK-NEXT:   - Type:            CUSTOM
+# CHECK-NEXT:     Name:            name
+# CHECK-NEXT:     FunctionNames:
+# CHECK-NEXT:       - Index:           0
+# CHECK-NEXT:         Name:            alias_fn
+# CHECK-NEXT:       - Index:           1
+# CHECK-NEXT:         Name:            _start
+# CHECK-NEXT:       - Index:           2
+# CHECK-NEXT:         Name:            direct_fn
+# CHECK-NEXT:       - Index:           3
+# CHECK-NEXT:         Name:            call_direct
+# CHECK-NEXT:       - Index:           4
+# CHECK-NEXT:         Name:            call_alias
+# CHECK-NEXT:       - Index:           5
+# CHECK-NEXT:         Name:            call_alias_ptr
+# CHECK-NEXT:       - Index:           6
+# CHECK-NEXT:         Name:            call_direct_ptr
+# CHECK-NEXT:     GlobalNames:
+# CHECK-NEXT:       - Index:           0
+# CHECK-NEXT:         Name:            __stack_pointer
+# CHECK-NEXT: ...

diff  --git a/lld/test/wasm/weak-alias.ll b/lld/test/wasm/weak-alias.ll
deleted file mode 100644
index 86e42a788b492..0000000000000
--- a/lld/test/wasm/weak-alias.ll
+++ /dev/null
@@ -1,303 +0,0 @@
-; RUN: llc -mcpu=mvp -filetype=obj -o %t.o %s
-; RUN: llc -mcpu=mvp -filetype=obj %S/Inputs/weak-alias.ll -o %t2.o
-; RUN: wasm-ld --export-dynamic %t.o %t2.o -o %t.wasm
-; RUN: obj2yaml %t.wasm | FileCheck %s
-
-; Test that weak aliases (alias_fn is a weak alias of direct_fn) are linked correctly
-
-target triple = "wasm32-unknown-unknown"
-
-declare i32 @alias_fn() local_unnamed_addr #1
-
-; Function Attrs: nounwind uwtable
-define void @_start() local_unnamed_addr #1 {
-entry:
-  %call = tail call i32 @alias_fn() #2
-  ret void
-}
-
-; CHECK:      --- !WASM
-; CHECK-NEXT: FileHeader:
-; CHECK-NEXT:   Version:         0x1
-; CHECK-NEXT: Sections:
-; CHECK-NEXT:   - Type:            TYPE
-; CHECK-NEXT:     Signatures:
-; CHECK-NEXT:       - Index:           0
-; CHECK-NEXT:         ParamTypes:
-; CHECK-NEXT:         ReturnTypes:     []
-; CHECK-NEXT:       - Index:           1
-; CHECK-NEXT:         ParamTypes:      []
-; CHECK-NEXT:         ReturnTypes:
-; CHECK-NEXT:           - I32
-; CHECK-NEXT:   - Type:            FUNCTION
-; CHECK-NEXT:     FunctionTypes:   [ 0, 1, 1, 1, 1, 1 ]
-; CHECK-NEXT:   - Type:            TABLE
-; CHECK-NEXT:     Tables:
-; CHECK-NEXT:       - Index:           0
-; CHECK-NEXT:         ElemType:        FUNCREF
-; CHECK-NEXT:         Limits:
-; CHECK-NEXT:           Flags:           [ HAS_MAX ]
-; CHECK-NEXT:           Minimum:         0x2
-; CHECK-NEXT:           Maximum:         0x2
-; CHECK-NEXT:   - Type:            MEMORY
-; CHECK-NEXT:     Memories:
-; CHECK-NEXT:       - Minimum:         0x1
-; CHECK-NEXT:   - Type:            GLOBAL
-; CHECK-NEXT:     Globals:
-; CHECK-NEXT:       - Index:           0
-; CHECK-NEXT:         Type:            I32
-; CHECK-NEXT:         Mutable:         true
-; CHECK-NEXT:         InitExpr:
-; CHECK-NEXT:           Opcode:          I32_CONST
-; CHECK-NEXT:           Value:           65536
-; CHECK-NEXT:   - Type:            EXPORT
-; CHECK-NEXT:     Exports:
-; CHECK-NEXT:       - Name:            memory
-; CHECK-NEXT:         Kind:            MEMORY
-; CHECK-NEXT:         Index:           0
-; CHECK-NEXT:       - Name:            _start
-; CHECK-NEXT:         Kind:            FUNCTION
-; CHECK-NEXT:         Index:           0
-; CHECK-NEXT:       - Name:            alias_fn
-; CHECK-NEXT:         Kind:            FUNCTION
-; CHECK-NEXT:         Index:           1
-; CHECK-NEXT:       - Name:            direct_fn
-; CHECK-NEXT:         Kind:            FUNCTION
-; CHECK-NEXT:         Index:           1
-; CHECK-NEXT:       - Name:            call_direct
-; CHECK-NEXT:         Kind:            FUNCTION
-; CHECK-NEXT:         Index:           2
-; CHECK-NEXT:       - Name:            call_alias
-; CHECK-NEXT:         Kind:            FUNCTION
-; CHECK-NEXT:         Index:           3
-; CHECK-NEXT:       - Name:            call_alias_ptr
-; CHECK-NEXT:         Kind:            FUNCTION
-; CHECK-NEXT:         Index:           4
-; CHECK-NEXT:       - Name:            call_direct_ptr
-; CHECK-NEXT:         Kind:            FUNCTION
-; CHECK-NEXT:         Index:           5
-; CHECK-NEXT:   - Type:            ELEM
-; CHECK-NEXT:     Segments:
-; CHECK-NEXT:       - Offset:
-; CHECK-NEXT:           Opcode:          I32_CONST
-; CHECK-NEXT:           Value:           1
-; CHECK-NEXT:         Functions:       [ 1 ]
-; CHECK-NEXT:   - Type:            CODE
-; CHECK-NEXT:     Functions:
-; CHECK-NEXT:       - Index:           0
-; CHECK-NEXT:         Locals:
-; CHECK-NEXT:         Body:            1081808080001A0B
-; CHECK-NEXT:       - Index:           1
-; CHECK-NEXT:         Locals:
-; CHECK-NEXT:         Body:            41000B
-; CHECK-NEXT:       - Index:           2
-; CHECK-NEXT:         Locals:
-; CHECK-NEXT:         Body:            1081808080000B
-; CHECK-NEXT:       - Index:           3
-; CHECK-NEXT:         Locals:
-; CHECK-NEXT:         Body:            1081808080000B
-; CHECK-NEXT:       - Index:           4
-; CHECK-NEXT:         Locals:
-; CHECK-NEXT:           - Type:            I32
-; CHECK-NEXT:             Count:           2
-; CHECK-NEXT:         Body:            23808080800041106B220024808080800020004181808080003602081081808080002101200041106A24808080800020010B
-; CHECK-NEXT:       - Index:           5
-; CHECK-NEXT:         Locals:
-; CHECK-NEXT:           - Type:            I32
-; CHECK-NEXT:             Count:           2
-; CHECK-NEXT:         Body:            23808080800041106B220024808080800020004181808080003602081081808080002101200041106A24808080800020010B
-; CHECK-NEXT:   - Type:            CUSTOM
-; CHECK-NEXT:     HeaderSecSizeEncodingLen: 2
-; CHECK-NEXT:     Name:            name
-; CHECK-NEXT:     FunctionNames:
-; CHECK-NEXT:       - Index:           0
-; CHECK-NEXT:         Name:            _start
-; CHECK-NEXT:       - Index:           1
-; CHECK-NEXT:         Name:            direct_fn
-; CHECK-NEXT:       - Index:           2
-; CHECK-NEXT:         Name:            call_direct
-; CHECK-NEXT:       - Index:           3
-; CHECK-NEXT:         Name:            call_alias
-; CHECK-NEXT:       - Index:           4
-; CHECK-NEXT:         Name:            call_alias_ptr
-; CHECK-NEXT:       - Index:           5
-; CHECK-NEXT:         Name:            call_direct_ptr
-; CHECK-NEXT:     GlobalNames:
-; CHECK-NEXT:       - Index:           0
-; CHECK-NEXT:         Name:            __stack_pointer
-; CHECK-NEXT: ...
-
-; RUN: wasm-ld --relocatable %t.o %t2.o -o %t.reloc.o
-; RUN: obj2yaml %t.reloc.o | FileCheck %s -check-prefix=RELOC
-
-; RELOC:      --- !WASM
-; RELOC-NEXT: FileHeader:
-; RELOC-NEXT:   Version:         0x1
-; RELOC-NEXT: Sections:
-; RELOC-NEXT:   - Type:            TYPE
-; RELOC-NEXT:     Signatures:
-; RELOC-NEXT:       - Index:           0
-; RELOC-NEXT:         ParamTypes:      []
-; RELOC-NEXT:         ReturnTypes:     []
-; RELOC-NEXT:       - Index:           1
-; RELOC-NEXT:         ParamTypes:      []
-; RELOC-NEXT:         ReturnTypes:
-; RELOC-NEXT:           - I32
-; RELOC-NEXT:   - Type:            IMPORT
-; RELOC-NEXT:     Imports:
-; RELOC-NEXT:       - Module:          env
-; RELOC-NEXT:         Field:           __indirect_function_table
-; RELOC-NEXT:         Kind:            TABLE
-; RELOC-NEXT:         Table:
-; RELOC-NEXT:           Index:           0
-; RELOC-NEXT:           ElemType:        FUNCREF
-; RELOC-NEXT:           Limits:
-; RELOC-NEXT:             Minimum:         0x2
-; RELOC-NEXT:       - Module:          env
-; RELOC-NEXT:         Field:           __stack_pointer
-; RELOC-NEXT:         Kind:            GLOBAL
-; RELOC-NEXT:         GlobalType:      I32
-; RELOC-NEXT:         GlobalMutable:   true
-; RELOC-NEXT:   - Type:            FUNCTION
-; RELOC-NEXT:     FunctionTypes:   [ 0, 1, 1, 1, 1, 1 ]
-; RELOC-NEXT:   - Type:            MEMORY
-; RELOC-NEXT:     Memories:
-; RELOC-NEXT:       - Minimum:         0x0
-; RELOC-NEXT:   - Type:            ELEM
-; RELOC-NEXT:     Segments:
-; RELOC-NEXT:       - Offset:
-; RELOC-NEXT:           Opcode:          I32_CONST
-; RELOC-NEXT:           Value:           1
-; RELOC-NEXT:         Functions:       [ 1 ]
-; RELOC-NEXT:   - Type:            CODE
-; RELOC-NEXT:     Relocations:
-; RELOC-NEXT:       - Type:            R_WASM_FUNCTION_INDEX_LEB
-; RELOC-NEXT:         Index:           1
-; RELOC-NEXT:         Offset:          0x4
-; RELOC-NEXT:       - Type:            R_WASM_FUNCTION_INDEX_LEB
-; RELOC-NEXT:         Index:           2
-; RELOC-NEXT:         Offset:          0x13
-; RELOC-NEXT:       - Type:            R_WASM_FUNCTION_INDEX_LEB
-; RELOC-NEXT:         Index:           1
-; RELOC-NEXT:         Offset:          0x1C
-; RELOC-NEXT:       - Type:            R_WASM_GLOBAL_INDEX_LEB
-; RELOC-NEXT:         Index:           6
-; RELOC-NEXT:         Offset:          0x27
-; RELOC-NEXT:       - Type:            R_WASM_GLOBAL_INDEX_LEB
-; RELOC-NEXT:         Index:           6
-; RELOC-NEXT:         Offset:          0x32
-; RELOC-NEXT:       - Type:            R_WASM_TABLE_INDEX_SLEB
-; RELOC-NEXT:         Index:           1
-; RELOC-NEXT:         Offset:          0x3A
-; RELOC-NEXT:       - Type:            R_WASM_FUNCTION_INDEX_LEB
-; RELOC-NEXT:         Index:           1
-; RELOC-NEXT:         Offset:          0x43
-; RELOC-NEXT:       - Type:            R_WASM_GLOBAL_INDEX_LEB
-; RELOC-NEXT:         Index:           6
-; RELOC-NEXT:         Offset:          0x50
-; RELOC-NEXT:       - Type:            R_WASM_GLOBAL_INDEX_LEB
-; RELOC-NEXT:         Index:           6
-; RELOC-NEXT:         Offset:          0x5D
-; RELOC-NEXT:       - Type:            R_WASM_GLOBAL_INDEX_LEB
-; RELOC-NEXT:         Index:           6
-; RELOC-NEXT:         Offset:          0x68
-; RELOC-NEXT:       - Type:            R_WASM_TABLE_INDEX_SLEB
-; RELOC-NEXT:         Index:           2
-; RELOC-NEXT:         Offset:          0x70
-; RELOC-NEXT:       - Type:            R_WASM_FUNCTION_INDEX_LEB
-; RELOC-NEXT:         Index:           2
-; RELOC-NEXT:         Offset:          0x79
-; RELOC-NEXT:       - Type:            R_WASM_GLOBAL_INDEX_LEB
-; RELOC-NEXT:         Index:           6
-; RELOC-NEXT:         Offset:          0x86
-; RELOC-NEXT:     Functions:
-; RELOC-NEXT:       - Index:           0
-; RELOC-NEXT:         Locals:
-; RELOC-NEXT:         Body:            1081808080001A0B
-; RELOC-NEXT:       - Index:           1
-; RELOC-NEXT:         Locals:
-; RELOC-NEXT:         Body:            41000B
-; RELOC-NEXT:       - Index:           2
-; RELOC-NEXT:         Locals:
-; RELOC-NEXT:         Body:            1081808080000B
-; RELOC-NEXT:       - Index:           3
-; RELOC-NEXT:         Locals:
-; RELOC-NEXT:         Body:            1081808080000B
-; RELOC-NEXT:       - Index:           4
-; RELOC-NEXT:         Locals:
-; RELOC-NEXT:           - Type:            I32
-; RELOC-NEXT:             Count:           2
-; RELOC-NEXT:         Body:            23808080800041106B220024808080800020004181808080003602081081808080002101200041106A24808080800020010B
-; RELOC-NEXT:       - Index:           5
-; RELOC-NEXT:         Locals:
-; RELOC-NEXT:           - Type:            I32
-; RELOC-NEXT:             Count:           2
-; RELOC-NEXT:         Body:            23808080800041106B220024808080800020004181808080003602081081808080002101200041106A24808080800020010B
-; RELOC-NEXT:   - Type:            CUSTOM
-; RELOC-NEXT:     Name:            linking
-; RELOC-NEXT:     Version:         2
-; RELOC-NEXT:     SymbolTable:
-; RELOC-NEXT:       - Index:           0
-; RELOC-NEXT:         Kind:            FUNCTION
-; RELOC-NEXT:         Name:            _start
-; RELOC-NEXT:         Flags:           [  ]
-; RELOC-NEXT:         Function:        0
-; RELOC-NEXT:       - Index:           1
-; RELOC-NEXT:         Kind:            FUNCTION
-; RELOC-NEXT:         Name:            alias_fn
-; RELOC-NEXT:         Flags:           [ BINDING_WEAK ]
-; RELOC-NEXT:         Function:        1
-; RELOC-NEXT:       - Index:           2
-; RELOC-NEXT:         Kind:            FUNCTION
-; RELOC-NEXT:         Name:            direct_fn
-; RELOC-NEXT:         Flags:           [  ]
-; RELOC-NEXT:         Function:        1
-; RELOC-NEXT:       - Index:           3
-; RELOC-NEXT:         Kind:            FUNCTION
-; RELOC-NEXT:         Name:            call_direct
-; RELOC-NEXT:         Flags:           [  ]
-; RELOC-NEXT:         Function:        2
-; RELOC-NEXT:       - Index:           4
-; RELOC-NEXT:         Kind:            FUNCTION
-; RELOC-NEXT:         Name:            call_alias
-; RELOC-NEXT:         Flags:           [  ]
-; RELOC-NEXT:         Function:        3
-; RELOC-NEXT:       - Index:           5
-; RELOC-NEXT:         Kind:            FUNCTION
-; RELOC-NEXT:         Name:            call_alias_ptr
-; RELOC-NEXT:         Flags:           [  ]
-; RELOC-NEXT:         Function:        4
-; RELOC-NEXT:       - Index:           6
-; RELOC-NEXT:         Kind:            GLOBAL
-; RELOC-NEXT:         Name:            __stack_pointer
-; RELOC-NEXT:         Flags:           [ UNDEFINED ]
-; RELOC-NEXT:         Global:          0
-; RELOC-NEXT:       - Index:           7
-; RELOC-NEXT:         Kind:            FUNCTION
-; RELOC-NEXT:         Name:            call_direct_ptr
-; RELOC-NEXT:         Flags:           [  ]
-; RELOC-NEXT:         Function:        5
-; RELOC-NEXT:       - Index:           8
-; RELOC-NEXT:         Kind:            TABLE
-; RELOC-NEXT:         Name:            __indirect_function_table
-; RELOC-NEXT:         Flags:           [ UNDEFINED, NO_STRIP ]
-; RELOC-NEXT:         Table:           0
-; RELOC-NEXT:   - Type:            CUSTOM
-; RELOC-NEXT:     Name:            name
-; RELOC-NEXT:     FunctionNames:
-; RELOC-NEXT:       - Index:           0
-; RELOC-NEXT:         Name:            _start
-; RELOC-NEXT:       - Index:           1
-; RELOC-NEXT:         Name:            direct_fn
-; RELOC-NEXT:       - Index:           2
-; RELOC-NEXT:         Name:            call_direct
-; RELOC-NEXT:       - Index:           3
-; RELOC-NEXT:         Name:            call_alias
-; RELOC-NEXT:       - Index:           4
-; RELOC-NEXT:         Name:            call_alias_ptr
-; RELOC-NEXT:       - Index:           5
-; RELOC-NEXT:         Name:            call_direct_ptr
-; RELOC-NEXT:     GlobalNames:
-; RELOC-NEXT:       - Index:           0
-; RELOC-NEXT:         Name:            __stack_pointer
-; RELOC-NEXT: ...

diff  --git a/lld/test/wasm/weak-alias.s b/lld/test/wasm/weak-alias.s
new file mode 100644
index 0000000000000..22e84bf0e37a6
--- /dev/null
+++ b/lld/test/wasm/weak-alias.s
@@ -0,0 +1,268 @@
+# RUN: llvm-mc -filetype=obj -triple=wasm32-unknown-unknown -o %t.o %s
+# RUN: llvm-mc -filetype=obj -triple=wasm32-unknown-unknown -o %t2.o %S/Inputs/weak-alias.s
+# RUN: wasm-ld --export-dynamic %t.o %t2.o -o %t.wasm
+# RUN: obj2yaml %t.wasm | FileCheck %s
+
+# Test that weak aliases (alias_fn is a weak alias of direct_fn) are linked correctly
+
+.functype alias_fn () -> (i32)
+
+.globl _start
+_start:
+  .functype _start () -> ()
+  call alias_fn
+  drop
+  end_function
+
+# CHECK:      --- !WASM
+# CHECK-NEXT: FileHeader:
+# CHECK-NEXT:   Version:         0x1
+# CHECK-NEXT: Sections:
+# CHECK-NEXT:   - Type:            TYPE
+# CHECK-NEXT:     Signatures:
+# CHECK-NEXT:       - Index:           0
+# CHECK-NEXT:         ParamTypes:
+# CHECK-NEXT:         ReturnTypes:
+# CHECK-NEXT:           - I32
+# CHECK-NEXT:       - Index:           1
+# CHECK-NEXT:         ParamTypes:      []
+# CHECK-NEXT:         ReturnTypes:     []
+# CHECK-NEXT:   - Type:            FUNCTION
+# CHECK-NEXT:     FunctionTypes:   [ 1, 0, 0, 0, 0, 0 ]
+# CHECK-NEXT:   - Type:            TABLE
+# CHECK-NEXT:     Tables:
+# CHECK-NEXT:       - Index:           0
+# CHECK-NEXT:         ElemType:        FUNCREF
+# CHECK-NEXT:         Limits:
+# CHECK-NEXT:           Flags:           [ HAS_MAX ]
+# CHECK-NEXT:           Minimum:         0x2
+# CHECK-NEXT:           Maximum:         0x2
+# CHECK-NEXT:   - Type:            MEMORY
+# CHECK-NEXT:     Memories:
+# CHECK-NEXT:       - Minimum:         0x1
+# CHECK-NEXT:   - Type:            GLOBAL
+# CHECK-NEXT:     Globals:
+# CHECK-NEXT:       - Index:           0
+# CHECK-NEXT:         Type:            I32
+# CHECK-NEXT:         Mutable:         true
+# CHECK-NEXT:         InitExpr:
+# CHECK-NEXT:           Opcode:          I32_CONST
+# CHECK-NEXT:           Value:           65536
+# CHECK-NEXT:   - Type:            EXPORT
+# CHECK-NEXT:     Exports:
+# CHECK-NEXT:       - Name:            memory
+# CHECK-NEXT:         Kind:            MEMORY
+# CHECK-NEXT:         Index:           0
+# CHECK-NEXT:       - Name:            _start
+# CHECK-NEXT:         Kind:            FUNCTION
+# CHECK-NEXT:         Index:           0
+# CHECK-NEXT:       - Name:            alias_fn
+# CHECK-NEXT:         Kind:            FUNCTION
+# CHECK-NEXT:         Index:           1
+# CHECK-NEXT:       - Name:            direct_fn
+# CHECK-NEXT:         Kind:            FUNCTION
+# CHECK-NEXT:         Index:           1
+# CHECK-NEXT:       - Name:            call_direct
+# CHECK-NEXT:         Kind:            FUNCTION
+# CHECK-NEXT:         Index:           2
+# CHECK-NEXT:       - Name:            call_alias
+# CHECK-NEXT:         Kind:            FUNCTION
+# CHECK-NEXT:         Index:           3
+# CHECK-NEXT:       - Name:            call_alias_ptr
+# CHECK-NEXT:         Kind:            FUNCTION
+# CHECK-NEXT:         Index:           4
+# CHECK-NEXT:       - Name:            call_direct_ptr
+# CHECK-NEXT:         Kind:            FUNCTION
+# CHECK-NEXT:         Index:           5
+# CHECK-NEXT:   - Type:            ELEM
+# CHECK-NEXT:     Segments:
+# CHECK-NEXT:       - Offset:
+# CHECK-NEXT:           Opcode:          I32_CONST
+# CHECK-NEXT:           Value:           1
+# CHECK-NEXT:         Functions:       [ 1 ]
+# CHECK-NEXT:   - Type:            CODE
+# CHECK-NEXT:     Functions:
+# CHECK-NEXT:       - Index:           0
+# CHECK-NEXT:         Locals:
+# CHECK-NEXT:         Body:            1081808080001A0B
+# CHECK-NEXT:       - Index:           1
+# CHECK-NEXT:         Locals:
+# CHECK-NEXT:         Body:            41000B
+# CHECK-NEXT:       - Index:           2
+# CHECK-NEXT:         Locals:
+# CHECK-NEXT:         Body:            1081808080000B
+# CHECK-NEXT:       - Index:           3
+# CHECK-NEXT:         Locals:
+# CHECK-NEXT:         Body:            1081808080000B
+# CHECK-NEXT:       - Index:           4
+# CHECK-NEXT:         Locals:
+# CHECK-NEXT:         Body:            41818080800011808080800080808080000B
+# CHECK-NEXT:       - Index:           5
+# CHECK-NEXT:         Locals:
+# CHECK-NEXT:         Body:            41818080800011808080800080808080000B
+# CHECK-NEXT:   - Type:            CUSTOM
+# CHECK-NEXT:     HeaderSecSizeEncodingLen: 2
+# CHECK-NEXT:     Name:            name
+# CHECK-NEXT:     FunctionNames:
+# CHECK-NEXT:       - Index:           0
+# CHECK-NEXT:         Name:            _start
+# CHECK-NEXT:       - Index:           1
+# CHECK-NEXT:         Name:            direct_fn
+# CHECK-NEXT:       - Index:           2
+# CHECK-NEXT:         Name:            call_direct
+# CHECK-NEXT:       - Index:           3
+# CHECK-NEXT:         Name:            call_alias
+# CHECK-NEXT:       - Index:           4
+# CHECK-NEXT:         Name:            call_alias_ptr
+# CHECK-NEXT:       - Index:           5
+# CHECK-NEXT:         Name:            call_direct_ptr
+# CHECK-NEXT:     GlobalNames:
+# CHECK-NEXT:       - Index:           0
+# CHECK-NEXT:         Name:            __stack_pointer
+# CHECK-NEXT: ...
+
+# RUN: wasm-ld --relocatable %t.o %t2.o -o %t.reloc.o
+# RUN: obj2yaml %t.reloc.o | FileCheck %s -check-prefix=RELOC
+
+# RELOC:      --- !WASM
+# RELOC-NEXT: FileHeader:
+# RELOC-NEXT:   Version:         0x1
+# RELOC-NEXT: Sections:
+# RELOC-NEXT:   - Type:            TYPE
+# RELOC-NEXT:     Signatures:
+# RELOC-NEXT:       - Index:           0
+# RELOC-NEXT:         ParamTypes:      []
+# RELOC-NEXT:         ReturnTypes:
+# RELOC-NEXT:           - I32
+# RELOC-NEXT:       - Index:           1
+# RELOC-NEXT:         ParamTypes:      []
+# RELOC-NEXT:         ReturnTypes:     []
+# RELOC-NEXT:   - Type:            IMPORT
+# RELOC-NEXT:     Imports:
+# RELOC-NEXT:       - Module:          env
+# RELOC-NEXT:         Field:           __indirect_function_table
+# RELOC-NEXT:         Kind:            TABLE
+# RELOC-NEXT:         Table:
+# RELOC-NEXT:           Index:           0
+# RELOC-NEXT:           ElemType:        FUNCREF
+# RELOC-NEXT:           Limits:
+# RELOC-NEXT:             Minimum:         0x2
+# RELOC-NEXT:   - Type:            FUNCTION
+# RELOC-NEXT:     FunctionTypes:   [ 1, 0, 0, 0, 0, 0 ]
+# RELOC-NEXT:   - Type:            MEMORY
+# RELOC-NEXT:     Memories:
+# RELOC-NEXT:       - Minimum:         0x0
+# RELOC-NEXT:   - Type:            ELEM
+# RELOC-NEXT:     Segments:
+# RELOC-NEXT:       - Offset:
+# RELOC-NEXT:           Opcode:          I32_CONST
+# RELOC-NEXT:           Value:           1
+# RELOC-NEXT:         Functions:       [ 1 ]
+# RELOC-NEXT:   - Type:            CODE
+# RELOC-NEXT:     Relocations:
+# RELOC-NEXT:       - Type:            R_WASM_FUNCTION_INDEX_LEB
+# RELOC-NEXT:         Index:           1
+# RELOC-NEXT:         Offset:          0x4
+# RELOC-NEXT:       - Type:            R_WASM_FUNCTION_INDEX_LEB
+# RELOC-NEXT:         Index:           2
+# RELOC-NEXT:         Offset:          0x13
+# RELOC-NEXT:       - Type:            R_WASM_FUNCTION_INDEX_LEB
+# RELOC-NEXT:         Index:           1
+# RELOC-NEXT:         Offset:          0x1C
+# RELOC-NEXT:       - Type:            R_WASM_TABLE_INDEX_SLEB
+# RELOC-NEXT:         Index:           1
+# RELOC-NEXT:         Offset:          0x25
+# RELOC-NEXT:       - Type:            R_WASM_TYPE_INDEX_LEB
+# RELOC-NEXT:         Index:           0
+# RELOC-NEXT:         Offset:          0x2B
+# RELOC-NEXT:       - Type:            R_WASM_TABLE_NUMBER_LEB
+# RELOC-NEXT:         Index:           6
+# RELOC-NEXT:         Offset:          0x30
+# RELOC-NEXT:       - Type:            R_WASM_TABLE_INDEX_SLEB
+# RELOC-NEXT:         Index:           2
+# RELOC-NEXT:         Offset:          0x39
+# RELOC-NEXT:       - Type:            R_WASM_TYPE_INDEX_LEB
+# RELOC-NEXT:         Index:           0
+# RELOC-NEXT:         Offset:          0x3F
+# RELOC-NEXT:       - Type:            R_WASM_TABLE_NUMBER_LEB
+# RELOC-NEXT:         Index:           6
+# RELOC-NEXT:         Offset:          0x44
+# RELOC-NEXT:     Functions:
+# RELOC-NEXT:       - Index:           0
+# RELOC-NEXT:         Locals:
+# RELOC-NEXT:         Body:            1081808080001A0B
+# RELOC-NEXT:       - Index:           1
+# RELOC-NEXT:         Locals:
+# RELOC-NEXT:         Body:            41000B
+# RELOC-NEXT:       - Index:           2
+# RELOC-NEXT:         Locals:
+# RELOC-NEXT:         Body:            1081808080000B
+# RELOC-NEXT:       - Index:           3
+# RELOC-NEXT:         Locals:
+# RELOC-NEXT:         Body:            1081808080000B
+# RELOC-NEXT:       - Index:           4
+# RELOC-NEXT:         Locals:
+# RELOC-NEXT:         Body:            41818080800011808080800080808080000B
+# RELOC-NEXT:       - Index:           5
+# RELOC-NEXT:         Locals:
+# RELOC-NEXT:         Body:            41818080800011808080800080808080000B
+# RELOC-NEXT:   - Type:            CUSTOM
+# RELOC-NEXT:     Name:            linking
+# RELOC-NEXT:     Version:         2
+# RELOC-NEXT:     SymbolTable:
+# RELOC-NEXT:       - Index:           0
+# RELOC-NEXT:         Kind:            FUNCTION
+# RELOC-NEXT:         Name:            _start
+# RELOC-NEXT:         Flags:           [  ]
+# RELOC-NEXT:         Function:        0
+# RELOC-NEXT:       - Index:           1
+# RELOC-NEXT:         Kind:            FUNCTION
+# RELOC-NEXT:         Name:            alias_fn
+# RELOC-NEXT:         Flags:           [ BINDING_WEAK ]
+# RELOC-NEXT:         Function:        1
+# RELOC-NEXT:       - Index:           2
+# RELOC-NEXT:         Kind:            FUNCTION
+# RELOC-NEXT:         Name:            direct_fn
+# RELOC-NEXT:         Flags:           [  ]
+# RELOC-NEXT:         Function:        1
+# RELOC-NEXT:       - Index:           3
+# RELOC-NEXT:         Kind:            FUNCTION
+# RELOC-NEXT:         Name:            call_direct
+# RELOC-NEXT:         Flags:           [  ]
+# RELOC-NEXT:         Function:        2
+# RELOC-NEXT:       - Index:           4
+# RELOC-NEXT:         Kind:            FUNCTION
+# RELOC-NEXT:         Name:            call_alias
+# RELOC-NEXT:         Flags:           [  ]
+# RELOC-NEXT:         Function:        3
+# RELOC-NEXT:       - Index:           5
+# RELOC-NEXT:         Kind:            FUNCTION
+# RELOC-NEXT:         Name:            call_alias_ptr
+# RELOC-NEXT:         Flags:           [  ]
+# RELOC-NEXT:         Function:        4
+# RELOC-NEXT:       - Index:           6
+# RELOC-NEXT:         Kind:            TABLE
+# RELOC-NEXT:         Name:            __indirect_function_table
+# RELOC-NEXT:         Flags:           [ UNDEFINED, NO_STRIP ]
+# RELOC-NEXT:         Table:           0
+# RELOC-NEXT:       - Index:           7
+# RELOC-NEXT:         Kind:            FUNCTION
+# RELOC-NEXT:         Name:            call_direct_ptr
+# RELOC-NEXT:         Flags:           [  ]
+# RELOC-NEXT:         Function:        5
+# RELOC-NEXT:   - Type:            CUSTOM
+# RELOC-NEXT:     Name:            name
+# RELOC-NEXT:     FunctionNames:
+# RELOC-NEXT:       - Index:           0
+# RELOC-NEXT:         Name:            _start
+# RELOC-NEXT:       - Index:           1
+# RELOC-NEXT:         Name:            direct_fn
+# RELOC-NEXT:       - Index:           2
+# RELOC-NEXT:         Name:            call_direct
+# RELOC-NEXT:       - Index:           3
+# RELOC-NEXT:         Name:            call_alias
+# RELOC-NEXT:       - Index:           4
+# RELOC-NEXT:         Name:            call_alias_ptr
+# RELOC-NEXT:       - Index:           5
+# RELOC-NEXT:         Name:            call_direct_ptr
+# RELOC-NEXT: ...


        


More information about the llvm-commits mailing list