# RUN: llvm-mc -triple=wasm32-unknown-unknown -filetype=obj < %s | obj2yaml | FileCheck %s
# RUN: llvm-mc -triple=wasm32-unknown-unknown -mattr=+reference-types -filetype=obj < %s | obj2yaml | FileCheck --check-prefix=REF %s

# Verify that @GOT relocation entryes result in R_WASM_GLOBAL_INDEX_LEB against
# against the corrsponding function or data symbol and that the corresponding
# data symbols are imported as a wasm globals.

.functype default_func () -> (i32)

.globaltype __memory_base, i32
.globaltype __table_base, i32

load_default_data:
    .functype   load_default_data () -> (i32)
    global.get  default_data@GOT
    i32.load    0
    end_function

load_default_func:
    .functype   load_default_func () -> (i32)
    global.get  default_func@GOT
    i32.load    0
    end_function

load_hidden_data:
    .functype   load_hidden_data () -> (i32)
    global.get  __memory_base
    i32.const   .L.hidden_data@MBREL
    i32.add
    end_function

load_hidden_func:
    .functype   load_hidden_func () -> (i32)
    global.get  __table_base
    i32.const   hidden_func@TBREL
    i32.add
    end_function

hidden_func:
    .functype   hidden_func () -> (i32)
    i32.const 0
    end_function

.section .rodata.hidden_data,"",@
.L.hidden_data:
    .int8 100
    .size .L.hidden_data, 1

#.hidden hidden_func
#.hidden hidden_data
.size default_data, 4

