123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250 |
- /*****************************************************************************/
- /* stdarg.h v8.2.2 */
- /* */
- /* Copyright (c) 1993-2017 Texas Instruments Incorporated */
- /* http://www.ti.com/ */
- /* */
- /* Redistribution and use in source and binary forms, with or without */
- /* modification, are permitted provided that the following conditions */
- /* are met: */
- /* */
- /* Redistributions of source code must retain the above copyright */
- /* notice, this list of conditions and the following disclaimer. */
- /* */
- /* Redistributions in binary form must reproduce the above copyright */
- /* notice, this list of conditions and the following disclaimer in */
- /* the documentation and/or other materials provided with the */
- /* distribution. */
- /* */
- /* Neither the name of Texas Instruments Incorporated nor the names */
- /* of its contributors may be used to endorse or promote products */
- /* derived from this software without specific prior written */
- /* permission. */
- /* */
- /* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */
- /* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */
- /* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR */
- /* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */
- /* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */
- /* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT */
- /* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, */
- /* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY */
- /* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT */
- /* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE */
- /* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */
- /* */
- /*****************************************************************************/
- #ifndef _STDARG
- #define _STDARG
- #pragma diag_push
- #pragma CHECK_MISRA("-20.1") /* standard headers must define standard names */
- #pragma CHECK_MISRA("-20.2") /* standard headers must define standard names */
- #pragma CHECK_MISRA("-19.7") /* macros required for implementation */
- #pragma CHECK_MISRA("-19.10") /* need types as macro arguments */
- #ifdef __cplusplus
- namespace std
- {
- #endif
- #ifdef __TI_LLVM__
- typedef __builtin_va_list va_list;
- #else
- typedef char *va_list;
- #endif
- #ifdef __cplusplus
- }
- #endif
- /*****************************************************************************/
- /* LLVM VARARGS HANDLING - Use builtin operations. */
- /*****************************************************************************/
- #if defined(__TI_LLVM__)
- #define va_start(_ap, _parmN) \
- __builtin_va_start((_ap), (_parmN))
- #define va_arg(_ap, _type) \
- __builtin_va_arg((_ap), _type)
- #define va_copy(_dst, _src) \
- __builtin_va_copy((_dst), (_src))
- #define va_end(_ap) \
- __builtin_va_end(_ap)
- #else
- /*****************************************************************************/
- /* VA_END - Reclaim resources used by varargs handling. */
- /* */
- /* No action needed */
- /*****************************************************************************/
- #define va_end(_ap) ((void)0)
- /*****************************************************************************/
- /* VA_COPY - Make a copy of the varargs. */
- /*****************************************************************************/
- #define va_copy(_dst, _src) ((_dst)=(_src))
- /*****************************************************************************/
- /* VA_START - Set up the va_list pointer. */
- /*****************************************************************************/
- #if !defined(__TI_EABI__)
- /*---------------------------------------------------------------------------*/
- /* COFF ABI convention: */
- /* - va_list is kept aligned to 4 bytes. */
- /* - va_list pointer points one word beyond the start of the last argument. */
- /*---------------------------------------------------------------------------*/
- #define va_start(_ap, _parmN) \
- (_ap = ((char *)__va_parmadr(_parmN)) + \
- (__va_argref(_parmN) ? sizeof(&_parmN) : \
- (sizeof(_parmN) < 4 ? 4 : sizeof(_parmN))))
- #else
- /*---------------------------------------------------------------------------*/
- /* ELF ABI convention: */
- /* - va_list pointer points one byte beyond the last argument. */
- /*---------------------------------------------------------------------------*/
- #define va_start(_ap, _parmN) \
- (_ap = ((char *)__va_parmadr(_parmN)) + \
- (__va_argref(_parmN) ? sizeof(&_parmN) : \
- sizeof(_parmN)))
- #endif /* defined(__TI_EABI__) */
- /*****************************************************************************/
- /* VA_ARG - Return the next argument, adjust va_list pointer */
- /* */
- /* Some arguments passed by value are turned into pass-by-reference by */
- /* making a temporary object and passing a pointer to this temporary. For */
- /* such an argument (indicated by __va_argref(_type)) the actual argument */
- /* passed is a pointer, so it must be dealt with specially. */
- /* */
- /* When an argument is larger than the maximum alignment (8 bytes for double */
- /* or long long), we only align to 8 bytes. */
- /*****************************************************************************/
- /*---------------------------------------------------------------------------*/
- /* What happens on every va_arg(_ap, _type) call is: */
- /* 1) Align the value of _ap (the va_list pointer) appropriately for _type */
- /* (the requested type). */
- /* 2) Increment _ap appropriately for _type. */
- /* 3) Return the value desired by dereferencing _ap. */
- /*---------------------------------------------------------------------------*/
- #if !defined(__TI_EABI__)
- /*---------------------------------------------------------------------------*/
- /* The big- and little-endian variants are different only because we are */
- /* trying to support the case of the user asking for "char" or "short", */
- /* which is actually undefined behavior (See ISO/IEC 9899:1999 7.15.1.1), */
- /* but we are trying to be friendly. */
- /*---------------------------------------------------------------------------*/
- #ifdef _BIG_ENDIAN
- #define va_arg(_ap, _type) \
- (__va_argref(_type) \
- ? ((_ap += 4), (**(_type **)(_ap-4))) \
- : ((sizeof(_type) == sizeof(double) \
- ? ((_ap = (char *)(((int)_ap + 7) & ~7)), \
- (_ap += 8), (*(_type *)(_ap - 8))) \
- : ((_ap += 4), (*(_type *)(_ap - (sizeof(_type))))))))
- #else
- #define va_arg(_ap, _type) \
- (__va_argref(_type) \
- ? ((_ap += 4), (**(_type **)(_ap - 4))) \
- : ((sizeof(_type) == sizeof(double) \
- ? ((_ap = (char *)(((int)_ap + 7) & ~7)), \
- (_ap += 8), (*(_type *)(_ap - 8))) \
- : ((_ap += 4), (*(_type *)(_ap - 4))))))
- #endif
- #else /* defined(__TI_EABI__) */
- /*---------------------------------------------------------------------------*/
- /* 1) Align _ap to satisfy alignment of _type. */
- /* 2) Increment _ap by sizeof(_type) */
- /* 3) return *(ap-sizeof(_type)) */
- /*---------------------------------------------------------------------------*/
- #define __TI_SIZEOF_SCALAR_STR(_type) \
- ((sizeof(_type) > 8) ? 16 : \
- (sizeof(_type) > 4) ? 8 : \
- (sizeof(_type) > 2) ? 4 : \
- (sizeof(_type) > 1) ? 2 : 1)
- #define __TI_ALIGNOF_SCALAR_STR(_type) \
- ((sizeof(_type) > 8) ? 16 : \
- (sizeof(_type) > 4) ? 8 : \
- (sizeof(_type) > 2) ? 4 : \
- (sizeof(_type) > 1) ? 2 : 1)
- #define __TI_ALIGNOF_PROMOTED_TYPE(_type) \
- (__va_argref(_type) ? __alignof__(_type *) : \
- __va_argcsu(_type) ? __TI_ALIGNOF_SCALAR_STR(_type) : \
- (sizeof(_type) < 4) ? __alignof__(int) : \
- __alignof__(_type))
- #define __TI_ALIGN(e, _type) \
- ((char *)(((unsigned)(e) + __TI_ALIGNOF_PROMOTED_TYPE(_type) - 1) & \
- ~(__TI_ALIGNOF_PROMOTED_TYPE(_type) - 1)))
- #define __TI_SIZEOF_PROMOTED_TYPE(_type) \
- (__va_argref(_type) ? sizeof(_type *) : \
- __va_argcsu(_type) ? __TI_SIZEOF_SCALAR_STR(_type) : \
- (sizeof(_type) < 4) ? sizeof(int) : sizeof(_type))
- #define __TI_DEREF(e, _type) \
- (__va_argref(_type) ? **(_type **)(e) : *(_type *)(e))
- /*---------------------------------------------------------------------------*/
- /* The big- and little-endian variants are different only because we are */
- /* trying to support the case of the user asking for "char" or "short", */
- /* which is actually undefined behavior (See ISO/IEC 9899:1999 7.15.1.1), */
- /* but we are trying to be friendly. */
- /*---------------------------------------------------------------------------*/
- #ifdef _BIG_ENDIAN
- #define __TI_BE_SIZEOF_UNPROMOTED_TYPE(_type) \
- (__va_argref(_type) ? sizeof(_type *) : \
- __va_argcsu(_type) ? __TI_SIZEOF_SCALAR_STR(_type) : \
- (sizeof(_type)))
- #define va_arg(_ap, _type) \
- (_ap = __TI_ALIGN(_ap, _type), \
- _ap += __TI_SIZEOF_PROMOTED_TYPE(_type), \
- __TI_DEREF(_ap - __TI_BE_SIZEOF_UNPROMOTED_TYPE(_type), _type))
- #else
- #define va_arg(_ap, _type) \
- (_ap = __TI_ALIGN(_ap, _type), \
- _ap += __TI_SIZEOF_PROMOTED_TYPE(_type), \
- __TI_DEREF(_ap - __TI_SIZEOF_PROMOTED_TYPE(_type), _type))
- #endif /* _BIG_ENDIAN */
- #endif /* defined(__TI_EABI__) */
- #endif /* defined(__TI_LLVM__) */
- #pragma diag_pop
- #endif /* _STDARG */
- #pragma diag_push
- /* using declarations must occur outside header guard to support including both
- C and C++-wrapped version of header; see _CPP_STYLE_HEADER check */
- /* this code is for C++ mode only and thus also not relevant for MISRA */
- #pragma CHECK_MISRA("-19.15")
- #if defined(__cplusplus) && !defined(_CPP_STYLE_HEADER)
- using std::va_list;
- #endif /* _CPP_STYLE_HEADER */
- #pragma diag_pop
|