llvm/clang/test/InstallAPI/availability.test

; RUN: rm -rf %t
; RUN: split-file %s %t
; RUN: sed -e "s|DSTROOT|%/t|g" %t/inputs.json.in > %t/inputs.json

; RUN: yaml2obj %t/Availability.yaml -o %t/System/Library/Frameworks/Availability.framework/Availability

; RUN: clang-installapi \
; RUN: --target=x86_64-apple-macos13 \
; RUN: -install_name /System/Library/Frameworks/Availability.framework/Versions/A/Availability \
; RUN: -current_version 1 -compatibility_version 1 \
; RUN: -F %t/System/Library/Frameworks \
; RUN: %t/inputs.json -o %t/output.tbd \
; RUN: --verify-against=%t/System/Library/Frameworks/Availability.framework/Availability \
; RUN: --verify-mode=ErrorsOnly --filetype=tbd-v5 2> %t/errors.log
; RUN: FileCheck -allow-empty -check-prefix=ERRORSONLY -input-file %t/errors.log %s

; RUN: clang-installapi \
; RUN: --target=x86_64-apple-macos13 \
; RUN: -install_name /System/Library/Frameworks/Availability.framework/Versions/A/Availability \
; RUN: -current_version 1 -compatibility_version 1 \
; RUN: -F %t/System/Library/Frameworks \
; RUN: %t/inputs.json -o %t/output-warnings.tbd \
; RUN: --verify-against=%t/System/Library/Frameworks/Availability.framework/Availability \
; RUN: --verify-mode=ErrorsAndWarnings 2> %t/errors.log
; RUN: FileCheck -check-prefixes=VIOLATIONS,ERRORSANDWARNINGS -input-file %t/errors.log %s

; RUN: not clang-installapi \
; RUN: --target=x86_64-apple-macos13 \
; RUN: -install_name /System/Library/Frameworks/Availability.framework/Versions/A/Availability \
; RUN: -current_version 1 -compatibility_version 1 \
; RUN: -F %t/System/Library/Frameworks \
; RUN: %t/inputs.json -o %t/output-pedantic.tbd \
; RUN: --verify-against=%t/System/Library/Frameworks/Availability.framework/Availability \
; RUN: --verify-mode=Pedantic 2> %t/errors.log
; RUN: FileCheck -check-prefixes=VIOLATIONS,PEDANTIC -input-file %t/errors.log %s

; ERRORSONLY-NOT:        error
; ERRORSONLY-NOT:        warning

; ERRORSANDWARNINGS-NOT: error
; VIOLATIONS:            warning: violations found for x86_64-apple-macos
; VIOLATIONS:            declaration 'publicGlobalVariable' is marked unavailable, but symbol is exported in dynamic library
; VIOLATIONS-NEXT:       extern int publicGlobalVariable NS_AVAILABLE
; VIOLATIONS:            declaration 'Foo' is marked unavailable, but symbol is exported in dynamic library
; VIOLATIONS-NEXT:       @interface Foo : NSObject
; VIOLATIONS:            declaration 'publicGlobalVariable3' is marked unavailable, but symbol is exported in dynamic library
; VIOLATIONS-NEXT:       extern int publicGlobalVariable3 __attribute__((unavailable))
; VIOLATIONS:            declaration 'privateGlobalVariable' is marked unavailable, but symbol is exported in dynamic library
; VIOLATIONS-NEXT:       extern int privateGlobalVariable;

; ERRORSANDWARNINGS-NOT: warning 
; PEDANTIC-NOT:          error

;--- inputs.json.in
{
  "headers": [ {
    "path" : "DSTROOT/System/Library/Frameworks/Availability.framework/Headers/Availability.h",
    "type" : "public"
  }, 
  {
    "path" : "DSTROOT/System/Library/Frameworks/Availability.framework/PrivateHeaders/AvailabilityPrivate.h",
    "type" : "private"
  }
  ],
  "version": "3"
}

;--- System/Library/Frameworks/Availability.framework/Headers/AV_Defines.h
#ifndef AV_DEFINES
#define AV_DEFINES 

#define NS_AVAILABLE __attribute__((availability(macosx,introduced=NA)))

@interface NSObject 
@end

