mirror of
https://github.com/llvm/llvm-project.git
synced 2025-04-28 03:16:05 +00:00

This PR implements a part of WG14 N2653: - Define C23 char8_t - Define C11 char16_t - Define C11 char32_t Missing goals are: - The type of UTF-8 character literals is changed from unsigned char to char8_t. (Since UTF-8 character literals already have type unsigned char, this is not a semantic change). - New mbrtoc8() and c8rtomb() functions declared in <uchar.h> enable conversions between multibyte characters and UTF-8. - A new ATOMIC_CHAR8_T_LOCK_FREE macro. - A new atomic_char8_t typedef name.
244 lines
7.6 KiB
TableGen
244 lines
7.6 KiB
TableGen
class Type {}
|
|
|
|
class NamedType<string name> : Type {
|
|
string Name = name;
|
|
}
|
|
|
|
class Field<string name, Type type> {
|
|
string Name = name;
|
|
Type FieldType = type;
|
|
}
|
|
|
|
// Class to describe concrete structs specified by a standard.
|
|
class Struct<string name> : NamedType<name> {
|
|
list<Field> Fields;
|
|
}
|
|
|
|
class EnumNameValue<string name, string value = "__default_enum_value__"> {
|
|
string Name = name;
|
|
string Value = value;
|
|
}
|
|
|
|
class Enum<string name, list<EnumNameValue> enumerations> : NamedType<name> {
|
|
list<EnumNameValue> Enumerations = enumerations;
|
|
}
|
|
|
|
class PtrType<Type type> : Type {
|
|
Type PointeeType = type;
|
|
}
|
|
|
|
class ConstType<Type type> : Type {
|
|
Type UnqualifiedType = type;
|
|
}
|
|
|
|
class RestrictedPtrType<Type type> : Type {
|
|
Type PointeeType = type;
|
|
}
|
|
|
|
// Builtin types.
|
|
def VarArgType : NamedType<"...">;
|
|
def VaListType : NamedType<"va_list">;
|
|
def VoidType : NamedType<"void">;
|
|
def IntType : NamedType<"int">;
|
|
def UnsignedIntType : NamedType<"unsigned int">;
|
|
def LongType : NamedType<"long">;
|
|
def UnsignedLongType : NamedType<"unsigned long">;
|
|
def LongLongType : NamedType<"long long">;
|
|
def UnsignedLongLongType : NamedType<"unsigned long long">;
|
|
def FloatType : NamedType<"float">;
|
|
def DoubleType : NamedType<"double">;
|
|
def LongDoubleType : NamedType<"long double">;
|
|
def CharType : NamedType<"char">;
|
|
def UnsignedCharType : NamedType<"unsigned char">;
|
|
def UnsignedShortType : NamedType<"unsigned short">;
|
|
def BoolType : NamedType<"bool">;
|
|
|
|
def Float128Type : NamedType<"float128">;
|
|
|
|
// Common types
|
|
def VoidPtr : PtrType<VoidType>;
|
|
def VoidPtrPtr : PtrType<VoidPtr>;
|
|
def RestrictedVoidPtrPtr : RestrictedPtrType<VoidPtr>;
|
|
def ConstVoidPtr : ConstType<VoidPtr>;
|
|
|
|
def SizeTType : NamedType<"size_t">;
|
|
def SizeTPtr : PtrType<SizeTType>;
|
|
def RestrictedSizeTPtr : RestrictedPtrType<SizeTType>;
|
|
|
|
def Char8TType : NamedType<"char8_t">;
|
|
def Char16TType : NamedType<"char16_t">;
|
|
def Char32TType : NamedType<"char32_t">;
|
|
def WCharType : NamedType<"wchar_t">;
|
|
def WIntType : NamedType<"wint_t">;
|
|
|
|
def LongDoublePtr : PtrType<LongDoubleType>;
|
|
|
|
def IntMaxTType : NamedType<"intmax_t">;
|
|
def UIntMaxTType : NamedType<"uintmax_t">;
|
|
|
|
def UInt16Type : NamedType<"uint16_t">;
|
|
def UInt32Type : NamedType<"uint32_t">;
|
|
|
|
def OffTType : NamedType<"off_t">;
|
|
def OffTPtr : PtrType<OffTType>;
|
|
def SSizeTType : NamedType<"ssize_t">;
|
|
|
|
// _Noreturn is really not a type, but it is convenient to treat it as a type.
|
|
def NoReturn : NamedType<"_Noreturn void">;
|
|
|
|
//types moved from stdc.td
|
|
def VoidRestrictedPtr : RestrictedPtrType<VoidType>;
|
|
def ConstVoidRestrictedPtr : ConstType<VoidRestrictedPtr>;
|
|
|
|
def CharPtr : PtrType<CharType>;
|
|
def ConstCharPtr : ConstType<CharPtr>;
|
|
def CharRestrictedPtr : RestrictedPtrType<CharType>;
|
|
def CharRestrictedPtrPtr : RestrictedPtrType<CharPtr>;
|
|
def ConstCharRestrictedPtr : ConstType<CharRestrictedPtr>;
|
|
def ConstCharRestrictedPtrPtr : PtrType<ConstCharRestrictedPtr>;
|
|
|
|
def OnceFlagType : NamedType<"once_flag">;
|
|
def OnceFlagTypePtr : PtrType<OnceFlagType>;
|
|
// TODO(sivachandra): Remove this non-standard type when a formal
|
|
// way to describe callable types is available.
|
|
def CallOnceFuncType : NamedType<"__call_once_func_t">;
|
|
def MtxTType : NamedType<"mtx_t">;
|
|
def MtxTTypePtr : PtrType<MtxTType>;
|
|
def CndTType : NamedType<"cnd_t">;
|
|
def CndTTypePtr : PtrType<CndTType>;
|
|
def ThrdStartTType : NamedType<"thrd_start_t">;
|
|
def ThrdTType : NamedType<"thrd_t">;
|
|
def ThrdTTypePtr : PtrType<ThrdTType>;
|
|
|
|
def IntPtr : PtrType<IntType>;
|
|
def RestrictedIntPtr : RestrictedPtrType<IntType>;
|
|
def FloatPtr : PtrType<FloatType>;
|
|
def DoublePtr : PtrType<DoubleType>;
|
|
def Float128Ptr : PtrType<Float128Type>;
|
|
def UnsignedCharPtr : PtrType<UnsignedCharType>;
|
|
|
|
def SigHandlerT : NamedType<"__sighandler_t">;
|
|
|
|
def TimeTType : NamedType<"time_t">;
|
|
|
|
def StructTimeSpec : NamedType<"struct timespec">;
|
|
def StructTimeSpecPtr : PtrType<StructTimeSpec>;
|
|
def ConstStructTimeSpecPtr : ConstType<StructTimeSpecPtr>;
|
|
|
|
def BSearchCompareT : NamedType<"__bsearchcompare_t">;
|
|
def QSortCompareT : NamedType<"__qsortcompare_t">;
|
|
|
|
def AtexitHandlerT : NamedType<"__atexithandler_t">;
|
|
|
|
def FILE : NamedType<"FILE">;
|
|
def FILEPtr : PtrType<FILE>;
|
|
def FILERestrictedPtr : RestrictedPtrType<FILE>;
|
|
|
|
def PThreadTType : NamedType<"pthread_t">;
|
|
|
|
def PidT : NamedType<"pid_t">;
|
|
def RestrictedPidTPtr : RestrictedPtrType<PidT>;
|
|
|
|
def StructRUsage : NamedType<"struct rusage">;
|
|
def StructRUsagePtr : PtrType<StructRUsage>;
|
|
|
|
def StructTimevalType : NamedType<"struct timeval">;
|
|
def StructTimevalPtr : PtrType<StructTimevalType>;
|
|
def RestrictedStructTimevalPtr : RestrictedPtrType<StructTimevalType>;
|
|
|
|
def SuSecondsT : NamedType<"suseconds_t">;
|
|
|
|
//added because __assert_fail needs it.
|
|
def UnsignedType : NamedType<"unsigned">;
|
|
|
|
def ActionType : NamedType<"ACTION">;
|
|
def EntryType : NamedType<"ENTRY">;
|
|
def EntryTypePtr : PtrType<EntryType>;
|
|
def EntryTypePtrPtr : PtrType<EntryTypePtr>;
|
|
|
|
def MBStateTType : NamedType<"mbstate_t">;
|
|
|
|
class Macro<string name> {
|
|
string Name = name;
|
|
}
|
|
|
|
class EnumeratedNameValue<string name, string value = "__default__"> {
|
|
string Name = name;
|
|
string Value = value;
|
|
}
|
|
|
|
class Annotation {}
|
|
|
|
class RetValSpec<Type type, list<Annotation> annotations = []> {
|
|
Type ReturnType = type;
|
|
list<Annotation> Annotations = annotations;
|
|
}
|
|
|
|
class ArgSpec<Type type, list<Annotation> annotations = [], string name = ""> {
|
|
Type ArgType = type;
|
|
list<Annotation> Annotations = annotations;
|
|
string Name = name;
|
|
}
|
|
|
|
// The following classes are used to describe function attributes.
|
|
// In the future, we may consider supporting parameter attributes as well.
|
|
// https://clang.llvm.org/docs/AttributeReference.html
|
|
class FunctionAttr<string style, string attr> {
|
|
string Attr = attr;
|
|
// The style of the attribute, e.g. "gnu", "cxx11", "declspec".
|
|
// - "gnu" is for GNU-style attributes: __attribute__((...))
|
|
// - "cxx11" is for C++11-style attributes: [[...]]
|
|
// - "declspec" is for Microsoft-style attributes: __declspec(...)
|
|
string Style = style;
|
|
|
|
// For the time being, we are only interested in identifer-like attributes.
|
|
// We can extend this to support function-like attributes if needed.
|
|
// For example, in the future, we can #define __LIBC_ATTRIBUTE_NODISCARD(...) [[nodiscard(__VA_ARGS__)]]
|
|
// int FunctionLike = 0;
|
|
}
|
|
class GnuFunctionAttr<string attr> : FunctionAttr<"gnu", attr> {}
|
|
class Cxx11FunctionAttr<string attr, string namespace> : FunctionAttr<"cxx11", attr> {
|
|
// The namespace of the attribute, e.g. "gnu" or "clang". Empty string means there is no namespace.
|
|
string Namespace = namespace;
|
|
}
|
|
class DeclspecFunctionAttr<string attr> : FunctionAttr<"declspec", attr> {}
|
|
class FunctionAttrSpec<string macro, list<FunctionAttr> instances> {
|
|
list<FunctionAttr> Instances = instances;
|
|
string Macro = macro;
|
|
}
|
|
|
|
class FunctionSpec<string name, RetValSpec return, list<ArgSpec> args, list<FunctionAttrSpec> attrs = []> {
|
|
string Name = name;
|
|
RetValSpec Return = return;
|
|
list<ArgSpec> Args = args;
|
|
list<FunctionAttrSpec> Attributes = attrs;
|
|
}
|
|
|
|
class GuardedFunctionSpec<string name, RetValSpec return, list<ArgSpec> args, string guard_macro> : FunctionSpec<name, return, args> {
|
|
string Guard = guard_macro;
|
|
}
|
|
|
|
class ObjectSpec<string name, string type> {
|
|
string Name = name;
|
|
string Type = type;
|
|
}
|
|
|
|
class HeaderSpec<string name,
|
|
list<Macro> macros = [],
|
|
list<Type> types = [],
|
|
list<EnumeratedNameValue> enumerations = [],
|
|
list<FunctionSpec> functions = [],
|
|
list<ObjectSpec> objects = []> {
|
|
string Name = name;
|
|
list<FunctionSpec> Functions = functions;
|
|
list<Type> Types = types;
|
|
list<Macro> Macros = macros;
|
|
list<EnumeratedNameValue> Enumerations = enumerations;
|
|
list<ObjectSpec> Objects = objects;
|
|
}
|
|
|
|
class StandardSpec<string name> {
|
|
string Name = name;
|
|
list<HeaderSpec> Headers;
|
|
}
|