[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