/** * \file */ #ifndef __MONO_UTILS_HWCAP_H__ #define __MONO_UTILS_HWCAP_H__ #include #include #include "config.h" #include "mono/utils/mono-compiler.h" #define MONO_HWCAP_VAR(NAME) extern gboolean mono_hwcap_ ## NAME; #include "mono/utils/mono-hwcap-vars.h" #undef MONO_HWCAP_VAR /* Call this function to perform hardware feature detection. Until * this function has been called, all feature variables will be * FALSE as a default. * * While this function can be called multiple times, doing so from * several threads at the same time is not supported as it will * result in an inconsistent state of the variables. Further, * feature variables should not be read *while* this function is * executing. */ void mono_hwcap_init (void); /* Implemented in mono-hwcap-$TARGET.c. Do not call. */ void mono_hwcap_arch_init (void); /* Print detected features to stdout. */ void mono_hwcap_print (void); /* Please note: If you're going to use the Linux auxiliary vector * to detect CPU features, don't use any of the constant names in * the hwcap.h header. This ties us to a particular version of the * header, and since the values are guaranteed to be stable, hard- * coding them is not that terrible. * * Also, please do not add assumptions to mono-hwcap. The code here * is meant to *discover* facts about the hardware, not assume that * some feature exists because of $arbitrary_preprocessor_define. * If you have to make assumptions, do so elsewhere, e.g. in the * Mini back end you're modifying. * * Finally, be conservative. If you can't determine precisely if a * feature is present, assume that it isn't. In the rare cases where * the hardware or operating system are lying, work around that in * a different place, as with the rule above. */ #endif /* __MONO_UTILS_HWCAP_H__ */