//===- TextStub.cpp -------------------------------------------------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// // // Implements the text stub file reader/writer. // //===----------------------------------------------------------------------===// #include "TextAPIContext.h" #include "TextStubCommon.h" #include "llvm/ADT/BitmaskEnum.h" #include "llvm/ADT/SmallString.h" #include "llvm/ADT/StringRef.h" #include "llvm/Support/Allocator.h" #include "llvm/Support/SourceMgr.h" #include "llvm/Support/YAMLTraits.h" #include "llvm/Support/raw_ostream.h" #include "llvm/TextAPI/Architecture.h" #include "llvm/TextAPI/ArchitectureSet.h" #include "llvm/TextAPI/InterfaceFile.h" #include "llvm/TextAPI/PackedVersion.h" #include "llvm/TextAPI/TextAPIReader.h" #include "llvm/TextAPI/TextAPIWriter.h" #include <algorithm> #include <set> // clang-format off /* YAML Format specification. The TBD v1 format only support two level address libraries and is per definition application extension safe. --- # the tag !tapi-tbd-v1 is optional and # shouldn't be emitted to support older linker. archs: [ armv7, armv7s, arm64 ] # the list of architecture slices that are # supported by this file. platform: ios # Specifies the platform (macosx, ios, etc) install-name: /u/l/libfoo.dylib # current-version: 1.2.3 # Optional: defaults to 1.0 compatibility-version: 1.0 # Optional: defaults to 1.0 swift-version: 0 # Optional: defaults to 0 objc-constraint: none # Optional: defaults to none exports: # List of export sections ... Each export section is defined as following: - archs: [ arm64 ] # the list of architecture slices allowed-clients: [ client ] # Optional: List of clients re-exports: [ ] # Optional: List of re-exports symbols: [ _sym ] # Optional: List of symbols objc-classes: [] # Optional: List of Objective-C classes objc-ivars: [] # Optional: List of Objective C Instance # Variables weak-def-symbols: [] # Optional: List of weak defined symbols thread-local-symbols: [] # Optional: List of thread local symbols */ /* YAML Format specification. --- !tapi-tbd-v2 archs: [ armv7, armv7s, arm64 ] # the list of architecture slices that are # supported by this file. uuids: [ armv7:... ] # Optional: List of architecture and UUID pairs. platform: ios # Specifies the platform (macosx, ios, etc) flags: [] # Optional: install-name: /u/l/libfoo.dylib # current-version: 1.2.3 # Optional: defaults to 1.0 compatibility-version: 1.0 # Optional: defaults to 1.0 swift-version: 0 # Optional: defaults to 0 objc-constraint: retain_release # Optional: defaults to retain_release parent-umbrella: # Optional: exports: # List of export sections ... undefineds: # List of undefineds sections ... Each export section is defined as following: - archs: [ arm64 ] # the list of architecture slices allowed-clients: [ client ] # Optional: List of clients re-exports: [ ] # Optional: List of re-exports symbols: [ _sym ] # Optional: List of symbols objc-classes: [] # Optional: List of Objective-C classes objc-ivars: [] # Optional: List of Objective C Instance # Variables weak-def-symbols: [] # Optional: List of weak defined symbols thread-local-symbols: [] # Optional: List of thread local symbols Each undefineds section is defined as following: - archs: [ arm64 ] # the list of architecture slices symbols: [ _sym ] # Optional: List of symbols objc-classes: [] # Optional: List of Objective-C classes objc-ivars: [] # Optional: List of Objective C Instance Variables weak-ref-symbols: [] # Optional: List of weak defined symbols */ /* YAML Format specification. --- !tapi-tbd-v3 archs: [ armv7, armv7s, arm64 ] # the list of architecture slices that are # supported by this file. uuids: [ armv7:... ] # Optional: List of architecture and UUID pairs. platform: ios # Specifies the platform (macosx, ios, etc) flags: [] # Optional: install-name: /u/l/libfoo.dylib # current-version: 1.2.3 # Optional: defaults to 1.0 compatibility-version: 1.0 # Optional: defaults to 1.0 swift-abi-version: 0 # Optional: defaults to 0 objc-constraint: retain_release # Optional: defaults to retain_release parent-umbrella: # Optional: exports: # List of export sections ... undefineds: # List of undefineds sections ... Each export section is defined as following: - archs: [ arm64 ] # the list of architecture slices allowed-clients: [ client ] # Optional: List of clients re-exports: [ ] # Optional: List of re-exports symbols: [ _sym ] # Optional: List of symbols objc-classes: [] # Optional: List of Objective-C classes objc-eh-types: [] # Optional: List of Objective-C classes # with EH objc-ivars: [] # Optional: List of Objective C Instance # Variables weak-def-symbols: [] # Optional: List of weak defined symbols thread-local-symbols: [] # Optional: List of thread local symbols Each undefineds section is defined as following: - archs: [ arm64 ] # the list of architecture slices symbols: [ _sym ] # Optional: List of symbols objc-classes: [] # Optional: List of Objective-C classes objc-eh-types: [] # Optional: List of Objective-C classes # with EH objc-ivars: [] # Optional: List of Objective C Instance Variables weak-ref-symbols: [] # Optional: List of weak defined symbols */ /* YAML Format specification. --- !tapi-tbd tbd-version: 4 # The tbd version for format targets: [ armv7-ios, x86_64-maccatalyst ] # The list of applicable tapi supported target triples uuids: # Optional: List of target and UUID pairs. - target: armv7-ios value: ... - target: x86_64-maccatalyst value: ... flags: [] # Optional: install-name: /u/l/libfoo.dylib # current-version: 1.2.3 # Optional: defaults to 1.0 compatibility-version: 1.0 # Optional: defaults to 1.0 swift-abi-version: 0 # Optional: defaults to 0 parent-umbrella: # Optional: allowable-clients: - targets: [ armv7-ios ] # Optional: clients: [ clientA ] exports: # List of export sections ... re-exports: # List of reexport sections ... undefineds: # List of undefineds sections ... Each export and reexport section is defined as following: - targets: [ arm64-macos ] # The list of target triples associated with symbols symbols: [ _symA ] # Optional: List of symbols objc-classes: [] # Optional: List of Objective-C classes objc-eh-types: [] # Optional: List of Objective-C classes # with EH objc-ivars: [] # Optional: List of Objective C Instance # Variables weak-symbols: [] # Optional: List of weak defined symbols thread-local-symbols: [] # Optional: List of thread local symbols - targets: [ arm64-macos, x86_64-maccatalyst ] # Optional: Targets for applicable additional symbols symbols: [ _symB ] # Optional: List of symbols Each undefineds section is defined as following: - targets: [ arm64-macos ] # The list of target triples associated with symbols symbols: [ _symC ] # Optional: List of symbols objc-classes: [] # Optional: List of Objective-C classes objc-eh-types: [] # Optional: List of Objective-C classes # with EH objc-ivars: [] # Optional: List of Objective C Instance Variables weak-symbols: [] # Optional: List of weak defined symbols */ // clang-format on usingnamespacellvm; usingnamespacellvm::yaml; usingnamespacellvm::MachO; namespace { struct ExportSection { … }; struct UndefinedSection { … }; // Sections for direct target mapping in TBDv4 struct SymbolSection { … }; struct MetadataSection { … }; struct UmbrellaSection { … }; // UUID's for TBDv4 are mapped to target not arch struct UUIDv4 { … }; } // end anonymous namespace. LLVM_YAML_IS_FLOW_SEQUENCE_VECTOR(Architecture) LLVM_YAML_IS_SEQUENCE_VECTOR(ExportSection) LLVM_YAML_IS_SEQUENCE_VECTOR(UndefinedSection) // Specific to TBDv4 LLVM_YAML_IS_SEQUENCE_VECTOR(SymbolSection) LLVM_YAML_IS_SEQUENCE_VECTOR(MetadataSection) LLVM_YAML_IS_SEQUENCE_VECTOR(UmbrellaSection) LLVM_YAML_IS_FLOW_SEQUENCE_VECTOR(Target) LLVM_YAML_IS_SEQUENCE_VECTOR(UUIDv4) namespace llvm { namespace yaml { template <> struct MappingTraits<ExportSection> { … }; template <> struct MappingTraits<UndefinedSection> { … }; template <> struct MappingTraits<SymbolSection> { … }; template <> struct MappingTraits<UmbrellaSection> { … }; template <> struct MappingTraits<UUIDv4> { … }; template <> struct MappingContextTraits<MetadataSection, MetadataSection::Option> { … }; template <> struct ScalarBitSetTraits<TBDFlags> { … }; template <> struct ScalarTraits<Target> { … }; template <> struct MappingTraits<const InterfaceFile *> { … }; template <> struct DocumentListTraits<std::vector<const MachO::InterfaceFile *>> { … }; } // end namespace yaml. } // namespace llvm static void DiagHandler(const SMDiagnostic &Diag, void *Context) { … } Expected<FileType> TextAPIReader::canRead(MemoryBufferRef InputBuffer) { … } Expected<std::unique_ptr<InterfaceFile>> TextAPIReader::get(MemoryBufferRef InputBuffer) { … } Error TextAPIWriter::writeToStream(raw_ostream &OS, const InterfaceFile &File, const FileType FileKind, bool Compact) { … }