#ifndef LLVM_CLANG_LIB_APINOTES_APINOTESFORMAT_H
#define LLVM_CLANG_LIB_APINOTES_APINOTESFORMAT_H
#include "clang/APINotes/Types.h"
#include "llvm/ADT/PointerEmbeddedInt.h"
#include "llvm/Bitcode/BitcodeConvenience.h"
namespace clang {
namespace api_notes {
const unsigned char API_NOTES_SIGNATURE[] = {0xE2, 0x9C, 0xA8, 0x01};
const uint16_t VERSION_MAJOR = 0;
const uint16_t VERSION_MINOR = 27;
const uint8_t kSwiftCopyable = 1;
const uint8_t kSwiftNonCopyable = 2;
using IdentifierID = llvm::PointerEmbeddedInt<unsigned, 31>;
using IdentifierIDField = llvm::BCVBR<16>;
using SelectorID = llvm::PointerEmbeddedInt<unsigned, 31>;
using SelectorIDField = llvm::BCVBR<16>;
enum BlockID {
CONTROL_BLOCK_ID = llvm::bitc::FIRST_APPLICATION_BLOCKID,
IDENTIFIER_BLOCK_ID,
OBJC_CONTEXT_BLOCK_ID,
OBJC_PROPERTY_BLOCK_ID,
OBJC_METHOD_BLOCK_ID,
CXX_METHOD_BLOCK_ID,
OBJC_SELECTOR_BLOCK_ID,
GLOBAL_VARIABLE_BLOCK_ID,
GLOBAL_FUNCTION_BLOCK_ID,
TAG_BLOCK_ID,
TYPEDEF_BLOCK_ID,
ENUM_CONSTANT_BLOCK_ID,
};
namespace control_block {
enum {
METADATA = 1,
MODULE_NAME = 2,
MODULE_OPTIONS = 3,
SOURCE_FILE = 4,
};
using MetadataLayout =
llvm::BCRecordLayout<METADATA,
llvm::BCFixed<16>,
llvm::BCFixed<16>
>;
using ModuleNameLayout = llvm::BCRecordLayout<MODULE_NAME,
llvm::BCBlob
>;
using ModuleOptionsLayout =
llvm::BCRecordLayout<MODULE_OPTIONS,
llvm::BCFixed<1>
>;
using SourceFileLayout = llvm::BCRecordLayout<SOURCE_FILE,
llvm::BCVBR<16>,
llvm::BCVBR<16>
>;
}
namespace identifier_block {
enum {
IDENTIFIER_DATA = 1,
};
using IdentifierDataLayout = llvm::BCRecordLayout<
IDENTIFIER_DATA,
llvm::BCVBR<16>,
llvm::BCBlob
>;
}
namespace context_block {
enum {
CONTEXT_ID_DATA = 1,
CONTEXT_INFO_DATA = 2,
};
using ContextIDLayout =
llvm::BCRecordLayout<CONTEXT_ID_DATA,
llvm::BCVBR<16>,
llvm::BCBlob
>;
using ContextInfoLayout = llvm::BCRecordLayout<
CONTEXT_INFO_DATA,
llvm::BCVBR<16>,
llvm::BCBlob
>;
}
namespace objc_property_block {
enum {
OBJC_PROPERTY_DATA = 1,
};
using ObjCPropertyDataLayout = llvm::BCRecordLayout<
OBJC_PROPERTY_DATA,
llvm::BCVBR<16>,
llvm::BCBlob
>;
}
namespace objc_method_block {
enum {
OBJC_METHOD_DATA = 1,
};
using ObjCMethodDataLayout =
llvm::BCRecordLayout<OBJC_METHOD_DATA,
llvm::BCVBR<16>,
llvm::BCBlob
>;
}
namespace cxx_method_block {
enum {
CXX_METHOD_DATA = 1,
};
using CXXMethodDataLayout =
llvm::BCRecordLayout<CXX_METHOD_DATA,
llvm::BCVBR<16>,
llvm::BCBlob
>;
}
namespace objc_selector_block {
enum {
OBJC_SELECTOR_DATA = 1,
};
using ObjCSelectorDataLayout =
llvm::BCRecordLayout<OBJC_SELECTOR_DATA,
llvm::BCVBR<16>,
llvm::BCBlob
>;
}
namespace global_variable_block {
enum { GLOBAL_VARIABLE_DATA = 1 };
using GlobalVariableDataLayout = llvm::BCRecordLayout<
GLOBAL_VARIABLE_DATA,
llvm::BCVBR<16>,
llvm::BCBlob
>;
}
namespace global_function_block {
enum { GLOBAL_FUNCTION_DATA = 1 };
using GlobalFunctionDataLayout = llvm::BCRecordLayout<
GLOBAL_FUNCTION_DATA,
llvm::BCVBR<16>,
llvm::BCBlob
>;
}
namespace tag_block {
enum { TAG_DATA = 1 };
using TagDataLayout =
llvm::BCRecordLayout<TAG_DATA,
llvm::BCVBR<16>,
llvm::BCBlob
>;
}
namespace typedef_block {
enum { TYPEDEF_DATA = 1 };
using TypedefDataLayout =
llvm::BCRecordLayout<TYPEDEF_DATA,
llvm::BCVBR<16>,
llvm::BCBlob
>;
}
namespace enum_constant_block {
enum { ENUM_CONSTANT_DATA = 1 };
using EnumConstantDataLayout =
llvm::BCRecordLayout<ENUM_CONSTANT_DATA,
llvm::BCVBR<16>,
llvm::BCBlob
>;
}
struct StoredObjCSelector {
unsigned NumArgs;
llvm::SmallVector<IdentifierID, 2> Identifiers;
};
struct ContextTableKey {
uint32_t parentContextID;
uint8_t contextKind;
uint32_t contextID;
ContextTableKey() : parentContextID(-1), contextKind(-1), contextID(-1) {}
ContextTableKey(uint32_t parentContextID, uint8_t contextKind,
uint32_t contextID)
: parentContextID(parentContextID), contextKind(contextKind),
contextID(contextID) {}
ContextTableKey(std::optional<ContextID> ParentContextID, ContextKind Kind,
uint32_t ContextID)
: parentContextID(ParentContextID ? ParentContextID->Value : -1),
contextKind(static_cast<uint8_t>(Kind)), contextID(ContextID) {}
ContextTableKey(std::optional<Context> ParentContext, ContextKind Kind,
uint32_t ContextID)
: ContextTableKey(ParentContext ? std::make_optional(ParentContext->id)
: std::nullopt,
Kind, ContextID) {}
llvm::hash_code hashValue() const {
return llvm::hash_value(
std::tuple{parentContextID, contextKind, contextID});
}
};
inline bool operator==(const ContextTableKey &lhs, const ContextTableKey &rhs) {
return lhs.parentContextID == rhs.parentContextID &&
lhs.contextKind == rhs.contextKind && lhs.contextID == rhs.contextID;
}
struct SingleDeclTableKey {
uint32_t parentContextID;
uint32_t nameID;
SingleDeclTableKey() : parentContextID(-1), nameID(-1) {}
SingleDeclTableKey(uint32_t ParentContextID, uint32_t NameID)
: parentContextID(ParentContextID), nameID(NameID) {}
SingleDeclTableKey(std::optional<Context> ParentCtx, IdentifierID NameID)
: parentContextID(ParentCtx ? ParentCtx->id.Value
: static_cast<uint32_t>(-1)),
nameID(NameID) {}
llvm::hash_code hashValue() const {
return llvm::hash_value(std::make_pair(parentContextID, nameID));
}
};
inline bool operator==(const SingleDeclTableKey &lhs,
const SingleDeclTableKey &rhs) {
return lhs.parentContextID == rhs.parentContextID && lhs.nameID == rhs.nameID;
}
}
}
namespace llvm {
template <> struct DenseMapInfo<clang::api_notes::StoredObjCSelector> {
typedef DenseMapInfo<unsigned> UnsignedInfo;
static inline clang::api_notes::StoredObjCSelector getEmptyKey() {
return clang::api_notes::StoredObjCSelector{UnsignedInfo::getEmptyKey(),
{}};
}
static inline clang::api_notes::StoredObjCSelector getTombstoneKey() {
return clang::api_notes::StoredObjCSelector{UnsignedInfo::getTombstoneKey(),
{}};
}
static unsigned
getHashValue(const clang::api_notes::StoredObjCSelector &Selector) {
auto hash = llvm::hash_value(Selector.NumArgs);
hash = hash_combine(hash, Selector.Identifiers.size());
for (auto piece : Selector.Identifiers)
hash = hash_combine(hash, static_cast<unsigned>(piece));
return hash;
}
static bool isEqual(const clang::api_notes::StoredObjCSelector &LHS,
const clang::api_notes::StoredObjCSelector &RHS) {
return LHS.NumArgs == RHS.NumArgs && LHS.Identifiers == RHS.Identifiers;
}
};
template <> struct DenseMapInfo<clang::api_notes::ContextTableKey> {
static inline clang::api_notes::ContextTableKey getEmptyKey() {
return clang::api_notes::ContextTableKey();
}
static inline clang::api_notes::ContextTableKey getTombstoneKey() {
return clang::api_notes::ContextTableKey{
DenseMapInfo<uint32_t>::getTombstoneKey(),
DenseMapInfo<uint8_t>::getTombstoneKey(),
DenseMapInfo<uint32_t>::getTombstoneKey()};
}
static unsigned getHashValue(const clang::api_notes::ContextTableKey &value) {
return value.hashValue();
}
static bool isEqual(const clang::api_notes::ContextTableKey &lhs,
const clang::api_notes::ContextTableKey &rhs) {
return lhs == rhs;
}
};
template <> struct DenseMapInfo<clang::api_notes::SingleDeclTableKey> {
static inline clang::api_notes::SingleDeclTableKey getEmptyKey() {
return clang::api_notes::SingleDeclTableKey();
}
static inline clang::api_notes::SingleDeclTableKey getTombstoneKey() {
return clang::api_notes::SingleDeclTableKey{
DenseMapInfo<uint32_t>::getTombstoneKey(),
DenseMapInfo<uint32_t>::getTombstoneKey()};
}
static unsigned
getHashValue(const clang::api_notes::SingleDeclTableKey &value) {
return value.hashValue();
}
static bool isEqual(const clang::api_notes::SingleDeclTableKey &lhs,
const clang::api_notes::SingleDeclTableKey &rhs) {
return lhs == rhs;
}
};
}
#endif