FastLED 3.9.15
Loading...
Searching...
No Matches
compiler_control.h
Go to the documentation of this file.
1#pragma once
2
3// Stringify helper for pragma arguments
4#define FL_STRINGIFY2(x) #x
5#define FL_STRINGIFY(x) FL_STRINGIFY2(x)
6
7// BEGIN BASE MACROS
8#if defined(__clang__)
9 #define FL_DISABLE_WARNING_PUSH _Pragma("clang diagnostic push")
10 #define FL_DISABLE_WARNING_POP _Pragma("clang diagnostic pop")
11 // Usage: FL_DISABLE_WARNING(float-equal)
12 #define FL_DISABLE_WARNING(warning) _Pragma(FL_STRINGIFY(clang diagnostic ignored "-W" #warning))
13
14#elif defined(__GNUC__) && (__GNUC__*100 + __GNUC_MINOR__) >= 406
15 #define FL_DISABLE_WARNING_PUSH _Pragma("GCC diagnostic push")
16 #define FL_DISABLE_WARNING_POP _Pragma("GCC diagnostic pop")
17 // Usage: FL_DISABLE_WARNING(float-equal)
18 #define FL_DISABLE_WARNING(warning) _Pragma(FL_STRINGIFY(GCC diagnostic ignored "-W" #warning))
19#else
20 #define FL_DISABLE_WARNING_PUSH
21 #define FL_DISABLE_WARNING_POP
22 #define FL_DISABLE_WARNING(warning)
23#endif
24// END BASE MACROS
25
26// WARNING SPECIFIC MACROS THAT MAY NOT BE UNIVERSAL.
27#if defined(__clang__)
28 #define FL_DISABLE_WARNING_GLOBAL_CONSTRUCTORS \
29 FL_DISABLE_WARNING(global-constructors)
30 #define FL_DISABLE_WARNING_SELF_ASSIGN_OVERLOADED \
31 FL_DISABLE_WARNING(self-assign-overloaded)
32 // Clang doesn't have format-truncation warning, use no-op
33 #define FL_DISABLE_FORMAT_TRUNCATION
34 #define FL_DISABLE_WARNING_NULL_DEREFERENCE FL_DISABLE_WARNING(null-dereference)
35 #define FL_DISABLE_WARNING_IMPLICIT_FALLTHROUGH
36 #define FL_DISABLE_WARNING_UNUSED_PARAMETER
37 #define FL_DISABLE_WARNING_RETURN_TYPE
38 #define FL_DISABLE_WARNING_IMPLICIT_INT_CONVERSION FL_DISABLE_WARNING(implicit-int-conversion)
39 #define FL_DISABLE_WARNING_FLOAT_CONVERSION FL_DISABLE_WARNING(float-conversion)
40 #define FL_DISABLE_WARNING_SIGN_CONVERSION FL_DISABLE_WARNING(sign-conversion)
41 #define FL_DISABLE_WARNING_SHORTEN_64_TO_32 FL_DISABLE_WARNING(shorten-64-to-32)
42#elif defined(__GNUC__) && (__GNUC__*100 + __GNUC_MINOR__) >= 406
43 // GCC doesn't have global-constructors warning, use no-op
44 #define FL_DISABLE_WARNING_GLOBAL_CONSTRUCTORS
45 // GCC doesn't have self-assign-overloaded warning, use no-op
46 #define FL_DISABLE_WARNING_SELF_ASSIGN_OVERLOADED
47 // GCC has format-truncation warning
48 #define FL_DISABLE_FORMAT_TRUNCATION \
49 FL_DISABLE_WARNING(format-truncation)
50 #define FL_DISABLE_WARNING_NULL_DEREFERENCE
51 #define FL_DISABLE_WARNING_UNUSED_PARAMETER \
52 FL_DISABLE_WARNING(unused-parameter)
53 #define FL_DISABLE_WARNING_RETURN_TYPE \
54 FL_DISABLE_WARNING(return-type)
55
56 // implicit-fallthrough warning requires GCC >= 7.0
57 #if (__GNUC__*100 + __GNUC_MINOR__) >= 700
58 #define FL_DISABLE_WARNING_IMPLICIT_FALLTHROUGH FL_DISABLE_WARNING(implicit-fallthrough)
59 #else
60 #define FL_DISABLE_WARNING_IMPLICIT_FALLTHROUGH
61 #endif
62 // GCC doesn't support these conversion warnings on older versions
63 #define FL_DISABLE_WARNING_FLOAT_CONVERSION
64 #define FL_DISABLE_WARNING_SIGN_CONVERSION
65 #define FL_DISABLE_WARNING_IMPLICIT_INT_CONVERSION
66 // GCC doesn't have shorten-64-to-32 warning, use no-op
67 #define FL_DISABLE_WARNING_SHORTEN_64_TO_32
68#else
69 #define FL_DISABLE_WARNING_GLOBAL_CONSTRUCTORS
70 #define FL_DISABLE_WARNING_SELF_ASSIGN_OVERLOADED
71 #define FL_DISABLE_FORMAT_TRUNCATION
72 #define FL_DISABLE_WARNING_NULL_DEREFERENCE
73 #define FL_DISABLE_WARNING_UNUSED_PARAMETER
74 #define FL_DISABLE_WARNING_RETURN_TYPE
75 #define FL_DISABLE_WARNING_IMPLICIT_INT_CONVERSION
76 #define FL_DISABLE_WARNING_FLOAT_CONVERSION
77 #define FL_DISABLE_WARNING_SIGN_CONVERSION
78 #define FL_DISABLE_WARNING_SHORTEN_64_TO_32
79#endif
80
81// END WARNING SPECIFIC MACROS THAT MAY NOT BE UNIVERSAL.
82
83// Fast math optimization controls with additional aggressive flags
84#if defined(__clang__)
85 #define FL_FAST_MATH_BEGIN \
86 _Pragma("clang diagnostic push") \
87 _Pragma("STDC FP_CONTRACT ON")
88
89 #define FL_FAST_MATH_END _Pragma("clang diagnostic pop")
90
91#elif defined(__GNUC__)
92 #define FL_FAST_MATH_BEGIN \
93 _Pragma("GCC push_options") \
94 _Pragma("GCC optimize (\"fast-math\")") \
95 _Pragma("GCC optimize (\"tree-vectorize\")") \
96 _Pragma("GCC optimize (\"unroll-loops\")")
97
98 #define FL_FAST_MATH_END _Pragma("GCC pop_options")
99
100#elif defined(_MSC_VER)
101 #define FL_FAST_MATH_BEGIN __pragma(float_control(precise, off))
102 #define FL_FAST_MATH_END __pragma(float_control(precise, on))
103#else
104 #define FL_FAST_MATH_BEGIN /* nothing */
105 #define FL_FAST_MATH_END /* nothing */
106#endif
107
108// Optimization Level O3
109#if defined(__clang__)
110 #define FL_OPTIMIZATION_LEVEL_O3_BEGIN \
111 _Pragma("clang diagnostic push")
112
113 #define FL_OPTIMIZATION_LEVEL_O3_END _Pragma("clang diagnostic pop")
114
115#elif defined(__GNUC__)
116 #define FL_OPTIMIZATION_LEVEL_O3_BEGIN \
117 _Pragma("GCC push_options") \
118 _Pragma("GCC optimize (\"O3\")")
119
120 #define FL_OPTIMIZATION_LEVEL_O3_END _Pragma("GCC pop_options")
121#else
122 #define FL_OPTIMIZATION_LEVEL_O3_BEGIN /* nothing */
123 #define FL_OPTIMIZATION_LEVEL_O3_END /* nothing */
124#endif
125
126// Optimization Level O0 (Debug/No optimization)
127#if defined(__clang__)
128 #define FL_OPTIMIZATION_LEVEL_O0_BEGIN \
129 _Pragma("clang diagnostic push")
130
131 #define FL_OPTIMIZATION_LEVEL_O0_END _Pragma("clang diagnostic pop")
132
133#elif defined(__GNUC__)
134 #define FL_OPTIMIZATION_LEVEL_O0_BEGIN \
135 _Pragma("GCC push_options") \
136 _Pragma("GCC optimize (\"O0\")")
137
138 #define FL_OPTIMIZATION_LEVEL_O0_END _Pragma("GCC pop_options")
139#else
140 #define FL_OPTIMIZATION_LEVEL_O0_BEGIN /* nothing */
141 #define FL_OPTIMIZATION_LEVEL_O0_END /* nothing */
142#endif
143
144#ifndef FL_WEAK
145#define FL_WEAK __attribute__((weak))
146#endif