#endif //AV_DEFINES

;--- System/Library/Frameworks/Availability.framework/PrivateHeaders/AvailabilityPrivate.h
#import <Availability/AV_Defines.h>
// Test private global variable.
NS_AVAILABLE 
extern int privateGlobalVariable;

;--- System/Library/Frameworks/Availability.framework/Headers/Availability.h
#import <Availability/AV_Defines.h>
extern int publicGlobalVariable NS_AVAILABLE;

// Test public ObjC class
NS_AVAILABLE
@interface Foo : NSObject
@end

// Test unavailable attribute.
#ifdef __i386__
#define UNAVAILABLE_I386 __attribute__((unavailable))
#else
#define UNAVAILABLE_I386
#endif
extern int publicGlobalVariable2 UNAVAILABLE_I386;

extern int publicGlobalVariable3 __attribute__((unavailable))
__attribute__((availability(macosx, introduced = 10.9)));

// Test obsoleted with exported variable.
extern int publicGlobalVariable4 __attribute__((availability(
    macosx, introduced = 10.9, deprecated = 10.10, obsoleted = 10.11)));
// Test obsoleted with non-existent variable.
extern int publicGlobalVariable5 __attribute__((availability(
    macosx, introduced = 10.9, deprecated = 10.10, obsoleted = 10.11)));

#ifdef __i386__
#define OBSOLETE_I386 __attribute__((availability(macosx, obsoleted = 10.11)))
#else
#define OBSOLETE_I386
#endif
extern int publicGlobalVariable6 OBSOLETE_I386;


/// Created from: 
// int publicGlobalVariable; int privateGlobalVariable;
// 
// @implementation Foo
// @end
// 
// #ifndef __i386__
// int publicGlobalVariable2;
// #endif
// 
// int publicGlobalVariable3;
// int publicGlobalVariable4;
// 
// #ifndef __i386__
// int publicGlobalVariable6;
// #endif
;--- Availability.yaml
--- !mach-o
FileHeader:
  magic:           0xFEEDFACF
  cputype:         0x1000007
  cpusubtype:      0x3
  filetype:        0x6
  ncmds:           14
  sizeofcmds:      1312
  flags:           0x100085
  reserved:        0x0
