class Type {} class NamedType : Type { string Name = name; } class Field { string Name = name; Type FieldType = type; } // Class to describe concrete structs specified by a standard. class Struct : NamedType { list Fields; } class EnumNameValue { string Name = name; string Value = value; } class Enum enumerations> : NamedType { list Enumerations = enumerations; } class PtrType : Type { Type PointeeType = type; } class ConstType : Type { Type UnqualifiedType = type; } class RestrictedPtrType : 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 Float16Type : NamedType<"_Float16">; def Float128Type : NamedType<"float128">; // Common types def VoidPtr : PtrType; def VoidPtrPtr : PtrType; def RestrictedVoidPtrPtr : RestrictedPtrType; def ConstVoidPtr : ConstType; def SizeTType : NamedType<"size_t">; def SizeTPtr : PtrType; def RestrictedSizeTPtr : RestrictedPtrType; 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; 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; 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; def ConstVoidRestrictedPtr : ConstType; def CharPtr : PtrType; def ConstCharPtr : ConstType; def CharRestrictedPtr : RestrictedPtrType; def CharRestrictedPtrPtr : RestrictedPtrType; def ConstCharRestrictedPtr : ConstType; def ConstCharRestrictedPtrPtr : PtrType; def OnceFlagType : NamedType<"once_flag">; def OnceFlagTypePtr : PtrType; // 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; def CndTType : NamedType<"cnd_t">; def CndTTypePtr : PtrType; def ThrdStartTType : NamedType<"thrd_start_t">; def ThrdTType : NamedType<"thrd_t">; def ThrdTTypePtr : PtrType; def IntPtr : PtrType; def RestrictedIntPtr : RestrictedPtrType; def FloatPtr : PtrType; def DoublePtr : PtrType; def Float16Ptr : PtrType; def Float128Ptr : PtrType; def UnsignedCharPtr : PtrType; def SigHandlerT : NamedType<"__sighandler_t">; def TimeTType : NamedType<"time_t">; def StructTimeSpec : NamedType<"struct timespec">; def StructTimeSpecPtr : PtrType; def ConstStructTimeSpecPtr : ConstType; def RestrictStructTimeSpecPtr : RestrictedPtrType; def ConstRestrictStructTimeSpecPtr : ConstType; def BSearchCompareT : NamedType<"__bsearchcompare_t">; def QSortCompareT : NamedType<"__qsortcompare_t">; def AtexitHandlerT : NamedType<"__atexithandler_t">; def FILE : NamedType<"FILE">; def FILEPtr : PtrType; def FILERestrictedPtr : RestrictedPtrType; def PThreadTType : NamedType<"pthread_t">; def PidT : NamedType<"pid_t">; def RestrictedPidTPtr : RestrictedPtrType; def StructRUsage : NamedType<"struct rusage">; def StructRUsagePtr : PtrType; def StructTimevalType : NamedType<"struct timeval">; def StructTimevalPtr : PtrType; def RestrictedStructTimevalPtr : RestrictedPtrType; 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; def EntryTypePtrPtr : PtrType; def MBStateTType : NamedType<"mbstate_t">; class Macro { string Name = name; } class EnumeratedNameValue { string Name = name; string Value = value; } class Annotation {} class RetValSpec annotations = []> { Type ReturnType = type; list Annotations = annotations; } class ArgSpec annotations = [], string name = ""> { Type ArgType = type; list 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 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 : FunctionAttr<"gnu", attr> {} class Cxx11FunctionAttr : 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 : FunctionAttr<"declspec", attr> {} class FunctionAttrSpec instances> { list Instances = instances; string Macro = macro; } class FunctionSpec args, list attrs = []> { string Name = name; RetValSpec Return = return; list Args = args; list Attributes = attrs; } class GuardedFunctionSpec args, string guard_macro> : FunctionSpec { string Guard = guard_macro; } class ObjectSpec { string Name = name; string Type = type; } class HeaderSpec macros = [], list types = [], list enumerations = [], list functions = [], list objects = []> { string Name = name; list Functions = functions; list Types = types; list Macros = macros; list Enumerations = enumerations; list Objects = objects; } class StandardSpec { string Name = name; list Headers; }