28 #if !defined( INC_INOSMACRO_H )
29 #define INC_INOSMACRO_H
51 #define LOAD_SETBE16(address, value) inos_setbe16((uint16*)address, value)
57 #define LOAD_GETBE16(address) inos_getbe16((uint16*)address)
63 #define LOAD_SETBE32(address, value) inos_setbe32((uint32*)address, value)
69 #define LOAD_GETBE32(address) inos_getbe32((uint32*)address)
75 #ifdef INOS_CPP_EXCEPTION_SUPPORT
81 SINOSExceptionGuard __inosTryGuard; \
85 #define INOS_CATCH(Exception) \
98 #define INOS_THROW(ExceptionClass, ... ) \
99 { ExceptionClass __inosEx(__VA_ARGS__); __inosEx.OnThrow(__FILE__, __LINE__); throw __inosEx; }
101 #define INOS_THROW(ExceptionClass, args... ) \
102 { ExceptionClass __inosEx(args); __inosEx.OnThrow(__FILE__, __LINE__); throw __inosEx; }
109 static_assert(0, "One needs to enable C++ Exception feature to use this macro");
113 #define INOS_CATCH(Exception) \
114 static_assert(0, "One needs to enable C++ Exception feature to use this macro");
118 #define INOS_THROW(ExceptionClass, args... ) \
119 static_assert(0, "One needs to enable C++ Exception feature to use this macro");
141 #define INOS_DEFINE_ENUM_CODE_X(id, code, ...) id = code,
142 #define INOS_DEFINE_ENUM_CODE(defines, ...) \
144 defines(INOS_DEFINE_ENUM_CODE_X) \
148 #define INOS_DEFINE_COMBO_DATA_X(id, code, ...) #code";"#id";"
149 #define INOS_DEFINE_COMBO_DATA(defines, ...) defines(INOS_DEFINE_COMBO_DATA_X)
156 #if INOS_BYTE_ORDER == INOS_LITTLE_ENDIAN
157 #define INOS_HW_WRITE8(address, value) \
158 *((volatile uint8*)((uintptr)(address)^1)) = (value);
159 #define INOS_HW_READ8(address) \
160 *((volatile uint8*)((uintptr)(address)^1))
161 #define INOS_HW_ADDR8(address) \
162 ((uint8*)((uintptr)(address)^1))
163 #define INOS_HW_WRITE16(address, value) \
164 *((volatile uint16*)((uintptr)(address)^2)) = (value);
165 #define INOS_HW_READ16(address) \
166 *((volatile uint16*)((uintptr)(address)^2))
167 #define INOS_HW_ADDR16(address) \
168 ((uint16*)((uintptr)(address)^2))
170 #define INOS_HW_WRITE8(address, value) \
171 *((volatile uint8*)(address)) = (value);
172 #define INOS_HW_READ8(address) \
173 *((volatile uint8*)(address))
174 #define INOS_HW_ADDR8(address) \
176 #define INOS_HW_WRITE16(address, value) \
177 *((volatile uint16*)(address)) = (value);
178 #define INOS_HW_READ16(address) \
179 *((volatile uint16*)(address))
180 #define INOS_HW_ADDR16(address) \
183 #define INOS_HW_WRITE32(address, value) \
184 *((volatile uint32*)((uintptr)(address))) = (value);
185 #define INOS_HW_READ32(address) \
186 *((volatile uint32*)((uintptr)(address)))
187 #define INOS_HW_ADDR32(address) \
188 ((volatile uint32*)((uintptr)(address)))
190 #if !defined(INOS_MULTICORE) || defined(_MSC_VER)
201 #define INOS_OR(variable, mask) \
203 uint32 __msr__ = INOSDisableInterrupts(); \
204 variable |= (mask); \
205 INOSEnableInterrupts(__msr__); \
210 #define INOS_AND(variable, mask) \
212 uint32 __msr__ = INOSDisableInterrupts(); \
213 variable &= (mask); \
214 INOSEnableInterrupts(__msr__); \
220 #define INOS_ADD(variable, value) \
222 uint32 __msr__ = INOSDisableInterrupts(); \
223 variable += (value); \
224 INOSEnableInterrupts(__msr__); \
229 #define INOS_SET(variable, value) \
231 uint32 __msr__ = INOSDisableInterrupts(); \
232 variable = (value); \
233 INOSEnableInterrupts(__msr__); \
236 #define INOS_SET_8 INOS_SET
238 #define INOS_SET_MB(variable, value) \
239 INOSMemoryBarrier(); \
240 variable = (value); \
273 #define INOS_OR(variable, mask) { \
274 INOSOptimizationBarrier(); \
275 __atomic_or_fetch(&variable, mask, __ATOMIC_RELAXED); \
276 INOSOptimizationBarrier(); \
280 #define INOS_AND(variable, mask) { \
281 INOSOptimizationBarrier(); \
282 __atomic_and_fetch(&variable, mask, __ATOMIC_RELAXED); \
283 INOSOptimizationBarrier(); \
289 #define INOS_ADD(variable, value) { \
290 INOSOptimizationBarrier(); \
291 __atomic_add_fetch(&variable, value, __ATOMIC_RELAXED); \
292 INOSOptimizationBarrier(); \
296 #define INOS_SET(variable, value) { \
297 INOSOptimizationBarrier(); \
298 __atomic_store_n(&variable, value, __ATOMIC_RELAXED); \
299 INOSOptimizationBarrier(); \
306 #define INOS_SET_8(variable, value) { \
307 INOSOptimizationBarrier(); \
308 __atomic_store(&variable, &value, __ATOMIC_RELAXED); \
309 INOSOptimizationBarrier(); \
318 #define INOS_SET_MB(variable, value) \
319 INOSMemoryBarrier(); \
320 INOS_SET(variable, value); \
326 #define INOS_ADD_ INOS_ADD
332 #define DF_INOS_SYNCHRONOUS ((CINOSSync *) 0)
337 #define DF_INOS_ASYNCHRONOUS ((CINOSSync *) 1)
344 #define DF_INOS_DELEGATE ((CINOSSync *) 2)
349 #define DF_INOS_SYNCH_LAST ((CINOSSync *) 2)
351 #define DF_INOS_LOG_TRIGGER_TYPE_TESTPOINT uint8(0)
352 #define DF_INOS_LOG_TRIGGER_TYPE_OVERRUN uint8(1)
353 #define DF_INOS_LOG_TRIGGER_TYPE_POSTOVERRUN uint8(2)
354 #define DF_INOS_LOG_TRIGGER_TYPE_TASK uint8(3)
355 #define DF_INOS_LOG_TRIGGER_TYPE_VARLOG uint8(4)
356 #define DF_INOS_LOG_TRIGGER_TYPE_USER uint8(5)
357 #define DF_INOS_LOG_TRIGGER_TYPE_UNKNOWN uint8(255)
358 #define DF_INOS_LOG_SINGLE uint8(0)
359 #define DF_INOS_LOG_ENDLESS uint8(1)
363 #ifdef INOS_CACHE_LOCK_SUPPORT
364 #define ICACHE __attribute__ ((section (".icache")))
365 #define DCACHE __attribute__ ((section (".dcache")))
373 #ifdef INOS_CRITICAL_SUPPORT
374 #define ICRITICAL __attribute__ ((section (".icritical")))
375 #define DCRITICAL __attribute__ ((section (".dcritical")))
383 #if defined(INOS_DESKTOP) || defined(INOS_64)
388 SStructDef(
const char* apName,
const char* apBaseName, uint32 auSize)
389 : m_pName(apName), m_pBaseName(apBaseName), m_uSize(auSize)
395 static SStructDef* GetFirst()
400 SStructDef* GetNext()
const
405 const char* m_pBaseName;
408 static SStructDef* m_pFirst;
411 struct SStructColumnDef
414 SStructColumnDef(SStructDef* apStruct,
const char* apName, uint32 auType, uint32 auOffset,
415 uint32 auArrayLength, int64 aValue)
416 : m_pName(apName), m_uType(auType), m_uOffset(auOffset),
417 m_uArrayLength(auArrayLength), m_pStruct(apStruct)
419 m_Default.i = aValue;
423 SStructColumnDef(SStructDef* apStruct,
const char* apName, uint32 auType, uint32 auOffset,
424 uint32 auArrayLength, uint64 aValue)
425 : m_pName(apName), m_uType(auType), m_uOffset(auOffset),
426 m_uArrayLength(auArrayLength), m_pStruct(apStruct)
428 m_Default.u = aValue;
432 SStructColumnDef(SStructDef* apStruct,
const char* apName, uint32 auType, uint32 auOffset,
433 uint32 auArrayLength,
double aValue)
434 : m_pName(apName), m_uType(auType), m_uOffset(auOffset),
435 m_uArrayLength(auArrayLength), m_pStruct(apStruct)
437 m_Default.d = aValue;
442 static SStructColumnDef* GetFirst()
447 SStructColumnDef* GetNext()
const
454 uint32 m_uArrayLength;
460 SStructDef* m_pStruct;
461 SStructColumnDef* m_pNext;
462 static SStructColumnDef* m_pFirst;
465 #define DECLARE_STRUCT_BEGIN(aStructName, aTableName, aBaseTable) \
466 char aStructName##tablename[] = aTableName; \
467 char aStructName##basetable[] = aBaseTable; \
468 SStructDef aStructName##_desc ( \
469 (char *)&aStructName##tablename, \
470 (char *)&aStructName##basetable, \
471 sizeof(aStructName) \
473 #define DECLARE_STRUCT_END(aStructName)
482 #if defined(__GNUC__) && __GNUC__ < 13
483 #pragma GCC diagnostic ignored "-Winvalid-offsetof"
485 #define DECLARE_STRUCT_MEMBER(aStructName, aPublicName, aMemberName, aType, aSize, aValue) \
486 _Pragma("GCC diagnostic push") \
487 _Pragma("GCC diagnostic ignored \"-Winvalid-offsetof\"") \
488 char aStructName##aMemberName##name[] = aPublicName; \
489 SStructColumnDef aStructName##aMemberName##_desc ( \
490 &aStructName##_desc, \
491 (char *) &aStructName##aMemberName##name, \
493 (uintptr) offsetof(aStructName, aMemberName), \
496 _Pragma("GCC diagnostic pop")
497 #define DECLARE_STRUCT_INT8(aStructName, aPublicName, aMemberName, aValue, aArrayLength) \
498 DECLARE_STRUCT_MEMBER(aStructName, aPublicName, aMemberName, defType_int8, aArrayLength, (int64) aValue)
499 #define DECLARE_STRUCT_UINT8(aStructName, aPublicName, aMemberName, aValue, aArrayLength) \
500 DECLARE_STRUCT_MEMBER(aStructName, aPublicName, aMemberName, defType_uint8, aArrayLength, (uint64) aValue)
501 #define DECLARE_STRUCT_INT16(aStructName, aPublicName, aMemberName, aValue, aArrayLength) \
502 DECLARE_STRUCT_MEMBER(aStructName, aPublicName, aMemberName, defType_int16, aArrayLength, (int64) aValue)
503 #define DECLARE_STRUCT_UINT16(aStructName, aPublicName, aMemberName, aValue, aArrayLength) \
504 DECLARE_STRUCT_MEMBER(aStructName, aPublicName, aMemberName, defType_uint16, aArrayLength, (uint64) aValue)
505 #define DECLARE_STRUCT_UINT16_NOCHECK(aStructName, aPublicName, aMemberName, aValue, aArrayLength) \
506 DECLARE_STRUCT_MEMBER(aStructName, aPublicName, aMemberName, defType_uint16, aArrayLength, (uint64) aValue)
507 #define DECLARE_STRUCT_INT32(aStructName, aPublicName, aMemberName, aValue, aArrayLength) \
508 DECLARE_STRUCT_MEMBER(aStructName, aPublicName, aMemberName, defType_int32, aArrayLength, (int64) aValue)
509 #define DECLARE_STRUCT_UINT32(aStructName, aPublicName, aMemberName, aValue, aArrayLength) \
510 DECLARE_STRUCT_MEMBER(aStructName, aPublicName, aMemberName, defType_uint32, aArrayLength, (uint64) aValue)
511 #define DECLARE_STRUCT_INT64(aStructName, aPublicName, aMemberName, aValue, aArrayLength) \
512 DECLARE_STRUCT_MEMBER(aStructName, aPublicName, aMemberName, defType_int64, aArrayLength, (int64) aValue)
513 #define DECLARE_STRUCT_UINT64(aStructName, aPublicName, aMemberName, aValue, aArrayLength) \
514 DECLARE_STRUCT_MEMBER(aStructName, aPublicName, aMemberName, defType_uint64, aArrayLength, (uint64) aValue)
515 #define DECLARE_STRUCT_FLOAT(aStructName, aPublicName, aMemberName, aValue, aArrayLength) \
516 DECLARE_STRUCT_MEMBER(aStructName, aPublicName, aMemberName, defType_float, aArrayLength, (double) aValue)
517 #define DECLARE_STRUCT_DOUBLE(aStructName, aPublicName, aMemberName, aValue, aArrayLength) \
518 DECLARE_STRUCT_MEMBER(aStructName, aPublicName, aMemberName, defType_double, aArrayLength, (double) aValue)
519 #define DECLARE_STRUCT_REAL32(aStructName, aPublicName, aMemberName, aValue, aArrayLength) \
520 DECLARE_STRUCT_MEMBER(aStructName, aPublicName, aMemberName, defType_real32, aArrayLength, (double) aValue)
521 #define DECLARE_STRUCT_REAL64(aStructName, aPublicName, aMemberName, aValue, aArrayLength) \
522 DECLARE_STRUCT_MEMBER(aStructName, aPublicName, aMemberName, defType_real64, aArrayLength, (double) aValue)
523 #define DECLARE_STRUCT_FIXED32(aStructName, aPublicName, aMemberName, aValue, aArrayLength) \
524 DECLARE_STRUCT_MEMBER(aStructName, aPublicName, aMemberName, defType_fixed32, aArrayLength, (double) aValue)
525 #define DECLARE_STRUCT_FIXED64(aStructName, aPublicName, aMemberName, aValue, aArrayLength) \
526 DECLARE_STRUCT_MEMBER(aStructName, aPublicName, aMemberName, defType_fixed64, aArrayLength, (double) aValue)
527 #define DECLARE_STRUCT_STRING(aStructName, aPublicName, aMemberName, aValue) \
528 char aStructName##aMemberName##value[] = aValue; \
529 DECLARE_STRUCT_MEMBER(aStructName, aPublicName, aMemberName, defType_string, sizeof(aStructName::aMemberName), (uint64) &aStructName##aMemberName##value)
530 #define DECLARE_STRUCT_CHAR(aStructName, aPublicName, aMemberName, aValue, aArrayLength) \
531 char aStructName##aMemberName##value[aArrayLength] = aValue;\
532 DECLARE_STRUCT_MEMBER(aStructName, aPublicName, aMemberName, defType_string, aArrayLength, (uint64) &aStructName##aMemberName##value)
533 #define DECLARE_STRUCT_FILE(aStructName, aPublicName, aMemberName, aValue) \
534 char aStructName##aMemberName##value[] = aValue; \
535 DECLARE_STRUCT_MEMBER(aStructName, aPublicName, aMemberName, defType_file, sizeof(aStructName::aMemberName), (uint64) &aStructName##aMemberName##value)
536 #define DECLARE_STRUCT_BINARY(aStructName, aPublicName, aMemberName, aValue, aArrayLength) \
537 char aStructName##aMemberName##value[aArrayLength] = aValue;\
538 DECLARE_STRUCT_MEMBER(aStructName, aPublicName, aMemberName, defType_binary, aArrayLength, (uint64) &aStructName##aMemberName##value)
539 #else // end if defined(INOS_DESKTOP)
540 #define STRUCT_DEF __attribute__ ((section (".struct_def"))) __attribute__ ((unused))
541 #define STRUCT_NAM __attribute__ ((section (".struct_nam")))
543 #define DECLARE_STRUCT_BEGIN(aStructName, aTableName, aBaseTable) \
544 STRUCT_NAM char aStructName##tablename[] = aTableName; \
545 STRUCT_NAM char aStructName##basetable[] = aBaseTable; \
546 STRUCT_DEF char* aStructName##ptablename = (char *) &aStructName##tablename; \
547 STRUCT_DEF char* aStructName##pbasetable = (char *) &aStructName##basetable; \
548 STRUCT_DEF uint32 aStructName##size = sizeof(aStructName); \
549 STRUCT_DEF uint32 aStructName##align1 = 0;
551 #define DECLARE_STRUCT_END(aStructName) \
552 STRUCT_DEF uint32 aStructName##end = 0; \
553 STRUCT_DEF uint32 aStructName##align2 = 0;
555 #define DECLARE_STRUCT_MEMBER(aStructName, aPublicName, aMemberName, aType, aSize) \
556 STRUCT_NAM char aStructName##aMemberName##name[] = aPublicName; \
557 STRUCT_DEF char* aStructName##aMemberName##pname = (char *) &aStructName##aMemberName##name;\
558 STRUCT_DEF uint32 aStructName##aMemberName##type = aType; \
559 STRUCT_DEF uint32 aStructName##aMemberName##offset = (uintptr) &((aStructName *)0x100)->aMemberName - 0x100; \
560 STRUCT_DEF uint32 aStructName##aMemberName##size = aSize;
562 #define DECLARE_STRUCT_INT8(aStructName, aPublicName, aMemberName, aValue, aArrayLength) \
563 static_assert((sizeof(aStructName::aMemberName) == sizeof(int8)) || (sizeof(aStructName::aMemberName) == (aArrayLength * sizeof(int8))), "Detected type mismatch registering struct member for dt2"); \
564 DECLARE_STRUCT_MEMBER(aStructName, aPublicName, aMemberName, defType_int8, aArrayLength) \
565 STRUCT_DEF int64 aStructName##aMemberName##value = aValue;
566 #define DECLARE_STRUCT_UINT8(aStructName, aPublicName, aMemberName, aValue, aArrayLength) \
567 static_assert((sizeof(aStructName::aMemberName) == sizeof(uint8)) || (sizeof(aStructName::aMemberName) == (aArrayLength * sizeof(uint8))), "Detected type mismatch registering struct member for dt2"); \
568 DECLARE_STRUCT_MEMBER(aStructName, aPublicName, aMemberName, defType_uint8, aArrayLength) \
569 STRUCT_DEF uint64 aStructName##aMemberName##value = aValue;
570 #define DECLARE_STRUCT_INT16(aStructName, aPublicName, aMemberName, aValue, aArrayLength) \
571 static_assert((sizeof(aStructName::aMemberName) == sizeof(int16)) || (sizeof(aStructName::aMemberName) == (aArrayLength * sizeof(int16))), "Detected type mismatch registering struct member for dt2"); \
572 DECLARE_STRUCT_MEMBER(aStructName, aPublicName, aMemberName, defType_int16, aArrayLength) \
573 STRUCT_DEF int64 aStructName##aMemberName##value = aValue;
574 #define DECLARE_STRUCT_UINT16(aStructName, aPublicName, aMemberName, aValue, aArrayLength) \
575 static_assert((sizeof(aStructName::aMemberName) == sizeof(uint16)) || (sizeof(aStructName::aMemberName) == (aArrayLength * sizeof(uint16))), "Detected type mismatch registering struct member for dt2"); \
576 DECLARE_STRUCT_MEMBER(aStructName, aPublicName, aMemberName, defType_uint16, aArrayLength) \
577 STRUCT_DEF uint64 aStructName##aMemberName##value = aValue;
578 #define DECLARE_STRUCT_UINT16_NOCHECK(aStructName, aPublicName, aMemberName, aValue, aArrayLength) \
579 DECLARE_STRUCT_MEMBER(aStructName, aPublicName, aMemberName, defType_uint16, aArrayLength) \
580 STRUCT_DEF uint64 aStructName##aMemberName##value = aValue;
581 #define DECLARE_STRUCT_INT32(aStructName, aPublicName, aMemberName, aValue, aArrayLength) \
582 static_assert((sizeof(aStructName::aMemberName) == sizeof(int32)) || (sizeof(aStructName::aMemberName) == (aArrayLength * sizeof(int32))), "Detected type mismatch registering struct member for dt2"); \
583 DECLARE_STRUCT_MEMBER(aStructName, aPublicName, aMemberName, defType_int32, aArrayLength) \
584 STRUCT_DEF int64 aStructName##aMemberName##value = aValue;
585 #define DECLARE_STRUCT_UINT32(aStructName, aPublicName, aMemberName, aValue, aArrayLength) \
586 static_assert((sizeof(aStructName::aMemberName) == sizeof(uint32)) || (sizeof(aStructName::aMemberName) == (aArrayLength * sizeof(uint32))), "Detected type mismatch registering struct member for dt2"); \
587 DECLARE_STRUCT_MEMBER(aStructName, aPublicName, aMemberName, defType_uint32, aArrayLength) \
588 STRUCT_DEF uint64 aStructName##aMemberName##value = aValue;
589 #define DECLARE_STRUCT_INT64(aStructName, aPublicName, aMemberName, aValue, aArrayLength) \
590 static_assert((sizeof(aStructName::aMemberName) == sizeof(int64)) || (sizeof(aStructName::aMemberName) == (aArrayLength * sizeof(int64))), "Detected type mismatch registering struct member for dt2"); \
591 DECLARE_STRUCT_MEMBER(aStructName, aPublicName, aMemberName, defType_int64, aArrayLength) \
592 STRUCT_DEF int64 aStructName##aMemberName##value = aValue;
593 #define DECLARE_STRUCT_UINT64(aStructName, aPublicName, aMemberName, aValue, aArrayLength) \
594 static_assert((sizeof(aStructName::aMemberName) == sizeof(uint64)) || (sizeof(aStructName::aMemberName) == (aArrayLength * sizeof(uint64))), "Detected type mismatch registering struct member for dt2"); \
595 DECLARE_STRUCT_MEMBER(aStructName, aPublicName, aMemberName, defType_uint64, aArrayLength) \
596 STRUCT_DEF uint64 aStructName##aMemberName##value = aValue;
597 #define DECLARE_STRUCT_FLOAT(aStructName, aPublicName, aMemberName, aValue, aArrayLength) \
598 static_assert((sizeof(aStructName::aMemberName) == sizeof(float)) || (sizeof(aStructName::aMemberName) == (aArrayLength * sizeof(float))), "Detected type mismatch registering struct member for dt2"); \
599 DECLARE_STRUCT_MEMBER(aStructName, aPublicName, aMemberName, defType_float, aArrayLength) \
600 STRUCT_DEF double aStructName##aMemberName##value = aValue;
601 #define DECLARE_STRUCT_DOUBLE(aStructName, aPublicName, aMemberName, aValue, aArrayLength) \
602 static_assert((sizeof(aStructName::aMemberName) == sizeof(double)) || (sizeof(aStructName::aMemberName) == (aArrayLength * sizeof(double))), "Detected type mismatch registering struct member for dt2"); \
603 DECLARE_STRUCT_MEMBER(aStructName, aPublicName, aMemberName, defType_double, aArrayLength) \
604 STRUCT_DEF double aStructName##aMemberName##value = aValue;
605 #define DECLARE_STRUCT_REAL32(aStructName, aPublicName, aMemberName, aValue, aArrayLength) \
606 static_assert((sizeof(aStructName::aMemberName) == sizeof(real32)) || (sizeof(aStructName::aMemberName) == (aArrayLength * sizeof(real32))), "Detected type mismatch registering struct member for dt2"); \
607 DECLARE_STRUCT_MEMBER(aStructName, aPublicName, aMemberName, defType_real32, aArrayLength) \
608 STRUCT_DEF double aStructName##aMemberName##value = aValue;
609 #define DECLARE_STRUCT_REAL64(aStructName, aPublicName, aMemberName, aValue, aArrayLength) \
610 static_assert((sizeof(aStructName::aMemberName) == sizeof(real64)) || (sizeof(aStructName::aMemberName) == (aArrayLength * sizeof(real64))), "Detected type mismatch registering struct member for dt2"); \
611 DECLARE_STRUCT_MEMBER(aStructName, aPublicName, aMemberName, defType_real64, aArrayLength) \
612 STRUCT_DEF double aStructName##aMemberName##value = aValue;
613 #define DECLARE_STRUCT_FIXED32(aStructName, aPublicName, aMemberName, aValue, aArrayLength) \
614 static_assert((sizeof(aStructName::aMemberName) == sizeof(fixed32)) || (sizeof(aStructName::aMemberName) == (aArrayLength * sizeof(fixed32))), "Detected type mismatch registering struct member for dt2"); \
615 DECLARE_STRUCT_MEMBER(aStructName, aPublicName, aMemberName, defType_fixed32, aArrayLength) \
616 STRUCT_DEF double aStructName##aMemberName##value = aValue;
617 #define DECLARE_STRUCT_FIXED64(aStructName, aPublicName, aMemberName, aValue, aArrayLength) \
618 static_assert((sizeof(aStructName::aMemberName) == sizeof(fixed64)) || (sizeof(aStructName::aMemberName) == (aArrayLength * sizeof(fixed64))), "Detected type mismatch registering struct member for dt2"); \
619 DECLARE_STRUCT_MEMBER(aStructName, aPublicName, aMemberName, defType_fixed64, aArrayLength) \
620 STRUCT_DEF double aStructName##aMemberName##value = aValue;
621 #define DECLARE_STRUCT_STRING(aStructName, aPublicName, aMemberName, aValue) \
622 DECLARE_STRUCT_MEMBER(aStructName, aPublicName, aMemberName, defType_string, sizeof(((aStructName *)0)->aMemberName))\
623 STRUCT_NAM char aStructName##aMemberName##value[] = aValue;\
624 STRUCT_DEF char* aStructName##aMemberName##pvalue = (char *) &aStructName##aMemberName##value;\
625 STRUCT_DEF uint32 aStructName##aMemberName##dummy = 0;
626 #define DECLARE_STRUCT_CHAR(aStructName, aPublicName, aMemberName, aValue, aArrayLength) \
627 static_assert(sizeof(aStructName::aMemberName) == (aArrayLength * sizeof(char)), "Detected type mismatch registering struct member for dt2"); \
628 DECLARE_STRUCT_MEMBER(aStructName, aPublicName, aMemberName, defType_string, aArrayLength)\
629 STRUCT_NAM char aStructName##aMemberName##value[aArrayLength] = aValue;\
630 STRUCT_DEF char* aStructName##aMemberName##pvalue = (char *) &aStructName##aMemberName##value;\
631 STRUCT_DEF uint32 aStructName##aMemberName##dummy = 0;
632 #define DECLARE_STRUCT_FILE(aStructName, aPublicName, aMemberName, aValue) \
633 DECLARE_STRUCT_MEMBER(aStructName, aPublicName, aMemberName, defType_file, sizeof(((aStructName *)0)->aMemberName))\
634 STRUCT_NAM char aStructName##aMemberName##value[] = aValue;\
635 STRUCT_DEF char* aStructName##aMemberName##pvalue = (char *) &aStructName##aMemberName##value;\
636 STRUCT_DEF uint32 aStructName##aMemberName##dummy = 0;
637 #define DECLARE_STRUCT_BINARY(aStructName, aPublicName, aMemberName, aValue, aArrayLength) \
638 DECLARE_STRUCT_MEMBER(aStructName, aPublicName, aMemberName, defType_binary, aArrayLength)\
639 STRUCT_NAM char aStructName##aMemberName##value[aArrayLength] = aValue;\
640 STRUCT_DEF char* aStructName##aMemberName##pvalue = (char *) &aStructName##aMemberName##value;\
641 STRUCT_DEF uint32 aStructName##aMemberName##dummy = 0;
642 #endif // not INOS_DESKTOP
645 #define INOS_LIKELY(x) (x)
646 #define INOS_UNLIKELY(x) (x)
647 #define INOS_NO_INLINE
648 #define INOS_FORMAT(a,b)
649 #define INOS_COMPILE_OPTIMIZED
651 #define INOS_LIKELY(x) __builtin_expect(!!(x), 1)
652 #define INOS_UNLIKELY(x) __builtin_expect(!!(x), 0)
653 #define INOS_NO_INLINE __attribute__ ((noinline))
654 #if defined(INOS_WINDOWS)
655 #define INOS_FORMAT(a,b)
657 #define INOS_FORMAT(a,b) __attribute__ ((format (printf, a, b)))
659 #if defined(__clang__)
660 #define INOS_COMPILE_OPTIMIZED
661 #define INOS_COMPILE_NONOPTIMIZED __attribute__ ((optnone))
663 #define INOS_COMPILE_OPTIMIZED __attribute__((optimize("-O2")))
664 #define INOS_COMPILE_NONOPTIMIZED __attribute__((optimize("-O0")))
666 #if defined(INOS_OCRAM_SUPPORT)
667 #define INOS_OCRAM __attribute__((section(".ocram")))
668 #define INOS_OCRAM_DATA __attribute__((section(".ocramdata")))
669 extern char __OCRAM_START[];
670 extern uintnbr __ocrambgn;
671 #define INOS_OCRAM_ADDR(var) (void*) ((uintptr) &var - reinterpret_cast<uintptr>(__OCRAM_START) + __ocrambgn)
674 #define INOS_OCRAM_DATA
682 void INOS_NO_INLINE DoAssert(
const char* apCondition,
const char* apFile,
const int aiLine);
684 void INOS_NO_INLINE DoAssertMsg(
const char* apCondition,
const char* apFile,
const int aiLine,
const char* apMsg, ...) INOS_FORMAT(4,5);
696 #define ASSERT_ALWAYS(f) \
697 if (INOS_UNLIKELY(!(f))){ \
698 DoAssert(#f, __FILE__, __LINE__); \
706 #define ASSERT_ALWAYS_MSG(f, i_Msg, ...) \
707 if( INOS_UNLIKELY(!(f)) ) { \
708 DoAssertMsg(#f, __FILE__, __LINE__, i_Msg, __VA_ARGS__); \
711 #define ASSERT_ALWAYS_MSG(f, i_Msg, i_Args...) \
712 if( INOS_UNLIKELY(!(f)) ) { \
713 DoAssertMsg(#f, __FILE__, __LINE__, i_Msg, ##i_Args); \
719 if (INOS_UNLIKELY(!(f))){ \
720 DoAssert(#f, __FILE__, __LINE__); \
723 #define ASSERT(f) ((void)0)
726 #ifdef INOS_CONCURRENCY_CHECK
739 #include "cinosconcurrencycheck.h"
743 #define INOS_CONCURRENCY_CHECK_DECLARE CINOSConcurrencyCheck m_ConcurrencyCheck;
749 #define INOS_CONCURRENCY_CHECK_CLAIM(ref) (ref)->m_ConcurrencyCheck.Claim();
756 #define INOS_CONCURRENCY_CHECK_FREE(ref) (ref)->m_ConcurrencyCheck.Free();
760 #define INOS_CONCURRENCY_CHECK_DECLARE
761 #define INOS_CONCURRENCY_CHECK_CLAIM(Check)
762 #define INOS_CONCURRENCY_CHECK_FREE(Check)
775 #if defined(INOS_TESTING) and !defined(INOS_DESKTOP)
776 #define INOS_TESTING_INTERRUPTION_POINT Relinquish();
778 #define INOS_TESTING_INTERRUPTION_POINT
786 #define STATIC_ASSERT(e, msg) \
787 static_assert(e, #msg);
790 #define sizeofm(aClass, aMember) sizeof(((aClass*)0x100)->aMember)
792 #define inos_offsetof(aClass, aMember) (uintnbr)((char*)&(((aClass*)0x100)->aMember)-(char*)0x100)
794 #if !defined(INOS_DESKTOP)
800 #define INOS_MIN(a, b) ({ \
801 __typeof__ (a) _a = (a); \
802 __typeof__ (b) _b = (b); \
806 #define INOS_MAX(a, b) ({ \
807 __typeof__ (a) _a = (a); \
808 __typeof__ (b) _b = (b); \
817 #define INOS_MIN(X, Y) (((X) < (Y)) ? (X) : (Y))
818 #define INOS_MAX(X, Y) (((X) > (Y)) ? (X) : (Y))
824 #define INOS_STRINGIFY(x) #x
832 #define INOS_STR(x) INOS_STRINGIFY(x)
841 #define INOS_IGNORE_WARNING(warning) \
842 _Pragma(INOS_STRINGIFY(GCC diagnostic push)) \
843 _Pragma(INOS_STRINGIFY(GCC diagnostic ignored warning))
844 #define INOS_RESTORE_WARNING \
845 _Pragma(INOS_STRINGIFY(GCC diagnostic pop))
848 #define INOS_IGNORE_WARNING_DEPRECATED INOS_IGNORE_WARNING("-Wdeprecated-declarations")
858 #ifndef INOS_DEPRECATED
859 #if __cplusplus >= 201402L
860 #define INOS_DEPRECATED(msg) [[deprecated(msg)]]
862 #define INOS_DEPRECATED(msg)
870 template<
typename T, uint8... Values>
873 template<
typename T, uint8 First, uint8... Values>
881 static const T s_uBitmap = 0;
890 #define STATIC_UINT64_BITMAP(...) (TINOSStaticBitmap<uint64,__VA_ARGS__>::s_uBitmap)
891 #define STATIC_UINT32_BITMAP(...) (TINOSStaticBitmap<uint32,__VA_ARGS__>::s_uBitmap)
892 #define STATIC_UINT16_BITMAP(...) (TINOSStaticBitmap<uint16,__VA_ARGS__>::s_uBitmap)
893 #define STATIC_UINT8_BITMAP(...) (TINOSStaticBitmap<uint8,__VA_ARGS__>::s_uBitmap)
912 template<
typename TO,
typename FROM>
913 inline TO checked_static_cast(
const FROM& from_value)
915 TO to_value =
static_cast<TO
>(from_value);
916 FROM back_value =
static_cast<FROM
>(to_value);
918 "casting a value resulted in loss of information/precision");
926 #endif // INC_INOSMACRO_H