LoadCommands:
  - cmd:             LC_SEGMENT_64
    cmdsize:         232
    segname:         __TEXT
    vmaddr:          0
    vmsize:          8192
    fileoff:         0
    filesize:        8192
    maxprot:         5
    initprot:        5
    nsects:          2
    flags:           0
    Sections:
      - sectname:        __text
        segname:         __TEXT
        addr:            0x1140
        size:            0
        offset:          0x1140
        align:           0
        reloff:          0x0
        nreloc:          0
        flags:           0x80000000
        reserved1:       0x0
        reserved2:       0x0
        reserved3:       0x0
        content:         ''
      - sectname:        __cstring
        segname:         __TEXT
        addr:            0x1140
        size:            4
        offset:          0x1140
        align:           0
        reloff:          0x0
        nreloc:          0
        flags:           0x2
        reserved1:       0x0
        reserved2:       0x0
        reserved3:       0x0
        content:         466F6F00
  - cmd:             LC_SEGMENT_64
    cmdsize:         232
    segname:         __DATA_CONST
    vmaddr:          8192
    vmsize:          4096
    fileoff:         8192
    filesize:        4096
    maxprot:         3
    initprot:        3
    nsects:          2
    flags:           16
    Sections:
      - sectname:        __objc_classlist
        segname:         __DATA_CONST
        addr:            0x2000
        size:            8
        offset:          0x2000
        align:           3
        reloff:          0x0
        nreloc:          0
        flags:           0x10000000
        reserved1:       0x0
        reserved2:       0x0
        reserved3:       0x0
        content:         B830000000000000
      - sectname:        __objc_imageinfo
        segname:         __DATA_CONST
        addr:            0x2008
        size:            8
        offset:          0x2008
        align:           0
        reloff:          0x0
        nreloc:          0
        flags:           0x0
        reserved1:       0x0
        reserved2:       0x0
        reserved3:       0x0
        content:         '0000000040000000'
  - cmd:             LC_SEGMENT_64
    cmdsize:         312
    segname:         __DATA
    vmaddr:          12288
    vmsize:          4096
    fileoff:         12288
    filesize:        4096
    maxprot:         3
    initprot:        3
    nsects:          3
    flags:           0
    Sections:
      - sectname:        __objc_const
        segname:         __DATA
        addr:            0x3000
        size:            144
        offset:          0x3000
        align:           3
        reloff:          0x0
        nreloc:          0
        flags:           0x0
        reserved1:       0x0
        reserved2:       0x0
        reserved3:       0x0
        content:         '010000002800000028000000000000000000000000000000401100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000008000000000000000000000000000000401100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
      - sectname:        __objc_data
        segname:         __DATA
        addr:            0x3090
        size:            80
        offset:          0x3090
        align:           3
        reloff:          0x0
        nreloc:          0
        flags:           0x0
        reserved1:       0x0
        reserved2:       0x0
        reserved3:       0x0
        content:         '0000000000000000000000000000000000000000000000000000000000000000003000000000000090300000000000000000000000000000000000000000000000000000000000004830000000000000'
      - sectname:        __common
        segname:         __DATA
        addr:            0x30E0
        size:            24
        offset:          0x0
        align:           2
        reloff:          0x0
        nreloc:          0
        flags:           0x1
        reserved1:       0x0
        reserved2:       0x0
        reserved3:       0x0
  - cmd:             LC_SEGMENT_64
    cmdsize:         72
    segname:         __LINKEDIT
    vmaddr:          16384
    vmsize:          824
    fileoff:         16384
    filesize:        824
    maxprot:         1
    initprot:        1
    nsects:          0
    flags:           0
  - cmd:             LC_DYLD_INFO_ONLY
    cmdsize:         48
    rebase_off:      16384
    rebase_size:     16
    bind_off:        16400
    bind_size:       104
    weak_bind_off:   0
    weak_bind_size:  0
    lazy_bind_off:   0
    lazy_bind_size:  0
    export_off:      16504
    export_size:     152
  - cmd:             LC_SYMTAB
    cmdsize:         24
    symoff:          16664
    nsyms:           14
    stroff:          16888
    strsize:         320
  - cmd:             LC_DYSYMTAB
    cmdsize:         80
    ilocalsym:       0
    nlocalsym:       2
    iextdefsym:      2
    nextdefsym:      8
    iundefsym:       10
    nundefsym:       4
    tocoff:          0
    ntoc:            0
    modtaboff:       0
    nmodtab:         0
    extrefsymoff:    0
    nextrefsyms:     0
    indirectsymoff:  0
    nindirectsyms:   0
    extreloff:       0
    nextrel:         0
    locreloff:       0
    nlocrel:         0
  - cmd:             LC_ID_DYLIB
    cmdsize:         112
    dylib:
      name:            24
      timestamp:       0
      current_version: 65536
      compatibility_version: 65536
    Content:         '/System/Library/Frameworks/Availability.framework/Versions/A/Availability'
    ZeroPadBytes:    7
  - cmd:             LC_UUID
    cmdsize:         24
    uuid:            4C4C4470-5555-3144-A142-4EE44DA08D2F
  - cmd:             LC_BUILD_VERSION
    cmdsize:         32
    platform:        1
    minos:           851968
    sdk:             983040
    ntools:          1
    Tools:
      - tool:            4
        version:         1245184
  - cmd:             LC_LOAD_DYLIB
    cmdsize:         56
    dylib:
      name:            24
      timestamp:       0
      current_version: 14942208
      compatibility_version: 65536
    Content:         '/usr/lib/libobjc.A.dylib'
    ZeroPadBytes:    8
  - cmd:             LC_LOAD_DYLIB
    cmdsize:         56
    dylib:
      name:            24
      timestamp:       0
      current_version: 88473600
      compatibility_version: 65536
    Content:         '/usr/lib/libSystem.B.dylib'
    ZeroPadBytes:    6
  - cmd:             LC_FUNCTION_STARTS
    cmdsize:         16
    dataoff:         16656
    datasize:        8
  - cmd:             LC_DATA_IN_CODE
    cmdsize:         16
    dataoff:         16664
    datasize:        0