# CHECK:      --- !WASM
# CHECK-NEXT: FileHeader:
# CHECK-NEXT:   Version:         0x1
# CHECK-NEXT: Sections:
# CHECK-NEXT:   - Type:            TYPE
# CHECK-NEXT:     Signatures:
# CHECK-NEXT:       - Index:           0
# CHECK-NEXT:         ParamTypes:      []
# CHECK-NEXT:         ReturnTypes:
# CHECK-NEXT:           - I32
# CHECK-NEXT:   - Type:            IMPORT
# CHECK-NEXT:     Imports:
# CHECK-NEXT:       - Module:          env
# CHECK-NEXT:         Field:           __linear_memory
# CHECK-NEXT:         Kind:            MEMORY
# CHECK-NEXT:         Memory:
# CHECK-NEXT:           Minimum:         0x1
# CHECK-NEXT:       - Module:          env
# CHECK-NEXT:         Field:           default_func
# CHECK-NEXT:         Kind:            FUNCTION
# CHECK-NEXT:         SigIndex:        0
# CHECK-NEXT:       - Module:          env
# CHECK-NEXT:         Field:           __memory_base
# CHECK-NEXT:         Kind:            GLOBAL
# CHECK-NEXT:         GlobalType:      I32
# CHECK-NEXT:         GlobalMutable:   true
# CHECK-NEXT:       - Module:          env
# CHECK-NEXT:         Field:           __table_base
# CHECK-NEXT:         Kind:            GLOBAL
# CHECK-NEXT:         GlobalType:      I32
# CHECK-NEXT:         GlobalMutable:   true
# CHECK-NEXT:       - Module:          env
# CHECK-NEXT:         Field:           __indirect_function_table
# CHECK-NEXT:         Kind:            TABLE
# CHECK-NEXT:         Table:
# CHECK-NEXT:           Index:           0
# CHECK-NEXT:           ElemType:        FUNCREF
# CHECK-NEXT:           Limits:
# CHECK-NEXT:             Minimum:         0x1
# CHECK-NEXT:       - Module:          GOT.mem
# CHECK-NEXT:         Field:           default_data
# CHECK-NEXT:         Kind:            GLOBAL
# CHECK-NEXT:         GlobalType:      I32
# CHECK-NEXT:         GlobalMutable:   true
# CHECK-NEXT:       - Module:          GOT.func
# CHECK-NEXT:         Field:           default_func
# CHECK-NEXT:         Kind:            GLOBAL
# CHECK-NEXT:         GlobalType:      I32
# CHECK-NEXT:         GlobalMutable:   true
# CHECK-NEXT:   - Type:            FUNCTION
# CHECK-NEXT:     FunctionTypes:   [ 0, 0, 0, 0, 0 ]
# CHECK-NEXT:   - Type:            ELEM
# CHECK-NEXT:     Segments:
# CHECK-NEXT:        Offset:
# CHECK-NEXT:          Opcode:          I32_CONST
# CHECK-NEXT:          Value:           1
# CHECK-NEXT:        Functions:       [ 5 ]
# CHECK-NEXT:   - Type:            DATACOUNT
# CHECK-NEXT:     Count:           1
# CHECK-NEXT:   - Type:            CODE
# CHECK-NEXT:     Relocations:
# CHECK-NEXT:       - Type:            R_WASM_GLOBAL_INDEX_LEB
# CHECK-NEXT:         Index:           1
# CHECK-NEXT:         Offset:          0x4
# CHECK-NEXT:       - Type:            R_WASM_GLOBAL_INDEX_LEB
# CHECK-NEXT:         Index:           3
# CHECK-NEXT:         Offset:          0x10
# CHECK-NEXT:       - Type:            R_WASM_GLOBAL_INDEX_LEB
# CHECK-NEXT:         Index:           5
# CHECK-NEXT:         Offset:          0x1C
# CHECK-NEXT:       - Type:            R_WASM_MEMORY_ADDR_REL_SLEB
# CHECK-NEXT:         Index:           6
# CHECK-NEXT:         Offset:          0x22
# CHECK-NEXT:       - Type:            R_WASM_GLOBAL_INDEX_LEB
# CHECK-NEXT:         Index:           8
# CHECK-NEXT:         Offset:          0x2C
# CHECK-NEXT:       - Type:            R_WASM_TABLE_INDEX_REL_SLEB
# CHECK-NEXT:         Index:           9
# CHECK-NEXT:         Offset:          0x32
# CHECK-NEXT:     Functions:
# CHECK-NEXT:       - Index:           1
# CHECK-NEXT:         Locals:          []
# CHECK-NEXT:         Body:            2382808080002802000B
# CHECK-NEXT:       - Index:           2
# CHECK-NEXT:         Locals:          []
# CHECK-NEXT:         Body:            2383808080002802000B
# CHECK-NEXT:       - Index:           3
# CHECK-NEXT:         Locals:          []
# CHECK-NEXT:         Body:            2380808080004180808080006A0B
# CHECK-NEXT:       - Index:           4
# CHECK-NEXT:         Locals:          []
# CHECK-NEXT:         Body:            2381808080004180808080006A0B
# CHECK-NEXT:       - Index:           5
# CHECK-NEXT:         Locals:          []
# CHECK-NEXT:         Body:            41000B
# CHECK-NEXT:   - Type:            DATA
# CHECK-NEXT:     Segments:
# CHECK-NEXT:       - SectionOffset:   6
# CHECK-NEXT:         InitFlags:       0
# CHECK-NEXT:         Offset:
# CHECK-NEXT:           Opcode:          I32_CONST
# CHECK-NEXT:           Value:           0
# CHECK-NEXT:         Content:         '64'
# CHECK-NEXT:   - Type:            CUSTOM
# CHECK-NEXT:     Name:            linking
# CHECK-NEXT:     Version:         2
# CHECK-NEXT:     SymbolTable:
# CHECK-NEXT:       - Index:           0
# CHECK-NEXT:         Kind:            FUNCTION
# CHECK-NEXT:         Name:            load_default_data
# CHECK-NEXT:         Flags:           [ BINDING_LOCAL ]
# CHECK-NEXT:         Function:        1
# CHECK-NEXT:       - Index:           1
# CHECK-NEXT:         Kind:            DATA
# CHECK-NEXT:         Name:            default_data
# CHECK-NEXT:         Flags:           [ UNDEFINED ]
# CHECK-NEXT:       - Index:           2
# CHECK-NEXT:         Kind:            FUNCTION
# CHECK-NEXT:         Name:            load_default_func
# CHECK-NEXT:         Flags:           [ BINDING_LOCAL ]
# CHECK-NEXT:         Function:        2
# CHECK-NEXT:       - Index:           3
# CHECK-NEXT:         Kind:            FUNCTION
# CHECK-NEXT:         Name:            default_func
# CHECK-NEXT:         Flags:           [ UNDEFINED ]
# CHECK-NEXT:         Function:        0
# CHECK-NEXT:       - Index:           4
# CHECK-NEXT:         Kind:            FUNCTION
# CHECK-NEXT:         Name:            load_hidden_data
# CHECK-NEXT:         Flags:           [ BINDING_LOCAL ]
# CHECK-NEXT:         Function:        3
# CHECK-NEXT:       - Index:           5
# CHECK-NEXT:         Kind:            GLOBAL
# CHECK-NEXT:         Name:            __memory_base
# CHECK-NEXT:         Flags:           [ UNDEFINED ]
# CHECK-NEXT:         Global:          0
# CHECK-NEXT:       - Index:           6
# CHECK-NEXT:         Kind:            DATA
# CHECK-NEXT:         Name:            .L.hidden_data
# CHECK-NEXT:         Flags:           [ BINDING_LOCAL ]
# CHECK-NEXT:         Segment:         0
# CHECK-NEXT:         Size:            1
# CHECK-NEXT:       - Index:           7
# CHECK-NEXT:         Kind:            FUNCTION
# CHECK-NEXT:         Name:            load_hidden_func
# CHECK-NEXT:         Flags:           [ BINDING_LOCAL ]
# CHECK-NEXT:         Function:        4
# CHECK-NEXT:       - Index:           8
# CHECK-NEXT:         Kind:            GLOBAL
# CHECK-NEXT:         Name:            __table_base
# CHECK-NEXT:         Flags:           [ UNDEFINED ]
# CHECK-NEXT:         Global:          1
# CHECK-NEXT:       - Index:           9
# CHECK-NEXT:         Kind:            FUNCTION
# CHECK-NEXT:         Name:            hidden_func
# CHECK-NEXT:         Flags:           [ BINDING_LOCAL ]
# CHECK-NEXT:         Function:        5
# REF:              - Index:           10
# REF-NEXT:           Kind:            TABLE
# REF-NEXT:           Name:            __indirect_function_table
# REF-NEXT:           Flags:           [ UNDEFINED, NO_STRIP ]
# REF-NEXT:           Table:           0
# CHECK-NEXT:     SegmentInfo:
# CHECK-NEXT:       - Index:           0
# CHECK-NEXT:         Name:            .rodata.hidden_data
# CHECK-NEXT:         Alignment:       0
# CHECK-NEXT:         Flags:           [  ]
# CHECK-NEXT: ...
