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