llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT--> @llvm/pr-subscribers-clang Author: Cyndy Ishida (cyndyishida) <details> <summary>Changes</summary> Projects like libc use mutually exclusive macros to compile files multiple times and then merge the result into the final library. For installapi to accept these, we'd need to parse the same declarations in different ways. This patch adds the basic pipelining for installapi to create the correct TBD file. * -Xproject allows: -fmodules, -fobjc-arc, fvisibility=hidden, prefix headers * -Xlabel allows: -D and -U settings * Error on 'private' and 'public' labels -X<label> * Xplatform allows: -iframework <path> This is to support the case where zippered frameworks want to pass in iOSSupport search path. --- Patch is 59.80 KiB, truncated to 20.00 KiB below, full version: https://github.com/llvm/llvm-project/pull/90686.diff 21 Files Affected: - (modified) clang/include/clang/Basic/DiagnosticInstallAPIKinds.td (+1) - (modified) clang/include/clang/InstallAPI/MachO.h (+2) - (added) clang/test/InstallAPI/Inputs/Foundation/Foundation.framework/Modules/module.modulemap (+3) - (added) clang/test/InstallAPI/Inputs/LibFoo/usr/include/foo.h (+20) - (added) clang/test/InstallAPI/Inputs/LibFoo/usr/include/public.h (+14) - (added) clang/test/InstallAPI/Inputs/Zippered/Zippered.framework/Headers/Zippered.h (+20) - (added) clang/test/InstallAPI/Inputs/Zippered/Zippered.framework/PrivateHeaders/Zippered_Private.h (+9) - (added) clang/test/InstallAPI/Inputs/Zippered/Zippered.tbd (+47) - (added) clang/test/InstallAPI/Inputs/Zippered/Zippered.yaml (+383) - (added) clang/test/InstallAPI/exclusive-passes-2.test (+58) - (added) clang/test/InstallAPI/exclusive-passes-platform.test (+277) - (added) clang/test/InstallAPI/exclusive-passes-zippered.test (+56) - (added) clang/test/InstallAPI/exclusive-passes.test (+54) - (added) clang/test/InstallAPI/invalid-exclusive-passes.test (+37) - (added) clang/test/InstallAPI/project-header-only-args.test (+81) - (modified) clang/tools/clang-installapi/ClangInstallAPI.cpp (+16-4) - (modified) clang/tools/clang-installapi/InstallAPIOpts.td (+30) - (modified) clang/tools/clang-installapi/Options.cpp (+162-25) - (modified) clang/tools/clang-installapi/Options.h (+12-1) - (modified) llvm/include/llvm/TextAPI/Utils.h (+9) - (modified) llvm/lib/TextAPI/Utils.cpp (+10) ``````````diff diff --git a/clang/include/clang/Basic/DiagnosticInstallAPIKinds.td b/clang/include/clang/Basic/DiagnosticInstallAPIKinds.td index 6896e0f5aa593c..674742431dcb2d 100644 --- a/clang/include/clang/Basic/DiagnosticInstallAPIKinds.td +++ b/clang/include/clang/Basic/DiagnosticInstallAPIKinds.td @@ -25,6 +25,7 @@ def err_unsupported_vendor : Error<"vendor '%0' is not supported: '%1'">; def err_unsupported_environment : Error<"environment '%0' is not supported: '%1'">; def err_unsupported_os : Error<"os '%0' is not supported: '%1'">; def err_cannot_read_input_list : Error<"could not read %select{alias list|filelist}0 '%1': %2">; +def err_invalid_label: Error<"label '%0' is reserved: use a different label name for -X<label>">; } // end of command line category. let CategoryName = "Verification" in { diff --git a/clang/include/clang/InstallAPI/MachO.h b/clang/include/clang/InstallAPI/MachO.h index 9da91a62e23311..1ea544412f4cd8 100644 --- a/clang/include/clang/InstallAPI/MachO.h +++ b/clang/include/clang/InstallAPI/MachO.h @@ -45,6 +45,8 @@ using SimpleSymbol = llvm::MachO::SimpleSymbol; using FileType = llvm::MachO::FileType; using PackedVersion = llvm::MachO::PackedVersion; using PathSeq = llvm::MachO::PathSeq; +using PlatformType = llvm::MachO::PlatformType; +using PathToPlatformSeq = llvm::MachO::PathToPlatformSeq; using Target = llvm::MachO::Target; using TargetList = llvm::MachO::TargetList; diff --git a/clang/test/InstallAPI/Inputs/Foundation/Foundation.framework/Modules/module.modulemap b/clang/test/InstallAPI/Inputs/Foundation/Foundation.framework/Modules/module.modulemap new file mode 100644 index 00000000000000..2bb688da1fa4b0 --- /dev/null +++ b/clang/test/InstallAPI/Inputs/Foundation/Foundation.framework/Modules/module.modulemap @@ -0,0 +1,3 @@ +framework module Foundation [system] { + umbrella header "Foundation.h" +} diff --git a/clang/test/InstallAPI/Inputs/LibFoo/usr/include/foo.h b/clang/test/InstallAPI/Inputs/LibFoo/usr/include/foo.h new file mode 100644 index 00000000000000..06ba35c177c88c --- /dev/null +++ b/clang/test/InstallAPI/Inputs/LibFoo/usr/include/foo.h @@ -0,0 +1,20 @@ +#if defined(NONDarwin) + #define LINUX "$linux" + #define DARWIN +#elif defined(Darwin) + #define LINUX + #define DARWIN "$darwin" +#else + #define LINUX + #define DARWIN +#endif + +#if defined(Foo) + #define FOO "FooLib$" +#else + #define FOO +#endif + +#define __STRING(x) #x +#define PLATFORM_ALIAS(sym) __asm("_" FOO __STRING(sym) DARWIN LINUX) +extern int foo() PLATFORM_ALIAS(foo); diff --git a/clang/test/InstallAPI/Inputs/LibFoo/usr/include/public.h b/clang/test/InstallAPI/Inputs/LibFoo/usr/include/public.h new file mode 100644 index 00000000000000..a7707d3709d366 --- /dev/null +++ b/clang/test/InstallAPI/Inputs/LibFoo/usr/include/public.h @@ -0,0 +1,14 @@ +#if defined(NONDarwin) +#define LINUX "$linux" +#define DARWIN +#elif defined(Darwin) +#define LINUX +#define DARWIN "$darwin" +#else +#define LINUX +#define DARWIN +#endif + +#define __STRING(x) #x +#define PLATFORM_ALIAS(sym) __asm("_" __STRING(sym) DARWIN LINUX) +extern int foo() PLATFORM_ALIAS(foo); diff --git a/clang/test/InstallAPI/Inputs/Zippered/Zippered.framework/Headers/Zippered.h b/clang/test/InstallAPI/Inputs/Zippered/Zippered.framework/Headers/Zippered.h new file mode 100644 index 00000000000000..ec1b03318be158 --- /dev/null +++ b/clang/test/InstallAPI/Inputs/Zippered/Zippered.framework/Headers/Zippered.h @@ -0,0 +1,20 @@ +#if !__is_target_environment(macabi) +typedef int MyType; +#else +typedef float MyType; +#endif + +extern MyType invalidAPI(); + +#define OS_AVAILABLE(_target, _availability) \ + __attribute__((availability(_target, _availability))) +extern int macOSAPI() OS_AVAILABLE(macos, introduced=10.14) OS_AVAILABLE(ios, unavailable); +extern int iOSAPI() OS_AVAILABLE(ios, introduced=12.0) OS_AVAILABLE(macos, unavailable); +extern int commonAPI() OS_AVAILABLE(macos, introduced=10.14) OS_AVAILABLE(ios, introduced=12.0); + +extern int obsoletedMacOSAPI() OS_AVAILABLE(macos, obsoleted=10.14) OS_AVAILABLE(ios, unavailable); + +#if !__is_target_environment(macabi) +extern int macOSAPI2() OS_AVAILABLE(macos, introduced = 10.14) + OS_AVAILABLE(ios, unavailable); +#endif diff --git a/clang/test/InstallAPI/Inputs/Zippered/Zippered.framework/PrivateHeaders/Zippered_Private.h b/clang/test/InstallAPI/Inputs/Zippered/Zippered.framework/PrivateHeaders/Zippered_Private.h new file mode 100644 index 00000000000000..2182a17275cb2a --- /dev/null +++ b/clang/test/InstallAPI/Inputs/Zippered/Zippered.framework/PrivateHeaders/Zippered_Private.h @@ -0,0 +1,9 @@ +#if __is_target_environment(macabi) +extern int a; +@class UIImage; +UIImage *image; +#else +extern long a; +@class NSImage; +NSImage *image; +#endif diff --git a/clang/test/InstallAPI/Inputs/Zippered/Zippered.tbd b/clang/test/InstallAPI/Inputs/Zippered/Zippered.tbd new file mode 100644 index 00000000000000..6ceb589ff0cda0 --- /dev/null +++ b/clang/test/InstallAPI/Inputs/Zippered/Zippered.tbd @@ -0,0 +1,47 @@ +{ + "main_library": { + "exported_symbols": [ + { + "data": { + "global": [ + "_image", "_a" + ] + }, + "text": { + "global": [ + "_invalidAPI", "_commonAPI" + ] + } + }, + { + "targets": [ "x86_64-maccatalyst" ], + "text": { + "global": [ "_iOSAPI"] + } + }, + { + "targets": [ "x86_64-macos" ], + "text": { + "global": [ "_macOSAPI", "_macOSAPI2" ] + } + } + ], + "flags": [ + { + "attributes": ["not_app_extension_safe"] + } + ], + "install_names": [ + {"name": "/System/Library/Frameworks/Zippered.framework/Versions/A/Zippered"} + ], + "target_info": [ + { + "min_deployment": "13", "target": "x86_64-macos" + }, + { + "min_deployment": "16", "target": "x86_64-maccatalyst" + } + ] + }, + "tapi_tbd_version": 5 +} diff --git a/clang/test/InstallAPI/Inputs/Zippered/Zippered.yaml b/clang/test/InstallAPI/Inputs/Zippered/Zippered.yaml new file mode 100644 index 00000000000000..284cd46416fdb6 --- /dev/null +++ b/clang/test/InstallAPI/Inputs/Zippered/Zippered.yaml @@ -0,0 +1,383 @@ +# Generated from: +# xcrun -sdk macosx clang --target=x86_64-apple-macos13 --target-variant=x86_64-apple-ios16-macabi +# -dynamiclib +# +#import "Zippered.h" +#import "Zippered_Private.h" +# MyType invalidAPI() { return 0; } +# int macOSAPI() { return 0; } +# int macOSAPI2() { return 0; } +# int iOSAPI() { return 0; } +# int commonAPI() { return 0; } +# int obsoletedMacOSAPI() { return 0; } +# +# #if __is_target_environment(macabi) +# int a = 0; +# UIImage *image = 0; +# #else +# long a = 0; +# NSImage *image = 0; +# #endif + +--- !mach-o +FileHeader: + magic: 0xFEEDFACF + cputype: 0x1000007 + cpusubtype: 0x3 + filetype: 0x6 + ncmds: 15 + sizeofcmds: 1584 + flags: 0x100085 + reserved: 0x0 +LoadCommands: + - cmd: LC_SEGMENT_64 + cmdsize: 312 + segname: __TEXT + vmaddr: 0 + vmsize: 12288 + fileoff: 0 + filesize: 12288 + maxprot: 5 + initprot: 5 + nsects: 3 + flags: 0 + Sections: + - sectname: __text + segname: __TEXT + addr: 0x1090 + size: 88 + offset: 0x1090 + align: 4 + reloff: 0x0 + nreloc: 0 + flags: 0x80000400 + reserved1: 0x0 + reserved2: 0x0 + reserved3: 0x0 + content: 554889E531C05DC30F1F840000000000554889E531C05DC30F1F840000000000554889E531C05DC30F1F840000000000554889E531C05DC30F1F840000000000554889E531C05DC30F1F840000000000554889E531C05DC3 + - sectname: __unwind_info + segname: __TEXT + addr: 0x10E8 + size: 4152 + offset: 0x10E8 + align: 2 + reloff: 0x0 + nreloc: 0 + flags: 0x0 + reserved1: 0x0 + reserved2: 0x0 + reserved3: 0x0 + content: 010000001C000000010000002000000000000000200000000200000000000001901000003800000038000000E81000000000000038000000030000000C0001001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 + - sectname: __eh_frame + segname: __TEXT + addr: 0x2120 + size: 24 + offset: 0x2120 + align: 3 + reloff: 0x0 + nreloc: 0 + flags: 0x6000000B + reserved1: 0x0 + reserved2: 0x0 + reserved3: 0x0 + content: 1400000000000000017A520001781001100C070890010000 + - cmd: LC_SEGMENT_64 + cmdsize: 152 + segname: __DATA_CONST + vmaddr: 12288 + vmsize: 4096 + fileoff: 12288 + filesize: 4096 + maxprot: 3 + initprot: 3 + nsects: 1 + flags: 16 + Sections: + - sectname: __objc_imageinfo + segname: __DATA_CONST + addr: 0x3000 + size: 8 + offset: 0x3000 + align: 0 + reloff: 0x0 + nreloc: 0 + flags: 0x0 + reserved1: 0x0 + reserved2: 0x0 + reserved3: 0x0 + content: '0000000040000000' + - cmd: LC_SEGMENT_64 + cmdsize: 152 + segname: __DATA + vmaddr: 16384 + vmsize: 4096 + fileoff: 16384 + filesize: 0 + maxprot: 3 + initprot: 3 + nsects: 1 + flags: 0 + Sections: + - sectname: __common + segname: __DATA + addr: 0x4000 + size: 16 + offset: 0x0 + align: 3 + reloff: 0x0 + nreloc: 0 + flags: 0x1 + reserved1: 0x0 + reserved2: 0x0 + reserved3: 0x0 + - cmd: LC_SEGMENT_64 + cmdsize: 72 + segname: __LINKEDIT + vmaddr: 20480 + vmsize: 384 + fileoff: 16384 + filesize: 384 + maxprot: 1 + initprot: 1 + nsects: 0 + flags: 0 + - cmd: LC_DYLD_INFO_ONLY + cmdsize: 48 + rebase_off: 0 + rebase_size: 0 + bind_off: 0 + bind_size: 0 + weak_bind_off: 0 + weak_bind_size: 0 + lazy_bind_off: 0 + lazy_bind_size: 0 + export_off: 16384 + export_size: 128 + - cmd: LC_SYMTAB + cmdsize: 24 + symoff: 16520 + nsyms: 9 + stroff: 16664 + strsize: 104 + - cmd: LC_DYSYMTAB + cmdsize: 80 + ilocalsym: 0 + nlocalsym: 0 + iextdefsym: 0 + nextdefsym: 8 + iundefsym: 8 + nundefsym: 1 + 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: 96 + dylib: + name: 24 + timestamp: 0 + current_version: 65536 + compatibility_version: 65536 + Content: '/System/Library/Frameworks/Zippered.framework/Versions/A/Zippered' + ZeroPadBytes: 7 + - cmd: LC_UUID + cmdsize: 24 + uuid: 4C4C44B0-5555-3144-A126-166C8AB77CD1 + - cmd: LC_BUILD_VERSION + cmdsize: 32 + platform: 1 + minos: 851968 + sdk: 983040 + ntools: 1 + Tools: + - tool: ... [truncated] `````````` </details> https://github.com/llvm/llvm-project/pull/90686 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits