| # RUN: split-file %s %t | |
| # RUN: llvm-mc -filetype=obj -triple=wasm32-unknown-unknown -o %t/common1.o %t/common1.s | |
| # RUN: llvm-mc -filetype=obj -triple=wasm32-unknown-unknown -o %t/common2.o %t/common2.s | |
| # RUN: llvm-mc -filetype=obj -triple=wasm32-unknown-unknown -o %t/main.o %t/main.s | |
| # RUN: llvm-mc -filetype=obj -triple=wasm32-unknown-unknown -o %t/strong.o %t/strong.s | |
| # RUN: llvm-mc -filetype=obj -triple=wasm32-unknown-unknown -o %t/weak.o %t/weak.s | |
| # Test 1: Basic common symbol merging (max size and max alignment) | |
| # RUN: wasm-ld --no-stack-first --global-base=1024 --export=foo --export=bar %t/common1.o %t/common2.o %t/main.o -o %t.wasm | |
| # RUN: obj2yaml %t.wasm | FileCheck %s | |
| # Test 2: Strong defined symbol takes precedence over common symbol | |
| # RUN: wasm-ld --no-stack-first --global-base=1024 --export=foo %t/common1.o %t/strong.o %t/main.o -o %t_strong.wasm | |
| # RUN: obj2yaml %t_strong.wasm | FileCheck %s --check-prefix=STRONG | |
| # Test 3: Common symbol takes precedence over weak defined symbol | |
| # RUN: wasm-ld --no-stack-first --global-base=1024 --export=foo %t/common1.o %t/weak.o %t/main.o -o %t_weak.wasm | |
| # RUN: obj2yaml %t_weak.wasm | FileCheck %s --check-prefix=WEAK | |
| # Test 4: Relocatable link preserves common symbols (merged) | |
| # RUN: wasm-ld -r %t/common1.o %t/common2.o -o %t/common_reloc.o | |
| # RUN: obj2yaml %t/common_reloc.o | FileCheck %s --check-prefix=RELOC | |
| #--- common1.s | |
| .comm foo, 4, 2 | |
| .comm bar, 8, 3 | |
| #--- common2.s | |
| .comm foo, 8, 3 | |
| .comm bar, 4, 2 | |
| #--- strong.s | |
| .globl foo | |
| .section .data.foo,"",@ | |
| foo: | |
| .int32 42 | |
| .size foo, 4 | |
| #--- weak.s | |
| .weak foo | |
| .section .data.foo,"",@ | |
| foo: | |
| .int32 99 | |
| .size foo, 4 | |
| #--- main.s | |
| .globaltype __stack_pointer, i32 | |
| .globl _start | |
| _start: | |
| .functype _start () -> () | |
| global.get __stack_pointer | |
| drop | |
| i32.const foo | |
| drop | |
| i32.const bar | |
| drop | |
| end_function | |
| # CHECK: - 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: 66576 | |
| # CHECK-NEXT: - Index: 1 | |
| # CHECK-NEXT: Type: I32 | |
| # CHECK-NEXT: Mutable: false | |
| # CHECK-NEXT: InitExpr: | |
| # CHECK-NEXT: Opcode: I32_CONST | |
| # CHECK-NEXT: Value: 1024 | |
| # CHECK-NEXT: - Index: 2 | |
| # CHECK-NEXT: Type: I32 | |
| # CHECK-NEXT: Mutable: false | |
| # CHECK-NEXT: InitExpr: | |
| # CHECK-NEXT: Opcode: I32_CONST | |
| # CHECK-NEXT: Value: 1032 | |
| # STRONG: - Type: GLOBAL | |
| # STRONG-NEXT: Globals: | |
| # STRONG-NEXT: - Index: 0 | |
| # STRONG-NEXT: Type: I32 | |
| # STRONG-NEXT: Mutable: true | |
| # STRONG-NEXT: InitExpr: | |
| # STRONG-NEXT: Opcode: I32_CONST | |
| # STRONG-NEXT: Value: 66576 | |
| # STRONG-NEXT: - Index: 1 | |
| # STRONG-NEXT: Type: I32 | |
| # STRONG-NEXT: Mutable: false | |
| # STRONG-NEXT: InitExpr: | |
| # STRONG-NEXT: Opcode: I32_CONST | |
| # STRONG-NEXT: Value: 1024 | |
| # STRONG: - Type: DATA | |
| # STRONG-NEXT: Segments: | |
| # STRONG-NEXT: - SectionOffset: {{[0-9]+}} | |
| # STRONG-NEXT: InitFlags: 0 | |
| # STRONG-NEXT: Offset: | |
| # STRONG-NEXT: Opcode: I32_CONST | |
| # STRONG-NEXT: Value: 1024 | |
| # STRONG-NEXT: Content: 2A000000 | |
| # WEAK-NOT: - SectionOffset: 3 | |
| # WEAK-NOT: Content: '63000000' | |
| # WEAK: - Type: GLOBAL | |
| # WEAK-NEXT: Globals: | |
| # WEAK-NEXT: - Index: 0 | |
| # WEAK-NEXT: Type: I32 | |
| # WEAK-NEXT: Mutable: true | |
| # WEAK-NEXT: InitExpr: | |
| # WEAK-NEXT: Opcode: I32_CONST | |
| # WEAK-NEXT: Value: 66576 | |
| # WEAK-NEXT: - Index: 1 | |
| # WEAK-NEXT: Type: I32 | |
| # WEAK-NEXT: Mutable: false | |
| # WEAK-NEXT: InitExpr: | |
| # WEAK-NEXT: Opcode: I32_CONST | |
| # WEAK-NEXT: Value: 1024 | |
| # RELOC: SymbolTable: | |
| # RELOC-NEXT: - Index: 0 | |
| # RELOC-NEXT: Kind: DATA | |
| # RELOC-NEXT: Name: foo | |
| # RELOC-NEXT: Flags: [ BINDING_COMMON ] | |
| # RELOC-NEXT: Size: 8 | |
| # RELOC-NEXT: Align: 3 | |
| # RELOC-NEXT: - Index: 1 | |
| # RELOC-NEXT: Kind: DATA | |
| # RELOC-NEXT: Name: bar | |
| # RELOC-NEXT: Flags: [ BINDING_COMMON ] | |
| # RELOC-NEXT: Size: 8 | |
| # RELOC-NEXT: Align: 3 |