LinkEditData:
  RebaseOpcodes:
    - Opcode:          REBASE_OPCODE_SET_TYPE_IMM
      Imm:             1
    - Opcode:          REBASE_OPCODE_SET_SEGMENT_AND_OFFSET_ULEB
      Imm:             1
      ExtraData:       [ 0x0 ]
    - Opcode:          REBASE_OPCODE_DO_REBASE_IMM_TIMES
      Imm:             1
    - Opcode:          REBASE_OPCODE_SET_SEGMENT_AND_OFFSET_ULEB
      Imm:             2
      ExtraData:       [ 0x18 ]
    - Opcode:          REBASE_OPCODE_DO_REBASE_ULEB_TIMES_SKIPPING_ULEB
      Imm:             0
      ExtraData:       [ 0x2, 0x40 ]
    - Opcode:          REBASE_OPCODE_ADD_ADDR_IMM_SCALED
      Imm:             1
    - Opcode:          REBASE_OPCODE_DO_REBASE_IMM_TIMES
      Imm:             2
    - Opcode:          REBASE_OPCODE_ADD_ADDR_IMM_SCALED
      Imm:             3
    - Opcode:          REBASE_OPCODE_DO_REBASE_IMM_TIMES
      Imm:             1
    - Opcode:          REBASE_OPCODE_DONE
      Imm:             0
  BindOpcodes:
    - Opcode:          BIND_OPCODE_SET_SYMBOL_TRAILING_FLAGS_IMM
      Imm:             0
      Symbol:          '_OBJC_METACLASS_$_NSObject'
    - Opcode:          BIND_OPCODE_SET_TYPE_IMM
      Imm:             1
      Symbol:          ''
    - Opcode:          BIND_OPCODE_SET_DYLIB_ORDINAL_IMM
      Imm:             1
      Symbol:          ''
    - Opcode:          BIND_OPCODE_SET_SEGMENT_AND_OFFSET_ULEB
      Imm:             2
      ULEBExtraData:   [ 0x90 ]
      Symbol:          ''
    - Opcode:          BIND_OPCODE_DO_BIND
      Imm:             0
      Symbol:          ''
    - Opcode:          BIND_OPCODE_DO_BIND
      Imm:             0
      Symbol:          ''
    - Opcode:          BIND_OPCODE_SET_SYMBOL_TRAILING_FLAGS_IMM
      Imm:             0
      Symbol:          __objc_empty_cache
    - Opcode:          BIND_OPCODE_SET_TYPE_IMM
      Imm:             1
      Symbol:          ''
    - Opcode:          BIND_OPCODE_DO_BIND
      Imm:             0
      Symbol:          ''
    - Opcode:          BIND_OPCODE_ADD_ADDR_ULEB
      Imm:             0
      ULEBExtraData:   [ 0x20 ]
      Symbol:          ''
    - Opcode:          BIND_OPCODE_DO_BIND
      Imm:             0
      Symbol:          ''
    - Opcode:          BIND_OPCODE_SET_SYMBOL_TRAILING_FLAGS_IMM
      Imm:             0
      Symbol:          '_OBJC_CLASS_$_NSObject'
    - Opcode:          BIND_OPCODE_SET_TYPE_IMM
      Imm:             1
      Symbol:          ''
    - Opcode:          BIND_OPCODE_ADD_ADDR_ULEB
      Imm:             0
      ULEBExtraData:   [ 0xFFFFFFFFFFFFFFF0 ]
      Symbol:          ''
    - Opcode:          BIND_OPCODE_DO_BIND
      Imm:             0
      Symbol:          ''
    - Opcode:          BIND_OPCODE_DONE
      Imm:             0
      Symbol:          ''
  ExportTrie:
    TerminalSize:    0
    NodeOffset:      0
    Name:            ''
    Flags:           0x0
    Address:         0x0
    Other:           0x0
    ImportName:      ''
    Children:
      - TerminalSize:    0
        NodeOffset:      5
        Name:            _
        Flags:           0x0
        Address:         0x0
        Other:           0x0
        ImportName:      ''
        Children:
          - TerminalSize:    0
            NodeOffset:      17
            Name:            OBJC_
            Flags:           0x0
            Address:         0x0
            Other:           0x0
            ImportName:      ''
            Children:
              - TerminalSize:    3
                NodeOffset:      49
                Name:            'METACLASS_$_Foo'
                Flags:           0x0
                Address:         0x3090
                Other:           0x0
                ImportName:      ''
              - TerminalSize:    3
                NodeOffset:      54
                Name:            'CLASS_$_Foo'
                Flags:           0x0
                Address:         0x30B8
                Other:           0x0
                ImportName:      ''
          - TerminalSize:    0
            NodeOffset:      59
            Name:            p
            Flags:           0x0
            Address:         0x0
            Other:           0x0
            ImportName:      ''
            Children:
              - TerminalSize:    3
                NodeOffset:      104
                Name:            rivateGlobalVariable
                Flags:           0x0
                Address:         0x30E0
                Other:           0x0
                ImportName:      ''
              - TerminalSize:    3
                NodeOffset:      109
                Name:            ublicGlobalVariable
                Flags:           0x0
                Address:         0x30E4
                Other:           0x0
                ImportName:      ''
                Children:
                  - TerminalSize:    3
                    NodeOffset:      130
                    Name:            '4'
                    Flags:           0x0
                    Address:         0x30F0
                    Other:           0x0
                    ImportName:      ''
                  - TerminalSize:    3
                    NodeOffset:      135
                    Name:            '3'
                    Flags:           0x0
                    Address:         0x30EC
                    Other:           0x0
                    ImportName:      ''
                  - TerminalSize:    3
                    NodeOffset:      140
                    Name:            '2'
                    Flags:           0x0
                    Address:         0x30E8
                    Other:           0x0
                    ImportName:      ''
                  - TerminalSize:    3
                    NodeOffset:      145
                    Name:            '6'
                    Flags:           0x0
                    Address:         0x30F4
                    Other:           0x0
                    ImportName:      ''
  NameList:
    - n_strx:          2
      n_type:          0xE
      n_sect:          5
      n_desc:          0
      n_value:         12288
    - n_strx:          28
      n_type:          0xE
      n_sect:          5
      n_desc:          0
      n_value:         12360
    - n_strx:          50
      n_type:          0xF
      n_sect:          7
      n_desc:          0
      n_value:         12512
    - n_strx:          73
      n_type:          0xF
      n_sect:          7
      n_desc:          0
      n_value:         12516
    - n_strx:          95
      n_type:          0xF
      n_sect:          7
      n_desc:          0
      n_value:         12520
    - n_strx:          118
      n_type:          0xF
      n_sect:          7
      n_desc:          0
      n_value:         12524
    - n_strx:          141
      n_type:          0xF
      n_sect:          7
      n_desc:          0
      n_value:         12528
    - n_strx:          164
      n_type:          0xF
      n_sect:          7
      n_desc:          0
      n_value:         12532
    - n_strx:          187
      n_type:          0xF
      n_sect:          6
      n_desc:          0
      n_value:         12432
    - n_strx:          209
      n_type:          0xF
      n_sect:          6
      n_desc:          0
      n_value:         12472
    - n_strx:          227
      n_type:          0x1
      n_sect:          0
      n_desc:          256
      n_value:         0
    - n_strx:          250
      n_type:          0x1
      n_sect:          0
      n_desc:          256
      n_value:         0
    - n_strx:          277
      n_type:          0x1
      n_sect:          0
      n_desc:          256
      n_value:         0
    - n_strx:          296
      n_type:          0x1
      n_sect:          0
      n_desc:          512
      n_value:         0
  StringTable:
    - ' '
    - '__OBJC_METACLASS_RO_$_Foo'
    - '__OBJC_CLASS_RO_$_Foo'
    - _privateGlobalVariable
    - _publicGlobalVariable
    - _publicGlobalVariable2
    - _publicGlobalVariable3
    - _publicGlobalVariable4
    - _publicGlobalVariable6
    - '_OBJC_METACLASS_$_Foo'
    - '_OBJC_CLASS_$_Foo'
    - '_OBJC_CLASS_$_NSObject'
    - '_OBJC_METACLASS_$_NSObject'
    - __objc_empty_cache
    - dyld_stub_binder
    - ''
    - ''
    - ''
    - ''
    - ''
    - ''
    - ''
...