Split out compiler specific helper macros into a new CompilerSpecific.h header file inside the library, for future expansion.
This commit is contained in:
parent
7932ce86bd
commit
bfa22eca26
3 changed files with 102 additions and 30 deletions
|
@ -71,6 +71,7 @@
|
|||
#include "LUFAConfig.h"
|
||||
#endif
|
||||
|
||||
#include "CompilerSpecific.h"
|
||||
#include "Architectures.h"
|
||||
#include "Attributes.h"
|
||||
#include "BoardTypes.h"
|
||||
|
@ -228,31 +229,6 @@
|
|||
#define pgm_read_ptr(Address) (void*)pgm_read_word(Address)
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/** Forces GCC to use pointer indirection (via the device's pointer register pairs) when accessing the given
|
||||
* struct pointer. In some cases GCC will emit non-optimal assembly code when accessing a structure through
|
||||
* a pointer, resulting in a larger binary. When this macro is used on a (non \c const) structure pointer before
|
||||
* use, it will force GCC to use pointer indirection on the elements rather than direct store and load
|
||||
* instructions.
|
||||
*
|
||||
* \param[in, out] StructPtr Pointer to a structure which is to be forced into indirect access mode.
|
||||
*/
|
||||
#define GCC_FORCE_POINTER_ACCESS(StructPtr) __asm__ __volatile__("" : "=b" (StructPtr) : "0" (StructPtr))
|
||||
|
||||
/** Forces GCC to create a memory barrier, ensuring that memory accesses are not reordered past the barrier point.
|
||||
* This can be used before ordering-critical operations, to ensure that the compiler does not re-order the resulting
|
||||
* assembly output in an unexpected manner on sections of code that are ordering-specific.
|
||||
*/
|
||||
#define GCC_MEMORY_BARRIER() __asm__ __volatile__("" ::: "memory");
|
||||
|
||||
/** Evaluates to boolean true if the specified value can be determined at compile time to be a constant value
|
||||
* when compiling under GCC.
|
||||
*
|
||||
* \param[in] x Value to check compile time constantness of.
|
||||
*
|
||||
* \return Boolean true if the given value is known to be a compile time constant.
|
||||
*/
|
||||
#define GCC_IS_COMPILE_CONST(x) __builtin_constant_p(x)
|
||||
|
||||
#if !defined(ISR) || defined(__DOXYGEN__)
|
||||
/** Macro for the definition of interrupt service routines, so that the compiler can insert the required
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue