xref: /llvm-project/lld/test/wasm/weak-undefined.s (revision d65ed8cde0a2b595a36f031d65158b08e6421b4f)
1# Test that undefined weak externals (global_var) and (foo) don't cause
2# link failures and resolve to zero.
3
4# RUN: llvm-mc -filetype=obj -triple=wasm32-unknown-unknown -o %t.o %s
5# RUN: wasm-ld -strip-all %t.o -o %t.wasm
6# RUN: obj2yaml %t.wasm | FileCheck %s
7
8# Also verify test that strong references in another file do cause link
9# failure (See https://github.com/llvm/llvm-project/issues/60806)
10
11# RUN: llvm-mc -filetype=obj -triple=wasm32-unknown-unknown %p/Inputs/strong-refs.s -o %t-strong.o
12# RUN: not wasm-ld -strip-all %t.o %t-strong.o -o %t.wasm 2>&1 | FileCheck --check-prefix=ERROR %s
13# RUN: not wasm-ld -strip-all %t-strong.o %t.o -o %t.wasm 2>&1 | FileCheck --check-prefix=ERROR %s
14
15# ERROR: undefined symbol: global_var
16
17.functype foo () -> (i32)
18
19.globl  get_address_of_foo
20get_address_of_foo:
21  .functype get_address_of_foo () -> (i32)
22  i32.const foo
23  end_function
24
25.globl  get_address_of_global_var
26get_address_of_global_var:
27  .functype get_address_of_global_var () -> (i32)
28  i32.const global_var
29  end_function
30
31.globl  _start
32_start:
33  .functype _start () -> ()
34  call  get_address_of_global_var
35  drop
36  call  get_address_of_foo
37  drop
38  call  foo
39  drop
40  end_function
41
42.weak foo
43.weak global_var
44
45# CHECK:      --- !WASM
46# CHECK-NEXT: FileHeader:
47# CHECK-NEXT:   Version:         0x1
48# CHECK-NEXT: Sections:
49# CHECK-NEXT:   - Type:            TYPE
50# CHECK-NEXT:     Signatures:
51# CHECK-NEXT:       - Index:           0
52# CHECK-NEXT:         ParamTypes:      []
53# CHECK-NEXT:         ReturnTypes:
54# CHECK-NEXT:           - I32
55# CHECK-NEXT:       - Index:           1
56# CHECK-NEXT:         ParamTypes:      []
57# CHECK-NEXT:         ReturnTypes:     []
58# CHECK-NEXT:   - Type:            FUNCTION
59# CHECK-NEXT:     FunctionTypes:   [ 0, 0, 0, 1 ]
60# CHECK-NEXT:   - Type:            TABLE
61# CHECK-NEXT:     Tables:
62# CHECK-NEXT:       - Index:           0
63# CHECK-NEXT:         ElemType:        FUNCREF
64# CHECK-NEXT:         Limits:
65# CHECK-NEXT:           Flags:           [ HAS_MAX ]
66# CHECK-NEXT:           Minimum:         0x1
67# CHECK-NEXT:           Maximum:         0x1
68# CHECK-NEXT:   - Type:            MEMORY
69# CHECK-NEXT:     Memories:
70# CHECK-NEXT:       - Minimum:         0x2
71# CHECK-NEXT:   - Type:            GLOBAL
72# CHECK-NEXT:     Globals:
73# CHECK-NEXT:       - Index:           0
74# CHECK-NEXT:         Type:            I32
75# CHECK-NEXT:         Mutable:         true
76# CHECK-NEXT:         InitExpr:
77# CHECK-NEXT:           Opcode:          I32_CONST
78# CHECK-NEXT:           Value:           66560
79# CHECK-NEXT:   - Type:            EXPORT
80# CHECK-NEXT:     Exports:
81# CHECK-NEXT:       - Name:            memory
82# CHECK-NEXT:         Kind:            MEMORY
83# CHECK-NEXT:         Index:           0
84# CHECK-NEXT:       - Name:            _start
85# CHECK-NEXT:         Kind:            FUNCTION
86# CHECK-NEXT:         Index:           3
87# CHECK-NEXT:   - Type:            CODE
88# CHECK-NEXT:     Functions:
89# CHECK-NEXT:       - Index:           0
90# CHECK-NEXT:         Locals:
91# CHECK-NEXT:         Body:            000B
92# CHECK-NEXT:       - Index:           1
93# CHECK-NEXT:         Locals:
94# CHECK-NEXT:         Body:            4180808080000B
95# CHECK-NEXT:       - Index:           2
96# CHECK-NEXT:         Locals:
97# CHECK-NEXT:         Body:            4180808080000B
98# CHECK-NEXT:       - Index:           3
99# CHECK-NEXT:         Locals:
100# CHECK-NEXT:         Body:            1082808080001A1081808080001A1080808080001A0B
101# CHECK-NEXT: ...
102