llvm/llvm/test/MC/ELF/type.s

# RUN: llvm-mc -filetype=obj -triple=x86_64 %s | llvm-readelf -s - | FileCheck %s

# CHECK:      Symbol table '.symtab' contains 34 entries:
# CHECK-NEXT: Num:    Value          Size Type    Bind   Vis       Ndx Name
# CHECK-NEXT:   0: 0000000000000000     0 NOTYPE  LOCAL  DEFAULT   UND 
# CHECK-NEXT:   1: 0000000000000000     0 FUNC    GLOBAL DEFAULT     2 foo
# CHECK-NEXT:   2: 0000000000000000     0 OBJECT  GLOBAL DEFAULT     2 bar
# CHECK-NEXT:   3: 0000000000000000     0 OBJECT  UNIQUE DEFAULT     2 zed
# CHECK-NEXT:   4: 0000000000000000     0 OBJECT  GLOBAL DEFAULT     2 obj
# CHECK-NEXT:   5: 0000000000000000     0 FUNC    GLOBAL DEFAULT     2 func
# CHECK-NEXT:   6: 0000000000000000     0 IFUNC   GLOBAL DEFAULT     2 ifunc
# CHECK-NEXT:   7: 0000000000000000     0 TLS     GLOBAL DEFAULT     2 tls
# CHECK-NEXT:   8: 0000000000000000     0 TLS     GLOBAL DEFAULT     2 tls_quoted
# CHECK-NEXT:   9: 0000000000000000     0 TLS     GLOBAL DEFAULT     2 tls_upper_case
# CHECK-NEXT:  10: 0000000000000000     0 IFUNC   GLOBAL DEFAULT     2 sym1
# CHECK-NEXT:  11: 0000000000000000     0 FUNC    GLOBAL DEFAULT     2 alias1
# CHECK-NEXT:  12: 0000000000000000     0 IFUNC   GLOBAL DEFAULT     2 sym2
# CHECK-NEXT:  13: 0000000000000000     0 OBJECT  GLOBAL DEFAULT     2 alias2
# CHECK-NEXT:  14: 0000000000000000     0 IFUNC   GLOBAL DEFAULT     2 sym3
# CHECK-NEXT:  15: 0000000000000000     0 NOTYPE  GLOBAL DEFAULT     2 alias3
# CHECK-NEXT:  16: 0000000000000000     0 FUNC    GLOBAL DEFAULT     2 sym4
# CHECK-NEXT:  17: 0000000000000000     0 OBJECT  GLOBAL DEFAULT     2 alias4
# CHECK-NEXT:  18: 0000000000000000     0 FUNC    GLOBAL DEFAULT     2 sym5
# CHECK-NEXT:  19: 0000000000000000     0 NOTYPE  GLOBAL DEFAULT     2 alias5
# CHECK-NEXT:  20: 0000000000000000     0 OBJECT  GLOBAL DEFAULT     2 sym6
# CHECK-NEXT:  21: 0000000000000000     0 NOTYPE  GLOBAL DEFAULT     2 alias6
# CHECK-NEXT:  22: 0000000000000000     0 IFUNC   GLOBAL DEFAULT     2 sym7
# CHECK-NEXT:  23: 0000000000000000     0 TLS     GLOBAL DEFAULT     2 alias7
# CHECK-NEXT:  24: 0000000000000000     0 FUNC    GLOBAL DEFAULT     2 sym8
# CHECK-NEXT:  25: 0000000000000000     0 TLS     GLOBAL DEFAULT     2 alias8
# CHECK-NEXT:  26: 0000000000000000     0 TLS     GLOBAL DEFAULT     2 sym9
# CHECK-NEXT:  27: 0000000000000000     0 OBJECT  GLOBAL DEFAULT     2 alias9
# CHECK-NEXT:  28: 0000000000000000     0 TLS     GLOBAL DEFAULT     2 sym10
# CHECK-NEXT:  29: 0000000000000000     0 NOTYPE  GLOBAL DEFAULT     2 alias10
# CHECK-NEXT:  30: 0000000000000000     0 TLS     GLOBAL DEFAULT     2 sym11
# CHECK-NEXT:  31: 0000000000000000     0 IFUNC   GLOBAL DEFAULT     2 alias11
# CHECK-NEXT:  32: 0000000000000000     0 TLS     GLOBAL DEFAULT     2 sym12
# CHECK-NEXT:  33: 0000000000000000     0 FUNC    GLOBAL DEFAULT     2 alias12

// Test that both % and @ are accepted.
        .global foo
        .type foo,%function
foo:

        .global bar
        .type bar,@object
bar:

        .type zed,@gnu_unique_object
zed:

obj:
        .global obj
        .type obj,@object
        .type obj,@notype

func:
        .global func
        .type func,@function
        .type func,@object

ifunc:
        .global ifunc
        .type ifunc,@gnu_indirect_function

tls:
        .global tls
        .type tls,@tls_object
        .type tls,@gnu_indirect_function

// Test that "<type>" is accepted.
tls_quoted:
        .global tls_quoted
        .type tls_quoted,"tls_object"

// Test that "<type>" is accepted.
tls_upper_case:
        .global tls_upper_case
        .type tls_upper_case,STT_TLS

// Test that .set doesnt downgrade the type:
// IFUNC > FUNC > OBJECT > NOTYPE
// TLS_OBJECT > OBJECT > NOTYPE
// also TLS_OBJECT is incompatible with IFUNC and FUNC

        .global sym1
        .type sym1, @gnu_indirect_function
alias1:
        .global alias1
        .type alias1, @function
        .set sym1, alias1

        .global sym2
        .type sym2, @gnu_indirect_function
alias2:
        .global alias2
        .type alias2, @object
        .set sym2, alias2

        .global sym3
        .type sym3, @gnu_indirect_function
alias3:
        .global alias3
        .type alias3, @notype
        .set sym3, alias3

        .global sym4
        .type sym4, @function
alias4:
        .global alias4
        .type alias4, @object
        .set sym4, alias4

        .global sym5
        .type sym5, @function
alias5:
        .global alias5
        .type alias5, @notype
        .set sym5, alias5

        .global sym6
        .type sym6, @object
alias6:
        .global alias6
        .type alias6, @notype
        .set sym6, alias6

        .global sym7
        .type sym7, @gnu_indirect_function
alias7:
        .global alias7
        .type alias7, @tls_object
        .set sym7, alias7

        .global sym8
        .type sym8, @function
        .global alias8
alias8:
        .type alias8, @tls_object
        .set sym8, alias8

        .global sym9
        .type sym9, @tls_object
alias9:
        .global alias9
        .type alias9, @object
        .set sym9, alias9

        .global sym10
        .type sym10, @tls_object
alias10:
        .global alias10
        .type alias10, @notype
        .set sym10, alias10

        .global sym11
        .type sym11, @tls_object
alias11:
        .global alias11
        .type alias11, @gnu_indirect_function
        .set sym11, alias11

        .global sym12
        .type sym12, @tls_object
alias12:        
        .global alias12
        .type alias12, @function
        .set sym12, alias12