; 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 // Test private global variable. NS_AVAILABLE extern int privateGlobalVariable; ;--- System/Library/Frameworks/Availability.framework/Headers/Availability.h #import 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 - '' - '' - '' - '' - '' - '' - '' ...