/* This header file defines a set of macros to be used in the construction of parameter passing and/or va_arg code gen tests during the pre-processing stage. It is included inside abitest.h. The following macros are defined here: LAST_ARG ARG DOTS ANON LAST_ANON PTR PTR_ANON LAST_ANONPTR These macros are given different definitions depending on which one of the following macros is defined. AARCH64_MACRO_DEF_CHECK_INCOMING_ARGS AARCH64_MACRO_DEF_GEN_PARAM_TYPE_LIST AARCH64_MACRO_DEF_GEN_ARGUMENT_LIST AARCH64_VARIADIC_MACRO_DEF_GEN_PARAM_TYPE_LIST AARCH64_VARIADIC_MACRO_DEF_GEN_PARAM_TYPE_LIST_WITH_IDENT AARCH64_VARIADIC_MACRO_DEF_ASSIGN_LOCAL_VARS_WITH_ARGS AARCH64_VARIADIC_MACRO_DEF_GEN_ARGUMENT_LIST Do not define more than one of the above macros. */ /* AARCH64_MACRO_DEF_CHECK_INCOMING_ARGS Define macros to check the incoming arguments. */ #ifdef AARCH64_MACRO_DEF_CHECK_INCOMING_ARGS #undef LAST_ARG #undef ARG #undef DOTS #undef ANON #undef LAST_ANON #undef PTR #undef PTR_ANON #undef LAST_ANONPTR #undef ANON_PROMOTED /* Generate memcmp to check if the incoming args have the expected values. */ #define LAST_ARG_NONFLAT(type, val, offset, layout, ...) \ { \ type __x = val; \ DUMP_ARG(type,val); \ if (validate_memory (&__x, stack + offset, sizeof (type), layout) != 0) \ abort(); \ } #define LAST_ARG(type,val,offset,...) LAST_ARG_NONFLAT (type, val, offset, \ flat,__VA_ARGS__) #define ARG_NONFLAT(type,val,offset,layout,...) LAST_ARG_NONFLAT (type, val, \ offset, \ layout, \ __VA_ARGS__) #define ARG(type,val,offset,...) LAST_ARG_NONFLAT(type, val, offset, \ flat, __VA_ARGS__) #define ANON(type,val,offset,...) LAST_ARG(type, val, offset, __VA_ARGS__) #define LAST_ANON(type,val,offset,...) LAST_ARG(type, val, offset, __VA_ARGS__) #define ANON_PROMOTED(type,val,type_promoted, val_promoted, offset,...) \ ANON(type_promoted, val_promoted, offset, __VA_ARGS__) /* Composite larger than 16 bytes is replaced by a pointer to a copy prepared by the caller, so here we extrat the pointer, deref it and compare the content with that of the original one. */ #define PTR(type, val, offset, ...) { \ type * ptr; \ DUMP_ARG(type,val); \ ptr = *(type **)(stack + offset); \ if (memcmp (ptr, &val, sizeof (type)) != 0) abort (); \ } #define PTR_ANON(type, val, offset, ...) PTR(type, val, offset, __VA_ARGS__) #define LAST_ANONPTR(type, val, offset, ...) PTR(type, val, offset, __VA_ARGS__) #define DOTS #endif /* AARCH64_MACRO_DEF_CHECK_INCOMING_ARGS */ /* AARCH64_MACRO_DEF_GEN_PARAM_TYPE_LIST Define macros to generate parameter type list. */ #ifdef AARCH64_MACRO_DEF_GEN_PARAM_TYPE_LIST #undef LAST_ARG #undef ARG #undef DOTS #undef ANON #undef LAST_ANON #undef PTR #undef PTR_ANON #undef LAST_ANONPTR /* Generate parameter type list (without identifiers). */ #define LAST_ARG(type,val,offset) type #define LAST_ARG_NONFLAT(type, val, offset, layout) type #define ARG(type,val,offset) LAST_ARG(type, val, offset), #define ARG_NONFLAT(type, val, offset, layout) LAST_ARG (type, val, offset), #define DOTS ... #define ANON(type,val, offset) #define LAST_ANON(type,val, offset) #define PTR(type, val, offset) LAST_ARG(type, val, offset), #define PTR_ANON(type, val, offset) #define LAST_ANONPTR(type, val, offset) #endif /* AARCH64_MACRO_DEF_GEN_PARAM_TYPE_LIST */ /* AARCH64_MACRO_DEF_GEN_ARGUMENT_LIST Define macros to generate argument list. */ #ifdef AARCH64_MACRO_DEF_GEN_ARGUMENT_LIST #undef LAST_ARG #undef ARG #undef DOTS #undef ANON #undef LAST_ANON #undef PTR #undef PTR_ANON #undef LAST_ANONPTR #undef ANON_PROMOTED /* Generate the argument list; use VAL as the argument name. */ #define LAST_ARG(type,val,offset,...) val #define LAST_ARG_NONFLAT(type,val,offset,layout,...) val #define ARG(type,val,offset,...) LAST_ARG(type, val, offset, __VA_ARGS__), #define ARG_NONFLAT(type, val, offset, layout,...) LAST_ARG (type, val, \ offset, \ __VA_ARGS__), #define DOTS #define LAST_ANON(type,val,offset,...) LAST_ARG(type, val, offset, __VA_ARGS__) #define ANON(type,val,offset,...) LAST_ARG(type, val, offset, __VA_ARGS__), #define PTR(type, val,offset,...) LAST_ARG(type, val, offset, __VA_ARGS__), #define PTR_ANON(type, val,offset,...) LAST_ARG(type, val, offset, __VA_ARGS__), #define LAST_ANONPTR(type, val, offset,...) LAST_ARG(type, val, offset, __VA_ARGS__) #define ANON_PROMOTED(type,val,type_promoted, val_promoted, offset,...) \ LAST_ARG(type, val, offset, __VA_ARGS__), #endif /* AARCH64_MACRO_DEF_GEN_ARGUMENT_LIST */ /* AARCH64_VARIADIC_MACRO_DEF_GEN_PARAM_TYPE_LIST Define variadic macros to generate parameter type list. */ #ifdef AARCH64_VARIADIC_MACRO_DEF_GEN_PARAM_TYPE_LIST #undef LAST_ARG #undef ARG #undef DOTS #undef ANON #undef LAST_ANON #undef PTR #undef PTR_ANON #undef LAST_ANONPTR #undef ANON_PROMOTED /* Generate parameter type list (without identifiers). */ #define LAST_ARG(type,val,offset,...) type #define LAST_ARG_NONFLAT(type, val, offset, layout, ...) type #define ARG(type,val,offset,...) LAST_ARG(type, val, offset, __VA_ARGS__), #define ARG_NONFLAT(type, val, offset, layout, ...) LAST_ARG (type, val, \ offset, \ __VA_ARGS__), #define DOTS #define ANON(type,val, offset,...) ARG(type,val,offset, __VA_ARGS__) #define LAST_ANON(type,val, offset,...) LAST_ARG(type,val, offset, __VA_ARGS__) #define PTR(type, val, offset,...) LAST_ARG(type, val, offset, __VA_ARGS__), #define PTR_ANON(type, val, offset,...) PTR(type, val, offset, __VA_ARGS__) #define LAST_ANONPTR(type, val, offset,...) LAST_ARG(type, val, offset, __VA_ARGS__) #define ANON_PROMOTED(type,val,type_promoted, val_promoted, offset,...) \ LAST_ARG(type_promoted, val_promoted, offset, __VA_ARGS__), #endif /* AARCH64_VARIADIC_MACRO_DEF_GEN_PARAM_TYPE_LIST */ /* AARCH64_VARIADIC_MACRO_DEF_GEN_PARAM_TYPE_LIST_WITH_IDENT Define variadic macros to generate parameter type list with identifiers. */ #ifdef AARCH64_VARIADIC_MACRO_DEF_GEN_PARAM_TYPE_LIST_WITH_IDENT #undef LAST_ARG #undef ARG #undef DOTS #undef ANON #undef LAST_ANON #undef PTR #undef PTR_ANON #undef LAST_ANONPTR #undef ANON_PROMOTED /* Generate parameter type list (with identifiers). The identifiers are named with prefix _f and suffix of the value of __VA_ARGS__. */ #define LAST_ARG(type,val,offset,...) type _f##__VA_ARGS__ #define LAST_ARG_NONFLAT(type, val, offset, layout, ...) type _f##__VA_ARGS__ #define ARG(type,val,offset,...) LAST_ARG(type, val, offset, __VA_ARGS__), #define ARG_NONFLAT(type, val, offset, layout, ...) LAST_ARG (type, val, \ offset, \ __VA_ARGS__), #define DOTS ... #define ANON(type,val, offset,...) #define LAST_ANON(type,val, offset,...) #define PTR(type, val, offset,...) LAST_ARG(type, val, offset, __VA_ARGS__), #define PTR_ANON(type, val, offset,...) #define LAST_ANONPTR(type, val, offset,...) #define ANON_PROMOTED(type,val,type_promoted, val_promoted, offset,...) #endif /* AARCH64_VARIADIC_MACRO_DEF_GEN_PARAM_TYPE_LIST_WITH_IDENT */ /* AARCH64_VARIADIC_MACRO_DEF_ASSIGN_LOCAL_VARS_WITH_ARGS Define variadic macros to generate assignment from the function incoming arguments to local variables. */ #ifdef AARCH64_VARIADIC_MACRO_DEF_ASSIGN_LOCAL_VARS_WITH_ARGS #undef LAST_ARG #undef ARG #undef DOTS #undef ANON #undef LAST_ANON #undef PTR #undef PTR_ANON #undef LAST_ANONPTR #undef ANON_PROMOTED /* Generate assignment statements. For named args, direct assignment from the formal parameter is generated; for unnamed args, va_arg is used. The names of the local variables start with _x and end with the value of __VA_ARGS__. */ #define LAST_ARG(type,val,offset,...) type _x##__VA_ARGS__ = _f##__VA_ARGS__; #define LAST_ARG_NONFLAT(type, val, offset, layout, ...) \ type _x##__VA_ARGS__ = _f##__VA_ARGS__; #define ARG(type,val,offset,...) LAST_ARG(type, val, offset, __VA_ARGS__) #define ARG_NONFLAT(type,val,offset,layout,...) \ LAST_ARG (type, val, offset, __VA_ARGS__) #define ANON(type,val,offset,...) type _x##__VA_ARGS__ = va_arg (ap, type); #define LAST_ANON(type,val,offset,...) ANON(type, val, offset, __VA_ARGS__) #define PTR(type, val,offset,...) ARG(type, val, offset, __VA_ARGS__) #define PTR_ANON(type, val, offset,...) ANON(type, val,offset, __VA_ARGS__) #define LAST_ANONPTR(type, val, offset,...) ANON(type, val, offset, __VA_ARGS__) #define ANON_PROMOTED(type,val,type_promoted, val_promoted, offset,...) \ ANON(type_promoted, val_promoted, offset, __VA_ARGS__) #define DOTS #endif /* AARCH64_VARIADIC_MACRO_DEF_ASSIGN_LOCAL_VARS_WITH_ARGS */ /* AARCH64_VARIADIC_MACRO_DEF_GEN_ARGUMENT_LIST Define variadic macros to generate argument list using the variables generated during AARCH64_VARIADIC_MACRO_DEF_ASSIGN_LOCAL_VARS_WITH_ARGS. */ #ifdef AARCH64_VARIADIC_MACRO_DEF_GEN_ARGUMENT_LIST #undef LAST_ARG #undef ARG #undef DOTS #undef ANON #undef LAST_ANON #undef PTR #undef PTR_ANON #undef LAST_ANONPTR #undef ANON_PROMOTED /* Generate the argument list; the names start with _x and end with the value of __VA_ARGS__. All arguments (named or unnamed) in stdarg_func are passed to myfunc as named arguments. */ #define LAST_ARG(type,val,offset,...) _x##__VA_ARGS__ #define LAST_ARG_NONFLAT(type, val, offset, layout, ...) _x##__VA_ARGS__ #define ARG(type,val,offset,...) LAST_ARG(type, val, offset, __VA_ARGS__), #define ARG_NONFLAT(type, val, offset, layout, ...) \ LAST_ARG_NONFLAT (type, val, offset, layout, __VA_ARGS__), #define DOTS #define LAST_ANON(type,val,offset,...) LAST_ARG(type, val, offset, __VA_ARGS__) #define ANON(type,val,offset,...) LAST_ARG(type, val, offset, __VA_ARGS__), #define PTR(type, val,offset,...) LAST_ARG(type, val, offset, __VA_ARGS__), #define PTR_ANON(type, val,offset,...) LAST_ARG(type, val, offset, __VA_ARGS__), #define LAST_ANONPTR(type, val, offset,...) LAST_ARG(type, val, offset, __VA_ARGS__) #define ANON_PROMOTED(type,val,type_promoted, val_promoted, offset,...) \ ANON(type_promoted, val_promoted, offset, __VA_ARGS__) #endif /* AARCH64_VARIADIC_MACRO_DEF_GEN_ARGUMENT_LIST */