Compiler projects using llvm
# RUN: llvm-mc -triple=wasm32-unknown-unknown < %s | FileCheck %s
# RUN: llvm-mc -triple=wasm32-unknown-unknown -filetype=obj < %s | obj2yaml | FileCheck -check-prefix=BIN %s

# Tests creating an accessing actual wasm globals

.globl read_global
.globl write_global
.globaltype foo_global, i32
.globaltype global2, i64, immutable
.globaltype global3, f32
.globaltype global4, f64

read_global:
  .functype read_global () -> (i32)
  global.get foo_global
  end_function

write_global:
  .functype write_global (i32, i64, f32, f64) -> ()
  local.get 0
  global.set foo_global
  local.get 1
  global.set global2
  local.get 2
  global.set global3
  local.get 3
  global.set global4
  end_function

foo_global:
global2:
global3:
global4:

# CHECK: .globl  read_global
# CNEXT: .globl  write_global
# CHECK: .globaltype foo_global, i32
# CHECK: foo_global:

#      BIN: - Type:            GLOBAL
# BIN-NEXT:   Globals:
# BIN-NEXT:     - Index:           0
# BIN-NEXT:       Type:            I32
# BIN-NEXT:       Mutable:         true
# BIN-NEXT:       InitExpr:
# BIN-NEXT:         Opcode:          I32_CONST
# BIN-NEXT:         Value:           0
# BIN-NEXT:     - Index:           1
# BIN-NEXT:       Type:            I64
# BIN-NEXT:       Mutable:         false
# BIN-NEXT:       InitExpr:
# BIN-NEXT:         Opcode:          I64_CONST
# BIN-NEXT:         Value:           0

#      BIN:  - Type:            CUSTOM
# BIN-NEXT:    Name:            linking
# BIN-NEXT:    Version:         2
# BIN-NEXT:    SymbolTable:
# BIN-NEXT:      - Index:           0
# BIN-NEXT:        Kind:            FUNCTION
# BIN-NEXT:        Name:            read_global
# BIN-NEXT:        Flags:           [  ]
# BIN-NEXT:        Function:        0
# BIN-NEXT:      - Index:           1
# BIN-NEXT:        Kind:            FUNCTION
# BIN-NEXT:        Name:            write_global
# BIN-NEXT:        Flags:           [  ]
# BIN-NEXT:        Function:        1
# BIN-NEXT:      - Index:           2
# BIN-NEXT:        Kind:            GLOBAL
# BIN-NEXT:        Name:            foo_global
# BIN-NEXT:        Flags:           [ BINDING_LOCAL ]
# BIN-NEXT:        Global:          0
# BIN-NEXT:      - Index:           3
# BIN-NEXT:        Kind:            GLOBAL
# BIN-NEXT:        Name:            global2
# BIN-NEXT:        Flags:           [ BINDING_LOCAL ]
# BIN-NEXT:        Global:          1
# BIN-NEXT:      - Index:           4
# BIN-NEXT:        Kind:            GLOBAL
# BIN-NEXT:        Name:            global3
# BIN-NEXT:        Flags:           [ BINDING_LOCAL ]
# BIN-NEXT:        Global:          2
# BIN-NEXT:      - Index:           5
# BIN-NEXT:        Kind:            GLOBAL
# BIN-NEXT:        Name:            global4
# BIN-NEXT:        Flags:           [ BINDING_LOCAL ]
# BIN-NEXT:        Global:          3