xref: /llvm-project/lld/test/wasm/tls-non-shared-memory.s (revision 1c1fbf51b5ec9657e5da7fa94ee892273255544a)
18544b40bSSam Clegg# Test that linking without shared memory causes __tls_base to be
2ef8c9135SSam Clegg# internalized.
38544b40bSSam Clegg
48544b40bSSam Clegg# RUN: llvm-mc -filetype=obj -triple=wasm32-unknown-unknown -o %t.o %s
58544b40bSSam Clegg
68544b40bSSam Clegg.globaltype __tls_base, i32
78544b40bSSam Clegg
88544b40bSSam Clegg.globl get_tls1
98544b40bSSam Cleggget_tls1:
108544b40bSSam Clegg  .functype get_tls1 () -> (i32)
118544b40bSSam Clegg  global.get __tls_base
128544b40bSSam Clegg  i32.const tls1@TLSREL
138544b40bSSam Clegg  i32.add
148544b40bSSam Clegg  end_function
158544b40bSSam Clegg
16ef8c9135SSam Clegg.globl get_tls1_got
17ef8c9135SSam Cleggget_tls1_got:
18ef8c9135SSam Clegg  .functype get_tls1_got () -> (i32)
19ef8c9135SSam Clegg  global.get tls1@GOT@TLS
20ef8c9135SSam Clegg  end_function
21ef8c9135SSam Clegg
228544b40bSSam Clegg.section  .data.no_tls,"",@
238544b40bSSam Clegg.globl  no_tls
248544b40bSSam Clegg.p2align  2
258544b40bSSam Cleggno_tls:
268544b40bSSam Clegg  .int32  42
278544b40bSSam Clegg  .size no_tls, 4
288544b40bSSam Clegg
29ef8c9135SSam Clegg.section  .tdata.tls1,"T",@
308544b40bSSam Clegg.globl  tls1
318544b40bSSam Clegg.p2align  2
328544b40bSSam Cleggtls1:
338544b40bSSam Clegg  .int32  43
348544b40bSSam Clegg  .size tls1, 2
358544b40bSSam Clegg
368544b40bSSam Clegg.section  .custom_section.target_features,"",@
378544b40bSSam Clegg  .int8 2
388544b40bSSam Clegg  .int8 43
398544b40bSSam Clegg  .int8 7
408544b40bSSam Clegg  .ascii  "atomics"
418544b40bSSam Clegg  .int8 43
428544b40bSSam Clegg  .int8 11
438544b40bSSam Clegg  .ascii  "bulk-memory"
448544b40bSSam Clegg
458544b40bSSam Clegg# RUN: wasm-ld --no-gc-sections --no-entry -o %t.wasm %t.o
468544b40bSSam Clegg# RUN: obj2yaml %t.wasm | FileCheck %s
47*1c1fbf51SSam Clegg# RUN: llvm-objdump --disassemble-symbols=get_tls1 --no-show-raw-insn --no-leading-addr %t.wasm | FileCheck %s --check-prefixes DIS
488544b40bSSam Clegg
498544b40bSSam Clegg# RUN: wasm-ld --experimental-pic -shared -o %t.so %t.o
50d2a0ef98SSam Clegg# RUN: obj2yaml %t.so | FileCheck %s --check-prefixes=SHARED,PIC
518544b40bSSam Clegg
52182b72aaSSam Clegg# RUN: wasm-ld --experimental-pic --no-gc-sections --no-entry -pie -o %t-pie.wasm %t.o
53d2a0ef98SSam Clegg# RUN: obj2yaml %t-pie.wasm | FileCheck %s --check-prefixes=PIE,PIC
54182b72aaSSam Clegg
554690bf2eSSam Clegg# RUN: wasm-ld --experimental-pic --features=atomics,bulk-memory,extended-const --no-gc-sections --no-entry -pie -o %t-extended-const.wasm %t.o
564690bf2eSSam Clegg# RUN: obj2yaml %t-extended-const.wasm | FileCheck %s --check-prefixes=EXT-CONST
574690bf2eSSam Clegg
588544b40bSSam Clegg#      CHECK:   - Type:            GLOBAL
598544b40bSSam Clegg# __stack_pointer
608544b40bSSam Clegg# CHECK-NEXT:     Globals:
618544b40bSSam Clegg# CHECK-NEXT:       - Index:           0
628544b40bSSam Clegg# CHECK-NEXT:         Type:            I32
638544b40bSSam Clegg# CHECK-NEXT:         Mutable:         true
648544b40bSSam Clegg# CHECK-NEXT:         InitExpr:
658544b40bSSam Clegg# CHECK-NEXT:           Opcode:          I32_CONST
668544b40bSSam Clegg# CHECK-NEXT:           Value:           66576
678544b40bSSam Clegg# __tls_base
688544b40bSSam Clegg# CHECK-NEXT:       - Index:           1
698544b40bSSam Clegg# CHECK-NEXT:         Type:            I32
708544b40bSSam Clegg# CHECK-NEXT:         Mutable:         false
718544b40bSSam Clegg# CHECK-NEXT:         InitExpr:
728544b40bSSam Clegg# CHECK-NEXT:           Opcode:          I32_CONST
738544b40bSSam Clegg# CHECK-NEXT:           Value:           1024
74ef8c9135SSam Clegg# GOT.data.internal.tls1
75ef8c9135SSam Clegg# CHECK-NEXT:       - Index:           2
76ef8c9135SSam Clegg# CHECK-NEXT:         Type:            I32
77ef8c9135SSam Clegg# CHECK-NEXT:         Mutable:         false
78ef8c9135SSam Clegg# CHECK-NEXT:         InitExpr:
79ef8c9135SSam Clegg# CHECK-NEXT:           Opcode:          I32_CONST
80ef8c9135SSam Clegg# CHECK-NEXT:           Value:           1024
818544b40bSSam Clegg# CHECK-NEXT:   - Type:            EXPORT
828544b40bSSam Clegg
838544b40bSSam Clegg#      CHECK:  - Type:            DATA
848544b40bSSam Clegg# .data
858544b40bSSam Clegg# CHECK-NEXT:    Segments:
868544b40bSSam Clegg# CHECK-NEXT:      - SectionOffset:   7
878544b40bSSam Clegg# CHECK-NEXT:        InitFlags:       0
888544b40bSSam Clegg# CHECK-NEXT:        Offset:
898544b40bSSam Clegg# CHECK-NEXT:          Opcode:          I32_CONST
908544b40bSSam Clegg# CHECK-NEXT:          Value:           1024
918544b40bSSam Clegg# CHECK-NEXT:        Content:         2B000000
928544b40bSSam Clegg# .tdata
938544b40bSSam Clegg# CHECK-NEXT:      - SectionOffset:   17
948544b40bSSam Clegg# CHECK-NEXT:        InitFlags:       0
958544b40bSSam Clegg# CHECK-NEXT:        Offset:
968544b40bSSam Clegg# CHECK-NEXT:          Opcode:          I32_CONST
978544b40bSSam Clegg# CHECK-NEXT:          Value:           1028
988544b40bSSam Clegg# CHECK-NEXT:        Content:         2A000000
998544b40bSSam Clegg# CHECK-NEXT:  - Type:            CUSTOM
1008544b40bSSam Clegg
101*1c1fbf51SSam Clegg# The constant value here which we add to `__tls_base` should not be absolute
102*1c1fbf51SSam Clegg# but relative to `__tls_base`, in this case zero rather than 1024.
103*1c1fbf51SSam Clegg# DIS:      <get_tls1>:
104*1c1fbf51SSam Clegg# DIS-EMPTY:
105*1c1fbf51SSam Clegg# DIS-NEXT:  global.get 1
106*1c1fbf51SSam Clegg# DIS-NEXT:  i32.const 0
107*1c1fbf51SSam Clegg# DIS-NEXT:  i32.add
108*1c1fbf51SSam Clegg# DIS-NEXT:  end
1098544b40bSSam Clegg
1108544b40bSSam Clegg# In PIC mode we expect TLS data and non-TLS data to be merged into
1118544b40bSSam Clegg# a single segment which is initialized via the  __memory_base import
1128544b40bSSam Clegg
113d2a0ef98SSam Clegg#      SHARED:  - Type:            IMPORT
114d2a0ef98SSam Clegg# SHARED-NEXT:    Imports:
115d2a0ef98SSam Clegg# SHARED-NEXT:      - Module:          env
116d2a0ef98SSam Clegg# SHARED-NEXT:        Field:           memory
117d2a0ef98SSam Clegg# SHARED-NEXT:        Kind:            MEMORY
118d2a0ef98SSam Clegg# SHARED-NEXT:        Memory:
119d2a0ef98SSam Clegg# SHARED-NEXT:          Minimum:         0x1
120d2a0ef98SSam Clegg# SHARED-NEXT:      - Module:          env
121d2a0ef98SSam Clegg# SHARED-NEXT:        Field:           __memory_base
122d2a0ef98SSam Clegg# SHARED-NEXT:        Kind:            GLOBAL
123d2a0ef98SSam Clegg# SHARED-NEXT:        GlobalType:      I32
124d2a0ef98SSam Clegg
125d2a0ef98SSam Clegg# In SHARED mode we export the address of all data symbols.
126d2a0ef98SSam Clegg#      SHARED:   - Type:            EXPORT
127d2a0ef98SSam Clegg# SHARED-NEXT:     Exports:
128d2a0ef98SSam Clegg#      SHARED:     - Name:            tls1
129d2a0ef98SSam Clegg# SHARED-NEXT:       Kind:            GLOBAL
130d2a0ef98SSam Clegg#      SHARED:     - Name:            no_tls
131d2a0ef98SSam Clegg# SHARED-NEXT:       Kind:            GLOBAL
132d2a0ef98SSam Clegg
133d2a0ef98SSam Clegg# In PIE mode we don't export data address by default.
134d2a0ef98SSam Clegg#      PIE:   - Type:            EXPORT
135d2a0ef98SSam Clegg# PIE-NEXT:     Exports:
136d2a0ef98SSam Clegg# PIE-NEXT:       - Name:            memory
137d2a0ef98SSam Clegg# PIE-NEXT:         Kind:            MEMORY
138d2a0ef98SSam Clegg# PIE-NEXT:         Index:           0
139d2a0ef98SSam Clegg# PIE-NEXT:   - Type:
1408544b40bSSam Clegg
1418544b40bSSam Clegg# .tdata and .data are combined into single segment in PIC mode.
1428544b40bSSam Clegg#      PIC:  - Type:            DATA
1438544b40bSSam Clegg# PIC-NEXT:    Segments:
1448544b40bSSam Clegg# PIC-NEXT:      - SectionOffset:   6
1458544b40bSSam Clegg# PIC-NEXT:        InitFlags:       0
1468544b40bSSam Clegg# PIC-NEXT:        Offset:
1478544b40bSSam Clegg# PIC-NEXT:          Opcode:          GLOBAL_GET
148d2a0ef98SSam Clegg# PIC-NEXT:          Index:           {{\d*}}
1498544b40bSSam Clegg# PIC-NEXT:        Content:         2B0000002A000000
1508544b40bSSam Clegg# PIC-NEXT:  - Type:            CUSTOM
1514690bf2eSSam Clegg
1524690bf2eSSam Clegg# Unless we have extended-const, in which case the merging is not needed.
1534690bf2eSSam Clegg# The first segment is placed directly at `__memory_base` and the second
1544690bf2eSSam Clegg# one is offset from `__memory_base` using `i32.add` and a constant.
1554690bf2eSSam Clegg
1564690bf2eSSam Clegg#      EXT-CONST:  - Type:            DATA
1574690bf2eSSam Clegg# EXT-CONST-NEXT:    Segments:
1584690bf2eSSam Clegg# EXT-CONST-NEXT:      - SectionOffset:   6
1594690bf2eSSam Clegg# EXT-CONST-NEXT:        InitFlags:       0
1604690bf2eSSam Clegg# EXT-CONST-NEXT:        Offset:
1614690bf2eSSam Clegg# EXT-CONST-NEXT:          Opcode:          GLOBAL_GET
1624690bf2eSSam Clegg# EXT-CONST-NEXT:          Index:           1
1634690bf2eSSam Clegg# EXT-CONST-NEXT:        Content:         2B000000
1644690bf2eSSam Clegg# EXT-CONST-NEXT:      - SectionOffset:   18
1654690bf2eSSam Clegg# EXT-CONST-NEXT:        InitFlags:       0
1664690bf2eSSam Clegg# EXT-CONST-NEXT:        Offset:
1674690bf2eSSam Clegg# EXT-CONST-NEXT:          Extended:        true
1684690bf2eSSam Clegg# This instruction sequence decodes to:
1694690bf2eSSam Clegg# (global.get[0x23] 0x1 i32.const[0x41] 0x04 i32.add[0x6A] end[0x0b])
1704690bf2eSSam Clegg# EXT-CONST-NEXT:          Body:            230141046A0B
1714690bf2eSSam Clegg# EXT-CONST-NEXT:        Content:         2A000000
172