diff options
author | Dimitry Andric <dim@FreeBSD.org> | 2021-06-13 19:31:46 +0000 |
---|---|---|
committer | Dimitry Andric <dim@FreeBSD.org> | 2021-06-13 19:37:19 +0000 |
commit | e8d8bef961a50d4dc22501cde4fb9fb0be1b2532 (patch) | |
tree | 94f04805f47bb7c59ae29690d8952b6074fff602 /contrib/llvm-project/clang/lib/APINotes/APINotesFormat.h | |
parent | bb130ff39747b94592cb26d71b7cb097b9a4ea6b (diff) | |
parent | b60736ec1405bb0a8dd40989f67ef4c93da068ab (diff) | |
download | src-e8d8bef961a50d4dc22501cde4fb9fb0be1b2532.tar.gz src-e8d8bef961a50d4dc22501cde4fb9fb0be1b2532.zip |
Diffstat (limited to 'contrib/llvm-project/clang/lib/APINotes/APINotesFormat.h')
-rw-r--r-- | contrib/llvm-project/clang/lib/APINotes/APINotesFormat.h | 255 |
1 files changed, 255 insertions, 0 deletions
diff --git a/contrib/llvm-project/clang/lib/APINotes/APINotesFormat.h b/contrib/llvm-project/clang/lib/APINotes/APINotesFormat.h new file mode 100644 index 000000000000..6b76ecfc2567 --- /dev/null +++ b/contrib/llvm-project/clang/lib/APINotes/APINotesFormat.h @@ -0,0 +1,255 @@ +//===-- APINotesWriter.h - API Notes Writer ---------------------*- C++ -*-===// +// +// 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 +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_CLANG_LIB_APINOTES_APINOTESFORMAT_H +#define LLVM_CLANG_LIB_APINOTES_APINOTESFORMAT_H + +#include "llvm/ADT/PointerEmbeddedInt.h" +#include "llvm/Bitcode/BitcodeConvenience.h" + +namespace clang { +namespace api_notes { +/// Magic number for API notes files. +const unsigned char API_NOTES_SIGNATURE[] = {0xE2, 0x9C, 0xA8, 0x01}; + +/// API notes file major version number. +const uint16_t VERSION_MAJOR = 0; + +/// API notes file minor version number. +/// +/// When the format changes IN ANY WAY, this number should be incremented. +const uint16_t VERSION_MINOR = 24; // EnumExtensibility + FlagEnum + +using IdentifierID = llvm::PointerEmbeddedInt<unsigned, 31>; +using IdentifierIDField = llvm::BCVBR<16>; + +using SelectorID = llvm::PointerEmbeddedInt<unsigned, 31>; +using SelectorIDField = llvm::BCVBR<16>; + +/// The various types of blocks that can occur within a API notes file. +/// +/// These IDs must \em not be renumbered or reordered without incrementing +/// VERSION_MAJOR. +enum BlockID { + /// The control block, which contains all of the information that needs to + /// be validated prior to committing to loading the API notes file. + /// + /// \sa control_block + CONTROL_BLOCK_ID = llvm::bitc::FIRST_APPLICATION_BLOCKID, + + /// The identifier data block, which maps identifier strings to IDs. + IDENTIFIER_BLOCK_ID, + + /// The Objective-C context data block, which contains information about + /// Objective-C classes and protocols. + OBJC_CONTEXT_BLOCK_ID, + + /// The Objective-C property data block, which maps Objective-C + /// (class name, property name) pairs to information about the + /// property. + OBJC_PROPERTY_BLOCK_ID, + + /// The Objective-C property data block, which maps Objective-C + /// (class name, selector, is_instance_method) tuples to information + /// about the method. + OBJC_METHOD_BLOCK_ID, + + /// The Objective-C selector data block, which maps Objective-C + /// selector names (# of pieces, identifier IDs) to the selector ID + /// used in other tables. + OBJC_SELECTOR_BLOCK_ID, + + /// The global variables data block, which maps global variable names to + /// information about the global variable. + GLOBAL_VARIABLE_BLOCK_ID, + + /// The (global) functions data block, which maps global function names to + /// information about the global function. + GLOBAL_FUNCTION_BLOCK_ID, + + /// The tag data block, which maps tag names to information about + /// the tags. + TAG_BLOCK_ID, + + /// The typedef data block, which maps typedef names to information about + /// the typedefs. + TYPEDEF_BLOCK_ID, + + /// The enum constant data block, which maps enumerator names to + /// information about the enumerators. + ENUM_CONSTANT_BLOCK_ID, +}; + +namespace control_block { +// These IDs must \em not be renumbered or reordered without incrementing +// VERSION_MAJOR. +enum { + METADATA = 1, + MODULE_NAME = 2, + MODULE_OPTIONS = 3, + SOURCE_FILE = 4, +}; + +using MetadataLayout = + llvm::BCRecordLayout<METADATA, // ID + llvm::BCFixed<16>, // Module format major version + llvm::BCFixed<16> // Module format minor version + >; + +using ModuleNameLayout = llvm::BCRecordLayout<MODULE_NAME, + llvm::BCBlob // Module name + >; + +using ModuleOptionsLayout = + llvm::BCRecordLayout<MODULE_OPTIONS, + llvm::BCFixed<1> // SwiftInferImportAsMember + >; + +using SourceFileLayout = llvm::BCRecordLayout<SOURCE_FILE, + llvm::BCVBR<16>, // file size + llvm::BCVBR<16> // creation time + >; +} // namespace control_block + +namespace identifier_block { +enum { + IDENTIFIER_DATA = 1, +}; + +using IdentifierDataLayout = llvm::BCRecordLayout< + IDENTIFIER_DATA, // record ID + llvm::BCVBR<16>, // table offset within the blob (see below) + llvm::BCBlob // map from identifier strings to decl kinds / decl IDs + >; +} // namespace identifier_block + +namespace objc_context_block { +enum { + OBJC_CONTEXT_ID_DATA = 1, + OBJC_CONTEXT_INFO_DATA = 2, +}; + +using ObjCContextIDLayout = + llvm::BCRecordLayout<OBJC_CONTEXT_ID_DATA, // record ID + llvm::BCVBR<16>, // table offset within the blob (see + // below) + llvm::BCBlob // map from ObjC class names/protocol (as + // IDs) to context IDs + >; + +using ObjCContextInfoLayout = llvm::BCRecordLayout< + OBJC_CONTEXT_INFO_DATA, // record ID + llvm::BCVBR<16>, // table offset within the blob (see below) + llvm::BCBlob // map from ObjC context IDs to context information. + >; +} // namespace objc_context_block + +namespace objc_property_block { +enum { + OBJC_PROPERTY_DATA = 1, +}; + +using ObjCPropertyDataLayout = llvm::BCRecordLayout< + OBJC_PROPERTY_DATA, // record ID + llvm::BCVBR<16>, // table offset within the blob (see below) + llvm::BCBlob // map from ObjC (class name, property name) pairs to + // ObjC property information + >; +} // namespace objc_property_block + +namespace objc_method_block { +enum { + OBJC_METHOD_DATA = 1, +}; + +using ObjCMethodDataLayout = + llvm::BCRecordLayout<OBJC_METHOD_DATA, // record ID + llvm::BCVBR<16>, // table offset within the blob (see + // below) + llvm::BCBlob // map from ObjC (class names, selector, + // is-instance-method) tuples to ObjC + // method information + >; +} // namespace objc_method_block + +namespace objc_selector_block { +enum { + OBJC_SELECTOR_DATA = 1, +}; + +using ObjCSelectorDataLayout = + llvm::BCRecordLayout<OBJC_SELECTOR_DATA, // record ID + llvm::BCVBR<16>, // table offset within the blob (see + // below) + llvm::BCBlob // map from (# pieces, identifier IDs) to + // Objective-C selector ID. + >; +} // namespace objc_selector_block + +namespace global_variable_block { +enum { GLOBAL_VARIABLE_DATA = 1 }; + +using GlobalVariableDataLayout = llvm::BCRecordLayout< + GLOBAL_VARIABLE_DATA, // record ID + llvm::BCVBR<16>, // table offset within the blob (see below) + llvm::BCBlob // map from name to global variable information + >; +} // namespace global_variable_block + +namespace global_function_block { +enum { GLOBAL_FUNCTION_DATA = 1 }; + +using GlobalFunctionDataLayout = llvm::BCRecordLayout< + GLOBAL_FUNCTION_DATA, // record ID + llvm::BCVBR<16>, // table offset within the blob (see below) + llvm::BCBlob // map from name to global function information + >; +} // namespace global_function_block + +namespace tag_block { +enum { TAG_DATA = 1 }; + +using TagDataLayout = + llvm::BCRecordLayout<TAG_DATA, // record ID + llvm::BCVBR<16>, // table offset within the blob (see + // below) + llvm::BCBlob // map from name to tag information + >; +}; // namespace tag_block + +namespace typedef_block { +enum { TYPEDEF_DATA = 1 }; + +using TypedefDataLayout = + llvm::BCRecordLayout<TYPEDEF_DATA, // record ID + llvm::BCVBR<16>, // table offset within the blob (see + // below) + llvm::BCBlob // map from name to typedef information + >; +}; // namespace typedef_block + +namespace enum_constant_block { +enum { ENUM_CONSTANT_DATA = 1 }; + +using EnumConstantDataLayout = + llvm::BCRecordLayout<ENUM_CONSTANT_DATA, // record ID + llvm::BCVBR<16>, // table offset within the blob (see + // below) + llvm::BCBlob // map from name to enumerator information + >; +} // namespace enum_constant_block + +/// A stored Objective-C selector. +struct StoredObjCSelector { + unsigned NumPieces; + llvm::SmallVector<IdentifierID, 2> Identifiers; +}; +} // namespace api_notes +} // namespace clang + +#endif |