Mario Kart 64
macros.h
Go to the documentation of this file.
1 #ifndef _MACROS_H_
2 #define _MACROS_H_
3 
4 
5 #ifndef __sgi
6 #define GLOBAL_ASM(...)
7 #endif
8 
9 #if !defined(__sgi) && (!defined(NON_MATCHING) || !defined(AVOID_UB))
10 // asm-process isn't supported outside of IDO, and undefined behavior causes
11 // crashes.
12 //#error Matching build is only possible on IDO; please build with NON_MATCHING=1.
13 #endif
14 
15 #define ARRAY_COUNT(arr) (s32)(sizeof(arr) / sizeof(arr[0]))
16 
17 #define GLUE(a, b) a ## b
18 #define GLUE2(a, b) GLUE(a, b)
19 
20 // Avoid compiler warnings for unused variables
21 #ifdef __GNUC__
22 #define UNUSED __attribute__((unused))
23 #else
24 #define UNUSED
25 #endif
26 
27 // Avoid undefined behaviour for non-returning functions
28 #ifdef __GNUC__
29 #define NORETURN __attribute__((noreturn))
30 #else
31 #define NORETURN
32 #endif
33 
34 // Static assertions
35 #ifdef __GNUC__
36 #define STATIC_ASSERT(cond, msg) _Static_assert(cond, msg)
37 #else
38 #define STATIC_ASSERT(cond, msg) typedef char GLUE2(static_assertion_failed, __LINE__)[(cond) ? 1 : -1]
39 #endif
40 
41 // Align to 8-byte boundary for DMA requirements
42 #ifdef __GNUC__
43 #define ALIGNED8 __attribute__((aligned(8)))
44 #else
45 #define ALIGNED8
46 #endif
47 
48 // Align to 16-byte boundary for audio lib requirements
49 #ifdef __GNUC__
50 #define ALIGNED16 __attribute__((aligned(16)))
51 #else
52 #define ALIGNED16
53 #endif
54 
55 // convert a virtual address to physical.
56 #define VIRTUAL_TO_PHYSICAL(addr) ((uintptr_t)(addr) & 0x1FFFFFFF)
57 
58 // convert a physical address to virtual.
59 #define PHYSICAL_TO_VIRTUAL(addr) ((uintptr_t)(addr) | 0x80000000)
60 
61 // another way of converting virtual to physical
62 #define VIRTUAL_TO_PHYSICAL2(addr) ((u8 *)(addr) - 0x80000000U)
63 
64 // aligns an address to the next 16 bytes
65 #define ALIGN16(val) (((val) + 0xF) & ~0xF)
66 
73 #define GET_PACKED_END(dl) (((u8*) dl) + sizeof(dl) - sizeof(dl[0]) - 0x07000000)
74 
75 #endif