278 lines · plain
1; RUN: llc --mtriple=wasm32-unknown-unknown -filetype=obj %s -o %t.atomics.o -mattr=+atomics,-bulk-memory2; RUN: llc --mtriple=wasm32-unknown-unknown -filetype=obj %s -o %t.bulk-mem.o -mattr=+bulk-memory3; RUN: llc --mtriple=wasm64-unknown-unknown -filetype=obj %s -o %t.bulk-mem64.o -mattr=+bulk-memory4; RUN: llc --mtriple=wasm32-unknown-unknown -filetype=obj %s -o %t.atomics.bulk-mem.o -mattr=+atomics,+bulk-memory5; RUN: llc --mtriple=wasm64-unknown-unknown -filetype=obj %s -o %t.atomics.bulk-mem64.o -mattr=+atomics,+bulk-memory6; RUN: llc --mtriple=wasm32-unknown-unknown -filetype=obj %s -o %t.atomics.bulk-mem.pic.o -relocation-model=pic -mattr=+atomics,+bulk-memory,+mutable-globals7; RUN: llc --mtriple=wasm64-unknown-unknown -filetype=obj %s -o %t.atomics.bulk-mem.pic-mem64.o -relocation-model=pic -mattr=+atomics,+bulk-memory,+mutable-globals8 9;; atomics, shared memory => error10; RUN: not wasm-ld -no-gc-sections --no-entry --shared-memory --max-memory=131072 %t.atomics.o -o %t.atomics.wasm 2>&1 | FileCheck %s --check-prefix ERROR11 12;; bulk memory, unshared memory => active segments13; RUN: wasm-ld -no-gc-sections --no-entry %t.bulk-mem.o -o %t.bulk-mem.wasm14; RUN: obj2yaml %t.bulk-mem.wasm | FileCheck %s --check-prefixes ACTIVE,ACTIVE3215 16;; bulk memory, unshared memory, wasm64 => active segments17; RUN: wasm-ld -mwasm64 -no-gc-sections --no-entry %t.bulk-mem64.o -o %t.bulk-mem64.wasm18; RUN: obj2yaml %t.bulk-mem64.wasm | FileCheck %s --check-prefixes ACTIVE,ACTIVE6419 20;; In -pie mode segments are combined into one active segment.21; RUN: wasm-ld --experimental-pic --import-memory -pie -no-gc-sections --no-entry %t.atomics.bulk-mem.pic.o -o %t.pic.wasm22; RUN: obj2yaml %t.pic.wasm | FileCheck %s --check-prefixes ACTIVE-PIC23; RUN: llvm-objdump --disassemble-symbols=__wasm_call_ctors,__wasm_init_memory --no-show-raw-insn --no-leading-addr %t.pic.wasm | FileCheck %s --check-prefixes PIC-NON-SHARED-DIS24 25;; atomics, bulk memory, shared memory => passive segments26; RUN: wasm-ld -no-gc-sections --no-entry --shared-memory --max-memory=131072 %t.atomics.bulk-mem.o -o %t.atomics.bulk-mem.wasm27; RUN: obj2yaml %t.atomics.bulk-mem.wasm | FileCheck %s --check-prefix PASSIVE28; RUN: llvm-objdump --disassemble-symbols=__wasm_call_ctors,__wasm_init_memory --no-show-raw-insn --no-leading-addr %t.atomics.bulk-mem.wasm | FileCheck %s --check-prefixes DIS,NOPIC-DIS -DPTR=i3229 30;; atomics, bulk memory, shared memory, wasm64 => passive segments31; RUN: wasm-ld -mwasm64 -no-gc-sections --no-entry --shared-memory --max-memory=131072 %t.atomics.bulk-mem64.o -o %t.atomics.bulk-mem64.wasm32; RUN: obj2yaml %t.atomics.bulk-mem64.wasm | FileCheck %s --check-prefix PASSIVE33; RUN: llvm-objdump --disassemble-symbols=__wasm_call_ctors,__wasm_init_memory --no-show-raw-insn --no-leading-addr %t.atomics.bulk-mem64.wasm | FileCheck %s --check-prefixes DIS,NOPIC-DIS -DPTR=i6434 35;; Also test in combination with PIC/pie36; RUN: wasm-ld --experimental-pic -pie -no-gc-sections --no-entry --shared-memory --max-memory=131072 %t.atomics.bulk-mem.pic.o -o %t.shared.pic.wasm37; RUN: obj2yaml %t.shared.pic.wasm | FileCheck %s --check-prefixes PASSIVE-PIC,PASSIVE32-PIC38; RUN: llvm-objdump --disassemble-symbols=__wasm_call_ctors,__wasm_init_memory --no-show-raw-insn --no-leading-addr %t.shared.pic.wasm | FileCheck %s --check-prefixes DIS,PIC-DIS -DPTR=i3239 40;; Also test in combination with PIC/pie + wasm6441; RUN: wasm-ld -mwasm64 --experimental-pic -pie -no-gc-sections --no-entry --shared-memory --max-memory=131072 %t.atomics.bulk-mem.pic-mem64.o -o %t.pic-mem64.wasm42; RUN: obj2yaml %t.pic-mem64.wasm | FileCheck %s --check-prefixes PASSIVE-PIC,PASSIVE64-PIC43; RUN: llvm-objdump --disassemble-symbols=__wasm_call_ctors,__wasm_init_memory --no-show-raw-insn --no-leading-addr %t.pic-mem64.wasm | FileCheck %s --check-prefixes DIS,PIC-DIS -DPTR=i6444 45@a = hidden global [6 x i8] c"hello\00", align 146@b = hidden global [8 x i8] c"goodbye\00", align 147@c = hidden global [10000 x i8] zeroinitializer, align 148@d = hidden global i32 42, align 449 50@e = private constant [9 x i8] c"constant\00", align 151@f = private constant i8 43, align 452 53@g = thread_local global i32 99, align 454 55; ERROR: 'bulk-memory' feature must be used in order to use shared memory56 57; ACTIVE-LABEL: - Type: CODE58; ACTIVE-NEXT: Functions:59; ACTIVE-NEXT: - Index: 060; ACTIVE-NEXT: Locals: []61; ACTIVE-NEXT: Body: 0B62; ACTIVE-NEXT: - Type: DATA63; ACTIVE-NEXT: Segments:64; ACTIVE-NEXT: - SectionOffset: 865; ACTIVE-NEXT: InitFlags: 066; ACTIVE-NEXT: Offset:67; ACTIVE32-NEXT: Opcode: I32_CONST68; ACTIVE64-NEXT: Opcode: I64_CONST69; ACTIVE-NEXT: Value: 6553670; ACTIVE-NEXT: Content: 636F6E7374616E74000000002B71; ACTIVE-NEXT: - SectionOffset: 2872; ACTIVE-NEXT: InitFlags: 073; ACTIVE-NEXT: Offset:74; ACTIVE32-NEXT: Opcode: I32_CONST75; ACTIVE64-NEXT: Opcode: I64_CONST76; ACTIVE-NEXT: Value: 6555277; ACTIVE-NEXT: Content: 68656C6C6F00676F6F646279650000002A0000006300000078; ACTIVE-NEXT: - Type: CUSTOM79; ACTIVE-NEXT: Name: name80; ACTIVE-NEXT: FunctionNames:81; ACTIVE-NEXT: - Index: 082; ACTIVE-NEXT: Name: __wasm_call_ctors83 84;; In ACTIVE-PIC mode the memory is imported which means all data segments85;; (except BSS) are combined in the single one.86;; BSS is not included here, and instead initialized using `memory.init` in87;; `__wasm_init_memory`88 89; ACTIVE-PIC: - Type: DATA90; ACTIVE-PIC-NEXT: Segments:91; ACTIVE-PIC-NEXT: - SectionOffset: 692; ACTIVE-PIC-NEXT: InitFlags: 093; ACTIVE-PIC-NEXT: Offset:94; ACTIVE-PIC-NEXT: Opcode: GLOBAL_GET95; ACTIVE-PIC-NEXT: Index: 196; ACTIVE-PIC-NEXT: Content: 63000000636F6E7374616E74000000002B00000068656C6C6F00676F6F646279650000002A00000097 98; PASSIVE-LABEL: - Type: START99; PASSIVE-NEXT: StartFunction: 2100; PASSIVE-LABEL: - Type: DATACOUNT101; PASSIVE-NEXT: Count: 3102; PASSIVE-LABEL: - Type: CODE103; PASSIVE-NEXT: Functions:104; PASSIVE-NEXT: - Index: 0105; PASSIVE-NEXT: Locals: []106; PASSIVE-NEXT: Body: 0B107; PASSIVE-NEXT: - Index: 1108; PASSIVE-NEXT: Locals: []109; PASSIVE-NEXT: Body: {{.*}}110; PASSIVE-NEXT: - Index: 2111; PASSIVE-NEXT: Locals: []112; PASSIVE-NEXT: Body: {{.*}}113; PASSIVE-NEXT: - Type: DATA114; PASSIVE-NEXT: Segments:115; PASSIVE-NEXT: - SectionOffset: 3116; PASSIVE-NEXT: InitFlags: 1117; PASSIVE-NEXT: Content: '63000000'118; PASSIVE-NEXT: - SectionOffset: 9119; PASSIVE-NEXT: InitFlags: 1120; PASSIVE-NEXT: Content: 636F6E7374616E74000000002B121; PASSIVE-NEXT: - SectionOffset: 24122; PASSIVE-NEXT: InitFlags: 1123; PASSIVE-NEXT: Content: 68656C6C6F00676F6F646279650000002A000000124; PASSIVE-NEXT: - Type: CUSTOM125; PASSIVE-NEXT: Name: name126; PASSIVE-NEXT: FunctionNames:127; PASSIVE-NEXT: - Index: 0128; PASSIVE-NEXT: Name: __wasm_call_ctors129; PASSIVE-NEXT: - Index: 1130; PASSIVE-NEXT: Name: __wasm_init_tls131; PASSIVE-NEXT: - Index: 2132; PASSIVE-NEXT: Name: __wasm_init_memory133 134; PASSIVE-PIC: - Type: START135; PASSIVE-PIC-NEXT: StartFunction: 2136; PASSIVE-PIC-NEXT: - Type: DATACOUNT137; PASSIVE-PIC-NEXT: Count: 3138; PASSIVE-PIC-NEXT: - Type: CODE139; PASSIVE-PIC-NEXT: Functions:140; PASSIVE-PIC-NEXT: - Index: 0141; PASSIVE-PIC-NEXT: Locals: []142; PASSIVE-PIC-NEXT: Body: 0B143; PASSIVE-PIC-NEXT: - Index: 1144; PASSIVE-PIC-NEXT: Locals: []145; PASSIVE-PIC-NEXT: Body: {{.*}}146; PASSIVE-PIC-NEXT: - Index: 2147; PASSIVE-PIC-NEXT: Locals:148; PASSIVE32-PIC-NEXT: - Type: I32149; PASSIVE64-PIC-NEXT: - Type: I64150; PASSIVE-PIC-NEXT: Count: 2151; PASSIVE-PIC-NEXT: Body: {{.*}}152; PASSIVE-PIC-NEXT: - Type: DATA153; PASSIVE-PIC-NEXT: Segments:154; PASSIVE-PIC-NEXT: - SectionOffset: 3155; PASSIVE-PIC-NEXT: InitFlags: 1156; PASSIVE-PIC-NEXT: Content: '63000000'157; PASSIVE-PIC-NEXT: - SectionOffset: 9158; PASSIVE-PIC-NEXT: InitFlags: 1159; PASSIVE-PIC-NEXT: Content: 636F6E7374616E74000000002B160; PASSIVE-PIC-NEXT: - SectionOffset: 24161; PASSIVE-PIC-NEXT: InitFlags: 1162; PASSIVE-PIC-NEXT: Content: 68656C6C6F00676F6F646279650000002A000000163; PASSIVE-PIC-NEXT: - Type: CUSTOM164; PASSIVE-PIC-NEXT: Name: name165; PASSIVE-PIC-NEXT: FunctionNames:166; PASSIVE-PIC-NEXT: - Index: 0167; PASSIVE-PIC-NEXT: Name: __wasm_call_ctors168; PASSIVE-PIC-NEXT: - Index: 1169; PASSIVE-PIC-NEXT: Name: __wasm_init_tls170; PASSIVE-PIC-NEXT: - Index: 2171; PASSIVE-PIC-NEXT: Name: __wasm_init_memory172 173;; For the non-shared PIC case the __wasm_init_memory only deals with BSS since174;; all other segments are active175; PIC-NON-SHARED-DIS: <__wasm_init_memory>:176; PIC-NON-SHARED-DIS-EMPTY:177; PIC-NON-SHARED-DIS-NEXT: i32.const 40178; PIC-NON-SHARED-DIS-NEXT: global.get 1179; PIC-NON-SHARED-DIS-NEXT: i32.add 180; PIC-NON-SHARED-DIS-NEXT: i32.const 0181; PIC-NON-SHARED-DIS-NEXT: i32.const 10000182; PIC-NON-SHARED-DIS-NEXT: memory.fill 0183; PIC-NON-SHARED-DIS-NEXT: end184 185;; no data relocations.186; DIS-LABEL: <__wasm_call_ctors>:187; DIS-EMPTY:188; DIS-NEXT: end189 190; PIC-DIS-EMPTY:191 192; DIS-LABEL: <__wasm_init_memory>:193 194; PIC-DIS: .local [[PTR]]195; PIC-DIS-NEXT: global.get 1196; PIC-DIS-NEXT: [[PTR]].const 10040197; PIC-DIS-NEXT: [[PTR]].add198; PIC-DIS-NEXT: local.set 0199 200; DIS: block201; DIS-NEXT: block202; DIS-NEXT: block203 204; NOPIC-DIS-NEXT: [[PTR]].const 75576205; PIC-DIS-NEXT: local.get 0206 207; DIS-NEXT: i32.const 0208; DIS-NEXT: i32.const 1209; DIS-NEXT: i32.atomic.rmw.cmpxchg 0210; DIS-NEXT: br_table {0, 1, 2} # 1: down to label1211; DIS-NEXT: # 2: down to label0212; DIS-NEXT: end213 214; NOPIC-DIS-NEXT: [[PTR]].const 65536215; NOPIC-DIS-NEXT: [[PTR]].const 65536216; NOPIC-DIS-NEXT: global.set 1217; PIC-DIS-NEXT: [[PTR]].const 0218; PIC-DIS-NEXT: global.get 1219; PIC-DIS-NEXT: [[PTR]].add220; PIC-DIS-NEXT: local.tee 1221; PIC-DIS-NEXT: global.set {{\d*}}222; PIC-DIS-NEXT: local.get 1223; DIS-NEXT: i32.const 0224; DIS-NEXT: i32.const 4225; DIS-NEXT: memory.init 0, 0226 227; NOPIC-DIS-NEXT: [[PTR]].const 65540228; PIC-DIS-NEXT: [[PTR]].const 4229; PIC-DIS-NEXT: global.get 1230; PIC-DIS-NEXT: [[PTR]].add231 232; DIS-NEXT: i32.const 0233; DIS-NEXT: i32.const 13234; DIS-NEXT: memory.init 1, 0235 236; NOPIC-DIS-NEXT: [[PTR]].const 65556237; PIC-DIS-NEXT: [[PTR]].const 20238; PIC-DIS-NEXT: global.get 1239; PIC-DIS-NEXT: [[PTR]].add240 241; DIS-NEXT: i32.const 0242; DIS-NEXT: i32.const 20243; DIS-NEXT: memory.init 2, 0244; NOPIC-DIS-NEXT: [[PTR]].const 65576245; PIC-DIS-NEXT: [[PTR]].const 40246; PIC-DIS-NEXT: global.get 1247; PIC-DIS-NEXT: [[PTR]].add248; DIS-NEXT: i32.const 0249; DIS-NEXT: [[PTR]].const 10000250; DIS-NEXT: memory.fill 0251 252; NOPIC-DIS-NEXT: [[PTR]].const 75576253; PIC-DIS-NEXT: local.get 0254 255; DIS-NEXT: i32.const 2256; DIS-NEXT: i32.atomic.store 0257 258; NOPIC-DIS-NEXT: [[PTR]].const 75576259; PIC-DIS-NEXT: local.get 0260 261; DIS-NEXT: i32.const -1262; DIS-NEXT: memory.atomic.notify 0263; DIS-NEXT: drop264; DIS-NEXT: br 1 # 1: down to label1265; DIS-NEXT: end266 267; NOPIC-DIS-NEXT: [[PTR]].const 75576268; PIC-DIS-NEXT: local.get 0269 270; DIS-NEXT: i32.const 1271; DIS-NEXT: i64.const -1272; DIS-NEXT: memory.atomic.wait32 0273; DIS-NEXT: drop274; DIS-NEXT: end275; DIS-NEXT: data.drop 1276; DIS-NEXT: data.drop 2277; DIS-NEXT: end278