Home | History | Annotate | Download | only in WebAssembly
      1 ; RUN: llc -filetype=obj %s -o %t.o
      2 ; RUN: obj2yaml %t.o | FileCheck %s
      3 ; RUN: llvm-objdump -t %t.o | FileCheck --check-prefix=CHECK-SYMS %s
      4 
      5 target triple = "wasm32-unknown-unknown"
      6 
      7 ; 'foo_alias()' is weak alias of function 'foo()'
      8 ; 'bar_alias' is weak alias of global variable 'bar'
      9 ; Generates two exports of the same function, one of them weak
     10 
     11 @bar = global i32 7, align 8
     12 @bar_alias = weak hidden alias i32, i32* @bar
     13 @foo_alias = weak hidden alias i32 (), i32 ()* @foo
     14 
     15 @direct_address = global i32()* @foo, align 8
     16 @alias_address = global i32()* @foo_alias, align 8
     17 
     18 define hidden i32 @foo() #0 {
     19 entry:
     20   ret i32 0
     21 }
     22 
     23 define hidden i32 @call_direct() #0 {
     24 entry:
     25   %call = call i32 @foo()
     26   ret i32 %call
     27 }
     28 
     29 define hidden i32 @call_alias() #0 {
     30 entry:
     31   %call = call i32 @foo_alias()
     32   ret i32 %call
     33 }
     34 
     35 define hidden i32 @call_direct_ptr() #0 {
     36 entry:
     37   %0 = load i32 ()*, i32 ()** @direct_address, align 8
     38   %call = call i32 %0()
     39   ret i32 %call
     40 }
     41 
     42 define hidden i32 @call_alias_ptr() #0 {
     43 entry:
     44   %0 = load i32 ()*, i32 ()** @alias_address, align 8
     45   %call = call i32 %0()
     46   ret i32 %call
     47 }
     48 
     49 ; CHECK:        - Type:            TYPE
     50 ; CHECK-NEXT:     Signatures:      
     51 ; CHECK-NEXT:       - Index:           0
     52 ; CHECK-NEXT:         ReturnType:      I32
     53 ; CHECK-NEXT:         ParamTypes:      
     54 ; CHECK-NEXT:   - Type:            IMPORT
     55 ; CHECK-NEXT:     Imports:
     56 ; CHECK-NEXT:       - Module:          env
     57 ; CHECK-NEXT:         Field:           __linear_memory
     58 ; CHECK-NEXT:         Kind:            MEMORY
     59 ; CHECK-NEXT:         Memory:
     60 ; CHECK-NEXT:           Initial:         0x00000001
     61 ; CHECK-NEXT:       - Module:          env
     62 ; CHECK-NEXT:         Field:           __indirect_function_table
     63 ; CHECK-NEXT:         Kind:            TABLE
     64 ; CHECK-NEXT:         Table:
     65 ; CHECK-NEXT:           ElemType:        ANYFUNC
     66 ; CHECK-NEXT:           Limits:
     67 ; CHECK-NEXT:             Initial:         0x00000001
     68 ; CHECK-NEXT:   - Type:            FUNCTION
     69 ; CHECK-NEXT:     FunctionTypes:   [ 0, 0, 0, 0, 0 ]
     70 ; CHECK-NEXT:   - Type:            ELEM
     71 ; CHECK-NEXT:     Segments:        
     72 ; CHECK-NEXT:       - Offset:          
     73 ; CHECK-NEXT:           Opcode:          I32_CONST
     74 ; CHECK-NEXT:           Value:           1
     75 ; CHECK-NEXT:         Functions:       [ 0 ]
     76 ; CHECK-NEXT:   - Type:            CODE
     77 ; CHECK-NEXT:     Relocations:     
     78 ; CHECK-NEXT:       - Type:            R_WEBASSEMBLY_FUNCTION_INDEX_LEB
     79 ; CHECK-NEXT:         Index:           0
     80 ; CHECK-NEXT:         Offset:          0x00000009
     81 ; CHECK-NEXT:       - Type:            R_WEBASSEMBLY_FUNCTION_INDEX_LEB
     82 ; CHECK-NEXT:         Index:           3
     83 ; CHECK-NEXT:         Offset:          0x00000012
     84 ; CHECK-NEXT:       - Type:            R_WEBASSEMBLY_MEMORY_ADDR_LEB
     85 ; CHECK-NEXT:         Index:           5
     86 ; CHECK-NEXT:         Offset:          0x0000001E
     87 ; CHECK-NEXT:       - Type:            R_WEBASSEMBLY_TYPE_INDEX_LEB
     88 ; CHECK-NEXT:         Index:           0
     89 ; CHECK-NEXT:         Offset:          0x00000024
     90 ; CHECK-NEXT:       - Type:            R_WEBASSEMBLY_MEMORY_ADDR_LEB
     91 ; CHECK-NEXT:         Index:           7
     92 ; CHECK-NEXT:         Offset:          0x00000031
     93 ; CHECK-NEXT:       - Type:            R_WEBASSEMBLY_TYPE_INDEX_LEB
     94 ; CHECK-NEXT:         Index:           0
     95 ; CHECK-NEXT:         Offset:          0x00000037
     96 ; CHECK-NEXT:     Functions:       
     97 ; CHECK-NEXT:       - Index:           0
     98 ; CHECK-NEXT:         Locals:          
     99 ; CHECK-NEXT:         Body:            41000B
    100 ; CHECK-NEXT:       - Index:           1
    101 ; CHECK-NEXT:         Locals:          
    102 ; CHECK-NEXT:         Body:            1080808080000B
    103 ; CHECK-NEXT:       - Index:           2
    104 ; CHECK-NEXT:         Locals:          
    105 ; CHECK-NEXT:         Body:            1080808080000B
    106 ; CHECK-NEXT:       - Index:           3
    107 ; CHECK-NEXT:         Locals:          
    108 ; CHECK-NEXT:         Body:            410028028880808000118080808000000B
    109 ; CHECK-NEXT:       - Index:           4
    110 ; CHECK-NEXT:         Locals:          
    111 ; CHECK-NEXT:         Body:            410028029080808000118080808000000B
    112 ; CHECK-NEXT:   - Type:            DATA
    113 ; CHECK-NEXT:     Relocations:     
    114 ; CHECK-NEXT:       - Type:            R_WEBASSEMBLY_TABLE_INDEX_I32
    115 ; CHECK-NEXT:         Index:           0
    116 ; CHECK-NEXT:         Offset:          0x0000000F
    117 ; CHECK-NEXT:       - Type:            R_WEBASSEMBLY_TABLE_INDEX_I32
    118 ; CHECK-NEXT:         Index:           3
    119 ; CHECK-NEXT:         Offset:          0x00000018
    120 ; CHECK-NEXT:     Segments:        
    121 ; CHECK-NEXT:       - SectionOffset:   6
    122 ; CHECK-NEXT:         MemoryIndex:     0
    123 ; CHECK-NEXT:         Offset:          
    124 ; CHECK-NEXT:           Opcode:          I32_CONST
    125 ; CHECK-NEXT:           Value:           0
    126 ; CHECK-NEXT:         Content:         '07000000'
    127 ; CHECK-NEXT:       - SectionOffset:   15
    128 ; CHECK-NEXT:         MemoryIndex:     0
    129 ; CHECK-NEXT:         Offset:          
    130 ; CHECK-NEXT:           Opcode:          I32_CONST
    131 ; CHECK-NEXT:           Value:           8
    132 ; CHECK-NEXT:         Content:         '01000000'
    133 ; CHECK-NEXT:       - SectionOffset:   24
    134 ; CHECK-NEXT:         MemoryIndex:     0
    135 ; CHECK-NEXT:         Offset:
    136 ; CHECK-NEXT:           Opcode:          I32_CONST
    137 ; CHECK-NEXT:           Value:           16
    138 ; CHECK-NEXT:         Content:         '01000000'
    139 ; CHECK-NEXT:   - Type:            CUSTOM
    140 ; CHECK-NEXT:     Name:            linking
    141 ; CHECK-NEXT:     Version:         1
    142 ; CHECK-NEXT:     SymbolTable:      
    143 ; CHECK-NEXT:       - Index:           0
    144 ; CHECK-NEXT:         Kind:            FUNCTION
    145 ; CHECK-NEXT:         Name:            foo
    146 ; CHECK-NEXT:         Flags:           [ VISIBILITY_HIDDEN ]
    147 ; CHECK-NEXT:         Function:        0
    148 ; CHECK-NEXT:       - Index:           1
    149 ; CHECK-NEXT:         Kind:            FUNCTION
    150 ; CHECK-NEXT:         Name:            call_direct
    151 ; CHECK-NEXT:         Flags:           [ VISIBILITY_HIDDEN ]
    152 ; CHECK-NEXT:         Function:        1
    153 ; CHECK-NEXT:       - Index:           2
    154 ; CHECK-NEXT:         Kind:            FUNCTION
    155 ; CHECK-NEXT:         Name:            call_alias
    156 ; CHECK-NEXT:         Flags:           [ VISIBILITY_HIDDEN ]
    157 ; CHECK-NEXT:         Function:        2
    158 ; CHECK-NEXT:       - Index:           3
    159 ; CHECK-NEXT:         Kind:            FUNCTION
    160 ; CHECK-NEXT:         Name:            foo_alias
    161 ; CHECK-NEXT:         Flags:           [ BINDING_WEAK, VISIBILITY_HIDDEN ]
    162 ; CHECK-NEXT:         Function:        0
    163 ; CHECK-NEXT:       - Index:           4
    164 ; CHECK-NEXT:         Kind:            FUNCTION
    165 ; CHECK-NEXT:         Name:            call_direct_ptr
    166 ; CHECK-NEXT:         Flags:           [ VISIBILITY_HIDDEN ]
    167 ; CHECK-NEXT:         Function:        3
    168 ; CHECK-NEXT:       - Index:           5
    169 ; CHECK-NEXT:         Kind:            DATA
    170 ; CHECK-NEXT:         Name:            direct_address
    171 ; CHECK-NEXT:         Flags:           [  ]
    172 ; CHECK-NEXT:         Segment:         1
    173 ; CHECK-NEXT:         Size:            4
    174 ; CHECK-NEXT:       - Index:           6
    175 ; CHECK-NEXT:         Kind:            FUNCTION
    176 ; CHECK-NEXT:         Name:            call_alias_ptr
    177 ; CHECK-NEXT:         Flags:           [ VISIBILITY_HIDDEN ]
    178 ; CHECK-NEXT:         Function:        4
    179 ; CHECK-NEXT:       - Index:           7
    180 ; CHECK-NEXT:         Kind:            DATA
    181 ; CHECK-NEXT:         Name:            alias_address
    182 ; CHECK-NEXT:         Flags:           [  ]
    183 ; CHECK-NEXT:         Segment:         2
    184 ; CHECK-NEXT:         Size:            4
    185 ; CHECK-NEXT:       - Index:           8
    186 ; CHECK-NEXT:         Kind:            DATA
    187 ; CHECK-NEXT:         Name:            bar
    188 ; CHECK-NEXT:         Flags:           [  ]
    189 ; CHECK-NEXT:         Segment:         0
    190 ; CHECK-NEXT:         Size:            4
    191 ; CHECK-NEXT:       - Index:           9
    192 ; CHECK-NEXT:         Kind:            DATA
    193 ; CHECK-NEXT:         Name:            bar_alias
    194 ; CHECK-NEXT:         Flags:           [ BINDING_WEAK, VISIBILITY_HIDDEN ]
    195 ; CHECK-NEXT:         Segment:         0
    196 ; CHECK-NEXT:         Size:            4
    197 ; CHECK-NEXT:     SegmentInfo:    
    198 ; CHECK-NEXT:       - Index:           0
    199 ; CHECK-NEXT:         Name:            .data.bar
    200 ; CHECK-NEXT:         Alignment:       8
    201 ; CHECK-NEXT:         Flags:           [ ]
    202 ; CHECK-NEXT:       - Index:           1
    203 ; CHECK-NEXT:         Name:            .data.direct_address
    204 ; CHECK-NEXT:         Alignment:       8
    205 ; CHECK-NEXT:         Flags:           [ ]
    206 ; CHECK-NEXT:       - Index:           2
    207 ; CHECK-NEXT:         Name:            .data.alias_address
    208 ; CHECK-NEXT:         Alignment:       8
    209 ; CHECK-NEXT:         Flags:           [ ]
    210 ; CHECK-NEXT: ...
    211 
    212 ; CHECK-SYMS: SYMBOL TABLE:
    213 ; CHECK-SYMS-NEXT: 00000000 g     F CODE	.hidden foo
    214 ; CHECK-SYMS-NEXT: 00000001 g     F CODE	.hidden call_direct
    215 ; CHECK-SYMS-NEXT: 00000002 g     F CODE	.hidden call_alias
    216 ; CHECK-SYMS-NEXT: 00000000 gw    F CODE	.hidden foo_alias
    217 ; CHECK-SYMS-NEXT: 00000003 g     F CODE	.hidden call_direct_ptr
    218 ; CHECK-SYMS-NEXT: 00000008 g       DATA	direct_address
    219 ; CHECK-SYMS-NEXT: 00000004 g     F CODE	.hidden call_alias_ptr
    220 ; CHECK-SYMS-NEXT: 00000010 g       DATA	alias_address
    221 ; CHECK-SYMS-NEXT: 00000000 g       DATA	bar
    222 ; CHECK-SYMS-NEXT: 00000000 gw      DATA	.hidden bar_alias
    223