#if !defined(FIPS_REF_POINT_IS_CROSS_COMPILER_AWARE)
# if (defined(__ANDROID__) && (defined(__arm__) || defined(__arm) || \
defined(__i386__)|| defined(__i386))) || \
- (defined(__vxworks) && (defined(__ppc__) || defined(__ppc))) || \
- (defined(__linux) && defined(__PPC__) && !defined(__PPC64__))
+ (defined(__vxworks) && (defined(__ppc__) || defined(__ppc) || \
+ defined(__mips__)|| defined(__mips))) || \
+ (defined(__linux) && ((defined(__PPC__) && !defined(__PPC64__)) || \
+ defined(__arm__) || defined(__arm)))
# define FIPS_REF_POINT_IS_CROSS_COMPILER_AWARE
# endif
#endif
* reference points accordingly. In case you wonder, the values are
* big-endian encoded variable names, just to prevent these arrays
* from being merged by linker. */
-# if defined(_MSC_VER) && defined(_WIN64)
+# if defined(_MSC_VER)
# pragma section("fipsro$a",read)
__declspec(allocate("fipsro$a"))
# endif
# ifdef FIPS_REF_POINT_IS_CROSS_COMPILER_AWARE
# define instruction_pointer FIPS_text_endX
# endif
-# if defined(_MSC_VER) && defined(_WIN64)
+# if defined(_MSC_VER)
# pragma section("fipsro$c",read)
__declspec(allocate("fipsro$c"))
# endif
const void *FIPS_ref_point()
{
#if defined(FIPS_REF_POINT_IS_CROSS_COMPILER_AWARE)
+# if defined(__thumb__) || defined(__thumb)
+ return (void *)((size_t)instruction_pointer&~1);
+# else
return (void *)instruction_pointer;
+# endif
#elif defined(INSTRUCTION_POINTER_IMPLEMENTED)
return instruction_pointer();
/* Below we essentially cover vendor compilers which do not support