liboqs/tests/system_info.c
John Schanck b36ff9f17c
Replace OQS_PORTABLE_BUILD and OQS_USE_CPU_EXTENSIONS (#951)
* Replace OQS_PORTABLE_BUILD with OQS_DIST_BUILD

Also introduces OQS_OPT_TARGET and removes OQS_USE_CPU_EXTENSIONS

* Only compile sha3 avx2 code on Linux|Darwin

* Use new ARCH_ARM[X] flags in SIKE CMakeLists

* Update test_portability and rename to test_distbuild

* Update documentation for building Windows AMD64 from Ubuntu Bionic

* Update scripts/build-android.sh

* More specific CMAKE_SYSTEM_PROCESSOR for rasppi toolchain

* CI: Use OQS_DIST_BUILD in some jobs

* Replace OQS_get_available_CPU_extensions by OQS_CPU_has_extension

* ARM64v8/ARM32v7 runtime cpu feature detection

* Compile-time detection of some ARM features

* Toolchain files to cross compile for ARM32v7 and ARM64v8

* Remove unnecessary references to CMAKE_BUILD_TYPE=Release

* Use OQS_DIST_BUILD=ON on Windows
2021-03-31 16:30:54 -04:00

154 lines
3.7 KiB
C

// SPDX-License-Identifier: MIT
#include <oqs/oqs.h>
#include <stdio.h>
#include <string.h>
// based on macros in https://sourceforge.net/p/predef/wiki/Compilers/
static void print_compiler_info(void) {
#if defined(__clang__)
printf("Compiler: clang (%s)\n", __clang_version__);
#elif defined(__GNUC_PATCHLEVEL__)
printf("Compiler: gcc (%d.%d.%d)\n", __GNUC__, __GNUC_MINOR__, __GNUC_PATCHLEVEL__);
#elif defined(__GNUC_MINOR__)
printf("Compiler: gcc (%d.%d)\n", __GNUC__, __GNUC_MINOR__);
#elif defined(__INTEL_COMPILER)
printf("Compiler: Intel C/C++ (%d)\n", __INTEL_COMPILER);
#elif defined(_MSC_FULL_VER)
printf("Compiler: Microsoft C/C++ (%d)\n", _MSC_FULL_VER);
#else
printf("Compiler: Unknown"\n);
#endif
#if defined(OQS_COMPILE_OPTIONS)
printf("Compile options: %s\n", OQS_COMPILE_OPTIONS);
#endif
}
// based on macros in https://sourceforge.net/p/predef/wiki/Architectures/
static void print_platform_info(void) {
#if defined(OQS_COMPILE_BUILD_TARGET)
printf("Target platform: %s\n", OQS_COMPILE_BUILD_TARGET);
#elif defined(_WIN64)
printf("Target platform: Windows (64-bit)\n");
#elif defined(_WIN32)
printf("Target platform: Windows (32-bit)\n");
#else
printf("Target platform: Unknown\n");
#endif
}
#if defined(OQS_USE_OPENSSL)
#include <openssl/opensslv.h>
#endif
#if defined(OQS_DIST_X86_64_BUILD)
#define C_OR_NI(stmt_c, stmt_ni) \
if (OQS_CPU_has_extension(OQS_CPU_EXT_AES)) { \
stmt_ni; \
} else { \
stmt_c; \
}
#elif defined(OQS_USE_AES_INSTRUCTIONS)
#define C_OR_NI(stmt_c, stmt_ni) \
stmt_ni;
#else
#define C_OR_NI(stmt_c, stmt_ni) \
stmt_c;
#endif
/* Display all active CPU extensions: */
static void print_cpu_extensions(void) {
#if defined(OQS_DIST_BUILD)
printf("CPU exts active: (portable build)\n");
#else
printf("CPU exts active: ");
#ifdef OQS_USE_AES_INSTRUCTIONS
printf(" AES");
#endif
#ifdef OQS_USE_AVX_INSTRUCTIONS
printf(" AVX");
#endif
#ifdef OQS_USE_AVX2_INSTRUCTIONS
printf(" AVX2");
#endif
#ifdef OQS_USE_AVX512_INSTRUCTIONS
printf(" AVX512");
#endif
#ifdef OQS_USE_BMI1_INSTRUCTIONS
printf(" BMI1");
#endif
#ifdef OQS_USE_BMI2_INSTRUCTIONS
printf(" BMI2");
#endif
#ifdef OQS_USE_PCLMUL_INSTRUCTIONS
printf(" PCLMUL");
#endif
#ifdef OQS_USE_POPCNT_INSTRUCTIONS
printf(" POPCNT");
#endif
#ifdef OQS_USE_SSE_INSTRUCTIONS
printf(" SSE");
#endif
#ifdef OQS_USE_SSE2_INSTRUCTIONS
printf(" SSE2");
#endif
#ifdef OQS_USE_SSE3_INSTRUCTIONS
printf(" SSE3");
#endif
#ifdef OQS_USE_ARM_AES_INSTRUCTIONS
printf(" AES");
#endif
#ifdef OQS_USE_ARM_SHA2_INSTRUCTIONS
printf(" SHA2");
#endif
#ifdef OQS_USE_ARM_SHA3_INSTRUCTIONS
printf(" SHA3");
#endif
#ifdef OQS_USE_ARM_NEON_INSTRUCTIONS
printf(" NEON");
#endif
printf("\n");
#endif
}
static void print_oqs_configuration(void) {
printf("OQS version: %s\n", OQS_VERSION_TEXT);
#if defined(OQS_COMPILE_GIT_COMMIT)
printf("Git commit: %s\n", OQS_COMPILE_GIT_COMMIT);
#endif
#if defined(OQS_USE_OPENSSL)
printf("OpenSSL enabled: Yes (%s)\n", OPENSSL_VERSION_TEXT);
#else
printf("OpenSSL enabled: No\n");
#endif
#if defined(OQS_USE_AES_OPENSSL)
printf("AES: OpenSSL\n");
#else
C_OR_NI(
printf("AES: C\n"),
printf("AES: NI\n")
)
#endif
#if defined(OQS_USE_SHA2_OPENSSL)
printf("SHA-2: OpenSSL\n");
#else
printf("SHA-2: C\n");
#endif
#if defined(OQS_USE_SHA3_OPENSSL)
printf("SHA-3: OpenSSL\n");
#else
printf("SHA-3: C\n");
#endif
}
static void print_system_info(void) {
printf("Configuration info\n");
printf("==================\n");
print_platform_info();
print_compiler_info();
print_oqs_configuration();
print_cpu_extensions();
printf("\n");
}