Snap for 6355086 from 509f21f3a78189e4e8bb61bf05abff41ebd6994f to sdk-release

Change-Id: Ia6cace9c8b5cf30d9cf26d0152c9dbc0f9ed9eb8
diff --git a/CMakeLists.txt b/CMakeLists.txt
index de319ef..fefb60b 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -179,7 +179,6 @@
     LIST(APPEND CPUINFO_SRCS
       src/linux/smallfile.c
       src/linux/multiline.c
-      src/linux/current.c
       src/linux/cpulist.c
       src/linux/processors.c)
   ELSEIF(CMAKE_SYSTEM_NAME STREQUAL "Darwin" OR CMAKE_SYSTEM_NAME STREQUAL "iOS")
diff --git a/CMakeLists.txt.orig b/CMakeLists.txt.orig
deleted file mode 100644
index a71aede..0000000
--- a/CMakeLists.txt.orig
+++ /dev/null
@@ -1,819 +0,0 @@
-CMAKE_MINIMUM_REQUIRED(VERSION 2.8.12 FATAL_ERROR)
-
-INCLUDE(GNUInstallDirs)
-
-# ---[ Project and semantic versioning.
-PROJECT(cpuinfo C CXX)
-
-# ---[ Options.
-SET(CPUINFO_LIBRARY_TYPE "default" CACHE STRING "Type of cpuinfo library (shared, static, or default) to build")
-SET_PROPERTY(CACHE CPUINFO_LIBRARY_TYPE PROPERTY STRINGS default static shared)
-SET(CPUINFO_RUNTIME_TYPE "default" CACHE STRING "Type of runtime library (shared, static, or default) to use")
-SET_PROPERTY(CACHE CPUINFO_RUNTIME_TYPE PROPERTY STRINGS default static shared)
-SET(CPUINFO_LOG_LEVEL "default" CACHE STRING "Minimum logging level (info with lower severity will be ignored)")
-SET_PROPERTY(CACHE CPUINFO_LOG_LEVEL PROPERTY STRINGS default debug info warning error fatal none)
-OPTION(CPUINFO_BUILD_TOOLS "Build command-line tools" ON)
-OPTION(CPUINFO_BUILD_UNIT_TESTS "Build cpuinfo unit tests" ON)
-OPTION(CPUINFO_BUILD_MOCK_TESTS "Build cpuinfo mock tests" ON)
-OPTION(CPUINFO_BUILD_BENCHMARKS "Build cpuinfo micro-benchmarks" ON)
-
-# ---[ CMake options
-IF(CPUINFO_BUILD_UNIT_TESTS OR CPUINFO_BUILD_MOCK_TESTS)
-  ENABLE_TESTING()
-ENDIF()
-
-MACRO(CPUINFO_TARGET_ENABLE_C99 target)
-  IF(${CMAKE_VERSION} VERSION_LESS "3.1")
-    IF(NOT MSVC)
-      TARGET_COMPILE_OPTIONS(${target} PRIVATE -std=c99)
-    ENDIF()
-  ELSE()
-    SET_TARGET_PROPERTIES(${target} PROPERTIES
-      C_STANDARD 99
-      C_EXTENSIONS NO)
-  ENDIF()
-ENDMACRO()
-
-MACRO(CPUINFO_TARGET_ENABLE_CXX11 target)
-  IF(${CMAKE_VERSION} VERSION_LESS "3.1")
-    IF(NOT MSVC)
-      TARGET_COMPILE_OPTIONS(${target} PRIVATE -std=c++11)
-    ENDIF()
-  ELSE()
-    SET_TARGET_PROPERTIES(${target} PROPERTIES
-      CXX_STANDARD 11
-      CXX_EXTENSIONS NO)
-  ENDIF()
-ENDMACRO()
-
-MACRO(CPUINFO_TARGET_RUNTIME_LIBRARY target)
-  IF(MSVC AND NOT CPUINFO_RUNTIME_TYPE STREQUAL "default")
-    IF(CPUINFO_RUNTIME_TYPE STREQUAL "shared")
-      TARGET_COMPILE_OPTIONS(${target} PRIVATE
-        "/MD$<$<CONFIG:Debug>:d>")
-    ELSEIF(CPUINFO_RUNTIME_TYPE STREQUAL "static")
-      TARGET_COMPILE_OPTIONS(${target} PRIVATE
-        "/MT$<$<CONFIG:Debug>:d>")
-    ENDIF()
-  ENDIF()
-ENDMACRO()
-
-# ---[ Build flags
-SET(CPUINFO_SUPPORTED_PLATFORM TRUE)
-IF(NOT CMAKE_SYSTEM_PROCESSOR)
-  IF(NOT IOS)
-    MESSAGE(WARNING
-      "Target processor architecture is not specified. "
-      "cpuinfo will compile, but cpuinfo_initialize() will always fail.")
-    SET(CPUINFO_SUPPORTED_PLATFORM FALSE)
-  ENDIF()
-ELSEIF(NOT CMAKE_SYSTEM_PROCESSOR MATCHES "^(i[3-6]86|AMD64|x86(_64)?|armv[5-8].*|aarch64)$")
-  MESSAGE(WARNING
-    "Target processor architecture \"${CMAKE_SYSTEM_PROCESSOR}\" is not supported in cpuinfo. "
-    "cpuinfo will compile, but cpuinfo_initialize() will always fail.")
-  SET(CPUINFO_SUPPORTED_PLATFORM FALSE)
-ENDIF()
-
-IF(NOT CMAKE_SYSTEM_NAME)
-    MESSAGE(WARNING
-      "Target operating system is not specified. "
-      "cpuinfo will compile, but cpuinfo_initialize() will always fail.")
-  SET(CPUINFO_SUPPORTED_PLATFORM FALSE)
-ELSEIF(NOT CMAKE_SYSTEM_NAME MATCHES "^(Windows|Darwin|Linux|Android)$")
-  IF(${CMAKE_VERSION} VERSION_GREATER_EQUAL "3.14" AND NOT CMAKE_SYSTEM_NAME STREQUAL "iOS")
-    MESSAGE(WARNING
-      "Target operating system \"${CMAKE_SYSTEM_NAME}\" is not supported in cpuinfo. "
-      "cpuinfo will compile, but cpuinfo_initialize() will always fail.")
-    SET(CPUINFO_SUPPORTED_PLATFORM FALSE)
-  ENDIF()
-ENDIF()
-
-# ---[ Download deps
-SET(CONFU_DEPENDENCIES_SOURCE_DIR ${CMAKE_SOURCE_DIR}/deps
-  CACHE PATH "Confu-style dependencies source directory")
-SET(CONFU_DEPENDENCIES_BINARY_DIR ${CMAKE_BINARY_DIR}/deps
-  CACHE PATH "Confu-style dependencies binary directory")
-
-IF(CPUINFO_BUILD_MOCK_TESTS OR CPUINFO_BUILD_UNIT_TESTS)
-  IF(CPUINFO_SUPPORTED_PLATFORM AND NOT DEFINED GOOGLETEST_SOURCE_DIR)
-    MESSAGE(STATUS "Downloading Google Test to ${CONFU_DEPENDENCIES_SOURCE_DIR}/googletest (define GOOGLETEST_SOURCE_DIR to avoid it)")
-    CONFIGURE_FILE(cmake/DownloadGoogleTest.cmake "${CONFU_DEPENDENCIES_BINARY_DIR}/googletest-download/CMakeLists.txt")
-    EXECUTE_PROCESS(COMMAND "${CMAKE_COMMAND}" -G "${CMAKE_GENERATOR}" .
-      WORKING_DIRECTORY "${CONFU_DEPENDENCIES_BINARY_DIR}/googletest-download")
-    EXECUTE_PROCESS(COMMAND "${CMAKE_COMMAND}" --build .
-      WORKING_DIRECTORY "${CONFU_DEPENDENCIES_BINARY_DIR}/googletest-download")
-    SET(GOOGLETEST_SOURCE_DIR "${CONFU_DEPENDENCIES_SOURCE_DIR}/googletest" CACHE STRING "Google Test source directory")
-  ENDIF()
-ENDIF()
-
-IF(CPUINFO_BUILD_BENCHMARKS)
-  IF(CPUINFO_SUPPORTED_PLATFORM AND NOT DEFINED GOOGLEBENCHMARK_SOURCE_DIR)
-    MESSAGE(STATUS "Downloading Google Benchmark to ${CONFU_DEPENDENCIES_SOURCE_DIR}/googlebenchmark (define GOOGLEBENCHMARK_SOURCE_DIR to avoid it)")
-    CONFIGURE_FILE(cmake/DownloadGoogleBenchmark.cmake "${CONFU_DEPENDENCIES_BINARY_DIR}/googlebenchmark-download/CMakeLists.txt")
-    EXECUTE_PROCESS(COMMAND "${CMAKE_COMMAND}" -G "${CMAKE_GENERATOR}" .
-      WORKING_DIRECTORY "${CONFU_DEPENDENCIES_BINARY_DIR}/googlebenchmark-download")
-    EXECUTE_PROCESS(COMMAND "${CMAKE_COMMAND}" --build .
-      WORKING_DIRECTORY "${CONFU_DEPENDENCIES_BINARY_DIR}/googlebenchmark-download")
-    SET(GOOGLEBENCHMARK_SOURCE_DIR "${CONFU_DEPENDENCIES_SOURCE_DIR}/googlebenchmark" CACHE STRING "Google Benchmark source directory")
-  ENDIF()
-ENDIF()
-
-# ---[ cpuinfo library
-SET(CPUINFO_SRCS
-  src/init.c
-  src/api.c)
-
-IF(CPUINFO_SUPPORTED_PLATFORM)
-  IF(CMAKE_SYSTEM_PROCESSOR MATCHES "^(i[3-6]86|AMD64|x86(_64)?)$" OR IOS_ARCH MATCHES "^(i386|x86_64)$")
-    LIST(APPEND CPUINFO_SRCS
-      src/x86/init.c
-      src/x86/info.c
-      src/x86/vendor.c
-      src/x86/uarch.c
-      src/x86/name.c
-      src/x86/topology.c
-      src/x86/isa.c
-      src/x86/cache/init.c
-      src/x86/cache/descriptor.c
-      src/x86/cache/deterministic.c)
-    IF(CMAKE_SYSTEM_NAME STREQUAL "Linux" OR CMAKE_SYSTEM_NAME STREQUAL "Android")
-      LIST(APPEND CPUINFO_SRCS
-        src/x86/linux/init.c
-        src/x86/linux/cpuinfo.c)
-    ELSEIF(CMAKE_SYSTEM_NAME STREQUAL "Darwin" OR CMAKE_SYSTEM_NAME STREQUAL "iOS")
-      LIST(APPEND CPUINFO_SRCS src/x86/mach/init.c)
-    ELSEIF(CMAKE_SYSTEM_NAME STREQUAL "Windows")
-      LIST(APPEND CPUINFO_SRCS src/x86/windows/init.c)
-    ENDIF()
-  ELSEIF(CMAKE_SYSTEM_PROCESSOR MATCHES "^(armv[5-8].*|aarch64)$" OR IOS_ARCH MATCHES "^(armv7.*|arm64.*)$")
-    LIST(APPEND CPUINFO_SRCS
-      src/arm/uarch.c
-      src/arm/cache.c)
-    IF(CMAKE_SYSTEM_NAME STREQUAL "Linux" OR CMAKE_SYSTEM_NAME STREQUAL "Android")
-      LIST(APPEND CPUINFO_SRCS
-        src/arm/linux/init.c
-        src/arm/linux/cpuinfo.c
-        src/arm/linux/clusters.c
-        src/arm/linux/chipset.c
-        src/arm/linux/midr.c
-        src/arm/linux/hwcap.c)
-      IF(CMAKE_SYSTEM_PROCESSOR MATCHES "^armv[5-8]")
-        LIST(APPEND CPUINFO_SRCS src/arm/linux/aarch32-isa.c)
-        IF(CMAKE_SYSTEM_NAME STREQUAL "Android" AND ANDROID_ABI STREQUAL "armeabi")
-          SET_SOURCE_FILES_PROPERTIES(src/arm/linux/aarch32-isa.c PROPERTIES COMPILE_FLAGS -marm)
-        ENDIF()
-      ELSEIF(CMAKE_SYSTEM_PROCESSOR STREQUAL "aarch64")
-        LIST(APPEND CPUINFO_SRCS src/arm/linux/aarch64-isa.c)
-      ENDIF()
-    ELSEIF(IOS)
-      LIST(APPEND CPUINFO_SRCS src/arm/mach/init.c)
-    ENDIF()
-    IF(CMAKE_SYSTEM_NAME STREQUAL "Android")
-      LIST(APPEND CPUINFO_SRCS
-        src/arm/android/properties.c)
-    ENDIF()
-  ENDIF()
-
-  IF(CMAKE_SYSTEM_NAME STREQUAL "Linux" OR CMAKE_SYSTEM_NAME STREQUAL "Android")
-    LIST(APPEND CPUINFO_SRCS
-      src/linux/smallfile.c
-      src/linux/multiline.c
-      src/linux/current.c
-      src/linux/cpulist.c
-      src/linux/processors.c)
-  ELSEIF(CMAKE_SYSTEM_NAME STREQUAL "Darwin" OR CMAKE_SYSTEM_NAME STREQUAL "iOS")
-    LIST(APPEND CPUINFO_SRCS src/mach/topology.c)
-  ENDIF()
-
-  IF(CMAKE_SYSTEM_NAME STREQUAL "Linux" OR CMAKE_SYSTEM_NAME STREQUAL "Android")
-    SET(CMAKE_THREAD_PREFER_PTHREAD TRUE)
-    SET(THREADS_PREFER_PTHREAD_FLAG TRUE)
-    FIND_PACKAGE(Threads REQUIRED)
-  ENDIF()
-ENDIF()
-
-IF(CPUINFO_LIBRARY_TYPE STREQUAL "default")
-  ADD_LIBRARY(cpuinfo ${CPUINFO_SRCS})
-ELSEIF(CPUINFO_LIBRARY_TYPE STREQUAL "shared")
-  ADD_LIBRARY(cpuinfo SHARED ${CPUINFO_SRCS})
-ELSEIF(CPUINFO_LIBRARY_TYPE STREQUAL "static")
-  ADD_LIBRARY(cpuinfo STATIC ${CPUINFO_SRCS})
-ELSE()
-  MESSAGE(FATAL_ERROR "Unsupported library type ${CPUINFO_LIBRARY_TYPE}")
-ENDIF()
-ADD_LIBRARY(cpuinfo_internals STATIC ${CPUINFO_SRCS})
-CPUINFO_TARGET_ENABLE_C99(cpuinfo)
-CPUINFO_TARGET_ENABLE_C99(cpuinfo_internals)
-CPUINFO_TARGET_RUNTIME_LIBRARY(cpuinfo)
-SET_TARGET_PROPERTIES(cpuinfo PROPERTIES PUBLIC_HEADER include/cpuinfo.h)
-TARGET_INCLUDE_DIRECTORIES(cpuinfo BEFORE PUBLIC include)
-TARGET_INCLUDE_DIRECTORIES(cpuinfo BEFORE PRIVATE src)
-TARGET_INCLUDE_DIRECTORIES(cpuinfo_internals BEFORE PUBLIC include src)
-IF(CPUINFO_LOG_LEVEL STREQUAL "default")
-  # default logging level: error (subject to change)
-  TARGET_COMPILE_DEFINITIONS(cpuinfo PRIVATE CPUINFO_LOG_LEVEL=2)
-ELSEIF(CPUINFO_LOG_LEVEL STREQUAL "debug")
-  TARGET_COMPILE_DEFINITIONS(cpuinfo PRIVATE CPUINFO_LOG_LEVEL=5)
-ELSEIF(CPUINFO_LOG_LEVEL STREQUAL "info")
-  TARGET_COMPILE_DEFINITIONS(cpuinfo PRIVATE CPUINFO_LOG_LEVEL=4)
-ELSEIF(CPUINFO_LOG_LEVEL STREQUAL "warning")
-  TARGET_COMPILE_DEFINITIONS(cpuinfo PRIVATE CPUINFO_LOG_LEVEL=3)
-ELSEIF(CPUINFO_LOG_LEVEL STREQUAL "error")
-  TARGET_COMPILE_DEFINITIONS(cpuinfo PRIVATE CPUINFO_LOG_LEVEL=2)
-ELSEIF(CPUINFO_LOG_LEVEL STREQUAL "fatal")
-  TARGET_COMPILE_DEFINITIONS(cpuinfo PRIVATE CPUINFO_LOG_LEVEL=1)
-ELSEIF(CPUINFO_LOG_LEVEL STREQUAL "none")
-  TARGET_COMPILE_DEFINITIONS(cpuinfo PRIVATE CPUINFO_LOG_LEVEL=0)
-ELSE()
-  MESSAGE(FATAL_ERROR "Unsupported logging level ${CPUINFO_LOG_LEVEL}")
-ENDIF()
-TARGET_COMPILE_DEFINITIONS(cpuinfo_internals PRIVATE CPUINFO_LOG_LEVEL=0)
-
-IF(CPUINFO_SUPPORTED_PLATFORM)
-  TARGET_COMPILE_DEFINITIONS(cpuinfo INTERFACE CPUINFO_SUPPORTED_PLATFORM=1)
-  IF(CMAKE_SYSTEM_NAME STREQUAL "Linux" OR CMAKE_SYSTEM_NAME STREQUAL "Android")
-    TARGET_LINK_LIBRARIES(cpuinfo PUBLIC ${CMAKE_THREAD_LIBS_INIT})
-    TARGET_LINK_LIBRARIES(cpuinfo_internals PUBLIC ${CMAKE_THREAD_LIBS_INIT})
-    TARGET_COMPILE_DEFINITIONS(cpuinfo PRIVATE _GNU_SOURCE=1)
-    TARGET_COMPILE_DEFINITIONS(cpuinfo_internals PRIVATE _GNU_SOURCE=1)
-  ENDIF()
-ELSE()
-  TARGET_COMPILE_DEFINITIONS(cpuinfo INTERFACE CPUINFO_SUPPORTED_PLATFORM=0)
-ENDIF()
-
-# ---[ cpuinfo dependencies: clog
-IF(NOT DEFINED CLOG_SOURCE_DIR)
-  SET(CLOG_SOURCE_DIR "${PROJECT_SOURCE_DIR}/deps/clog")
-ENDIF()
-IF(NOT TARGET clog)
-  SET(CLOG_BUILD_TESTS OFF CACHE BOOL "")
-  SET(CLOG_RUNTIME_TYPE "${CPUINFO_RUNTIME_TYPE}" CACHE STRING "")
-  ADD_SUBDIRECTORY(
-    "${CLOG_SOURCE_DIR}")
-  # We build static version of clog but a dynamic library may indirectly depend on it
-  SET_PROPERTY(TARGET clog PROPERTY POSITION_INDEPENDENT_CODE ON)
-ENDIF()
-TARGET_LINK_LIBRARIES(cpuinfo PRIVATE clog)
-TARGET_LINK_LIBRARIES(cpuinfo_internals PRIVATE clog)
-
-INSTALL(TARGETS cpuinfo
-  LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
-  ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
-  PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
-
-# ---[ cpuinfo micro-benchmarks
-IF(CPUINFO_SUPPORTED_PLATFORM AND CPUINFO_BUILD_BENCHMARKS)
-  # ---[ Build google benchmark
-  IF(NOT TARGET benchmark)
-    SET(BENCHMARK_ENABLE_TESTING OFF CACHE BOOL "")
-    ADD_SUBDIRECTORY(
-      "${GOOGLEBENCHMARK_SOURCE_DIR}"
-      "${CONFU_DEPENDENCIES_BINARY_DIR}/googlebenchmark")
-  ENDIF()
-
-  IF(CMAKE_SYSTEM_NAME MATCHES "^(Linux|Android)$")
-    ADD_EXECUTABLE(get-current-bench bench/get-current.cc)
-    TARGET_LINK_LIBRARIES(get-current-bench cpuinfo benchmark)
-  ENDIF()
-
-  ADD_EXECUTABLE(init-bench bench/init.cc)
-  TARGET_LINK_LIBRARIES(init-bench cpuinfo benchmark)
-ENDIF()
-
-IF(CPUINFO_SUPPORTED_PLATFORM)
-  IF(CPUINFO_BUILD_MOCK_TESTS OR CPUINFO_BUILD_UNIT_TESTS)
-    # ---[ Build google test
-    IF(NOT TARGET gtest)
-      IF(MSVC AND NOT CPUINFO_RUNTIME_TYPE STREQUAL "static")
-        SET(gtest_force_shared_crt ON CACHE BOOL "" FORCE)
-      ENDIF()
-      ADD_SUBDIRECTORY(
-        "${GOOGLETEST_SOURCE_DIR}"
-        "${CONFU_DEPENDENCIES_BINARY_DIR}/googletest")
-    ENDIF()
-  ENDIF()
-ENDIF()
-
-# ---[ cpuinfo mock library and mock tests
-IF(CPUINFO_SUPPORTED_PLATFORM AND CPUINFO_BUILD_MOCK_TESTS)
-  SET(CPUINFO_MOCK_SRCS "${CPUINFO_SRCS}")
-  IF(CMAKE_SYSTEM_PROCESSOR MATCHES "^(i[3-6]86|AMD64|x86_64)$")
-    LIST(APPEND CPUINFO_MOCK_SRCS src/x86/mockcpuid.c)
-  ENDIF()
-  IF(CMAKE_SYSTEM_NAME STREQUAL "Linux" OR CMAKE_SYSTEM_NAME STREQUAL "Android")
-    LIST(APPEND CPUINFO_MOCK_SRCS src/linux/mockfile.c)
-  ENDIF()
-
-  ADD_LIBRARY(cpuinfo_mock STATIC ${CPUINFO_MOCK_SRCS})
-  CPUINFO_TARGET_ENABLE_C99(cpuinfo_mock)
-  CPUINFO_TARGET_RUNTIME_LIBRARY(cpuinfo_mock)
-  SET_TARGET_PROPERTIES(cpuinfo_mock PROPERTIES PUBLIC_HEADER include/cpuinfo.h)
-  TARGET_INCLUDE_DIRECTORIES(cpuinfo_mock BEFORE PUBLIC include)
-  TARGET_INCLUDE_DIRECTORIES(cpuinfo_mock BEFORE PRIVATE src)
-  TARGET_COMPILE_DEFINITIONS(cpuinfo_mock PUBLIC CPUINFO_MOCK=1)
-  TARGET_COMPILE_DEFINITIONS(cpuinfo_mock PRIVATE CLOG_LOG_TO_STDIO=1)
-  IF(CMAKE_SYSTEM_NAME STREQUAL "Linux" OR CMAKE_SYSTEM_NAME STREQUAL "Android")
-    TARGET_LINK_LIBRARIES(cpuinfo_mock PUBLIC ${CMAKE_THREAD_LIBS_INIT})
-    TARGET_COMPILE_DEFINITIONS(cpuinfo_mock PRIVATE _GNU_SOURCE=1)
-  ENDIF()
-  TARGET_LINK_LIBRARIES(cpuinfo_mock PRIVATE clog)
-
-  IF(CMAKE_SYSTEM_NAME STREQUAL "Android" AND CMAKE_SYSTEM_PROCESSOR MATCHES "^(armv5te|armv7-a)$")
-    ADD_EXECUTABLE(atm7029b-tablet-test test/mock/atm7029b-tablet.cc)
-    TARGET_INCLUDE_DIRECTORIES(atm7029b-tablet-test BEFORE PRIVATE test/mock)
-    TARGET_LINK_LIBRARIES(atm7029b-tablet-test PRIVATE cpuinfo_mock gtest)
-    ADD_TEST(atm7029b-tablet-test atm7029b-tablet-test)
-
-    ADD_EXECUTABLE(blu-r1-hd-test test/mock/blu-r1-hd.cc)
-    TARGET_INCLUDE_DIRECTORIES(blu-r1-hd-test BEFORE PRIVATE test/mock)
-    TARGET_LINK_LIBRARIES(blu-r1-hd-test PRIVATE cpuinfo_mock gtest)
-    ADD_TEST(blu-r1-hd-test blu-r1-hd-test)
-
-    ADD_EXECUTABLE(galaxy-a3-2016-eu-test test/mock/galaxy-a3-2016-eu.cc)
-    TARGET_INCLUDE_DIRECTORIES(galaxy-a3-2016-eu-test BEFORE PRIVATE test/mock)
-    TARGET_LINK_LIBRARIES(galaxy-a3-2016-eu-test PRIVATE cpuinfo_mock gtest)
-    ADD_TEST(galaxy-a3-2016-eu-test galaxy-a3-2016-eu-test)
-
-    ADD_EXECUTABLE(galaxy-a8-2016-duos-test test/mock/galaxy-a8-2016-duos.cc)
-    TARGET_INCLUDE_DIRECTORIES(galaxy-a8-2016-duos-test BEFORE PRIVATE test/mock)
-    TARGET_LINK_LIBRARIES(galaxy-a8-2016-duos-test PRIVATE cpuinfo_mock gtest)
-    ADD_TEST(galaxy-a8-2016-duos-test galaxy-a8-2016-duos-test)
-
-    ADD_EXECUTABLE(galaxy-grand-prime-value-edition-test test/mock/galaxy-grand-prime-value-edition.cc)
-    TARGET_INCLUDE_DIRECTORIES(galaxy-grand-prime-value-edition-test BEFORE PRIVATE test/mock)
-    TARGET_LINK_LIBRARIES(galaxy-grand-prime-value-edition-test PRIVATE cpuinfo_mock gtest)
-    ADD_TEST(galaxy-grand-prime-value-edition-test galaxy-grand-prime-value-edition-test)
-
-    ADD_EXECUTABLE(galaxy-j1-2016-test test/mock/galaxy-j1-2016.cc)
-    TARGET_INCLUDE_DIRECTORIES(galaxy-j1-2016-test BEFORE PRIVATE test/mock)
-    TARGET_LINK_LIBRARIES(galaxy-j1-2016-test PRIVATE cpuinfo_mock gtest)
-    ADD_TEST(galaxy-j1-2016-test galaxy-j1-2016-test)
-
-    ADD_EXECUTABLE(galaxy-j5-test test/mock/galaxy-j5.cc)
-    TARGET_INCLUDE_DIRECTORIES(galaxy-j5-test BEFORE PRIVATE test/mock)
-    TARGET_LINK_LIBRARIES(galaxy-j5-test PRIVATE cpuinfo_mock gtest)
-    ADD_TEST(galaxy-j5-test galaxy-j5-test)
-
-    ADD_EXECUTABLE(galaxy-j7-prime-test test/mock/galaxy-j7-prime.cc)
-    TARGET_INCLUDE_DIRECTORIES(galaxy-j7-prime-test BEFORE PRIVATE test/mock)
-    TARGET_LINK_LIBRARIES(galaxy-j7-prime-test PRIVATE cpuinfo_mock gtest)
-    ADD_TEST(galaxy-j7-prime-test galaxy-j7-prime-test)
-
-    ADD_EXECUTABLE(galaxy-j7-tmobile-test test/mock/galaxy-j7-tmobile.cc)
-    TARGET_INCLUDE_DIRECTORIES(galaxy-j7-tmobile-test BEFORE PRIVATE test/mock)
-    TARGET_LINK_LIBRARIES(galaxy-j7-tmobile-test PRIVATE cpuinfo_mock gtest)
-    ADD_TEST(galaxy-j7-tmobile-test galaxy-j7-tmobile-test)
-
-    ADD_EXECUTABLE(galaxy-j7-uae-test test/mock/galaxy-j7-uae.cc)
-    TARGET_INCLUDE_DIRECTORIES(galaxy-j7-uae-test BEFORE PRIVATE test/mock)
-    TARGET_LINK_LIBRARIES(galaxy-j7-uae-test PRIVATE cpuinfo_mock gtest)
-    ADD_TEST(galaxy-j7-uae-test galaxy-j7-uae-test)
-
-    ADD_EXECUTABLE(galaxy-s3-us-test test/mock/galaxy-s3-us.cc)
-    TARGET_INCLUDE_DIRECTORIES(galaxy-s3-us-test BEFORE PRIVATE test/mock)
-    TARGET_LINK_LIBRARIES(galaxy-s3-us-test PRIVATE cpuinfo_mock gtest)
-    ADD_TEST(galaxy-s3-us-test galaxy-s3-us-test)
-
-    ADD_EXECUTABLE(galaxy-s4-us-test test/mock/galaxy-s4-us.cc)
-    TARGET_INCLUDE_DIRECTORIES(galaxy-s4-us-test BEFORE PRIVATE test/mock)
-    TARGET_LINK_LIBRARIES(galaxy-s4-us-test PRIVATE cpuinfo_mock gtest)
-    ADD_TEST(galaxy-s4-us-test galaxy-s4-us-test)
-
-    ADD_EXECUTABLE(galaxy-s5-global-test test/mock/galaxy-s5-global.cc)
-    TARGET_INCLUDE_DIRECTORIES(galaxy-s5-global-test BEFORE PRIVATE test/mock)
-    TARGET_LINK_LIBRARIES(galaxy-s5-global-test PRIVATE cpuinfo_mock gtest)
-    ADD_TEST(galaxy-s5-global-test galaxy-s5-global-test)
-
-    ADD_EXECUTABLE(galaxy-s5-us-test test/mock/galaxy-s5-us.cc)
-    TARGET_INCLUDE_DIRECTORIES(galaxy-s5-us-test BEFORE PRIVATE test/mock)
-    TARGET_LINK_LIBRARIES(galaxy-s5-us-test PRIVATE cpuinfo_mock gtest)
-    ADD_TEST(galaxy-s5-us-test galaxy-s5-us-test)
-
-    ADD_EXECUTABLE(galaxy-tab-3-7.0-test test/mock/galaxy-tab-3-7.0.cc)
-    TARGET_INCLUDE_DIRECTORIES(galaxy-tab-3-7.0-test BEFORE PRIVATE test/mock)
-    TARGET_LINK_LIBRARIES(galaxy-tab-3-7.0-test PRIVATE cpuinfo_mock gtest)
-    ADD_TEST(galaxy-tab-3-7.0-test galaxy-tab-3-7.0-test)
-
-    ADD_EXECUTABLE(galaxy-tab-3-lite-test test/mock/galaxy-tab-3-lite.cc)
-    TARGET_INCLUDE_DIRECTORIES(galaxy-tab-3-lite-test BEFORE PRIVATE test/mock)
-    TARGET_LINK_LIBRARIES(galaxy-tab-3-lite-test PRIVATE cpuinfo_mock gtest)
-    ADD_TEST(galaxy-tab-3-lite-test galaxy-tab-3-lite-test)
-
-    ADD_EXECUTABLE(galaxy-win-duos-test test/mock/galaxy-win-duos.cc)
-    TARGET_INCLUDE_DIRECTORIES(galaxy-win-duos-test BEFORE PRIVATE test/mock)
-    TARGET_LINK_LIBRARIES(galaxy-win-duos-test PRIVATE cpuinfo_mock gtest)
-    ADD_TEST(galaxy-win-duos-test galaxy-win-duos-test)
-
-    ADD_EXECUTABLE(huawei-ascend-p7-test test/mock/huawei-ascend-p7.cc)
-    TARGET_INCLUDE_DIRECTORIES(huawei-ascend-p7-test BEFORE PRIVATE test/mock)
-    TARGET_LINK_LIBRARIES(huawei-ascend-p7-test PRIVATE cpuinfo_mock gtest)
-    ADD_TEST(huawei-ascend-p7-test huawei-ascend-p7-test)
-
-    ADD_EXECUTABLE(huawei-honor-6-test test/mock/huawei-honor-6.cc)
-    TARGET_INCLUDE_DIRECTORIES(huawei-honor-6-test BEFORE PRIVATE test/mock)
-    TARGET_LINK_LIBRARIES(huawei-honor-6-test PRIVATE cpuinfo_mock gtest)
-    ADD_TEST(huawei-honor-6-test huawei-honor-6-test)
-
-    ADD_EXECUTABLE(lenovo-a6600-plus-test test/mock/lenovo-a6600-plus.cc)
-    TARGET_INCLUDE_DIRECTORIES(lenovo-a6600-plus-test BEFORE PRIVATE test/mock)
-    TARGET_LINK_LIBRARIES(lenovo-a6600-plus-test PRIVATE cpuinfo_mock gtest)
-    ADD_TEST(lenovo-a6600-plus-test lenovo-a6600-plus-test)
-
-    ADD_EXECUTABLE(lenovo-vibe-x2-test test/mock/lenovo-vibe-x2.cc)
-    TARGET_INCLUDE_DIRECTORIES(lenovo-vibe-x2-test BEFORE PRIVATE test/mock)
-    TARGET_LINK_LIBRARIES(lenovo-vibe-x2-test PRIVATE cpuinfo_mock gtest)
-    ADD_TEST(lenovo-vibe-x2-test lenovo-vibe-x2-test)
-
-    ADD_EXECUTABLE(lg-k10-eu-test test/mock/lg-k10-eu.cc)
-    TARGET_INCLUDE_DIRECTORIES(lg-k10-eu-test BEFORE PRIVATE test/mock)
-    TARGET_LINK_LIBRARIES(lg-k10-eu-test PRIVATE cpuinfo_mock gtest)
-    ADD_TEST(lg-k10-eu-test lg-k10-eu-test)
-
-    ADD_EXECUTABLE(lg-optimus-g-pro-test test/mock/lg-optimus-g-pro.cc)
-    TARGET_INCLUDE_DIRECTORIES(lg-optimus-g-pro-test BEFORE PRIVATE test/mock)
-    TARGET_LINK_LIBRARIES(lg-optimus-g-pro-test PRIVATE cpuinfo_mock gtest)
-    ADD_TEST(lg-optimus-g-pro-test lg-optimus-g-pro-test)
-
-    ADD_EXECUTABLE(moto-e-gen1-test test/mock/moto-e-gen1.cc)
-    TARGET_INCLUDE_DIRECTORIES(moto-e-gen1-test BEFORE PRIVATE test/mock)
-    TARGET_LINK_LIBRARIES(moto-e-gen1-test PRIVATE cpuinfo_mock gtest)
-    ADD_TEST(moto-e-gen1-test moto-e-gen1-test)
-
-    ADD_EXECUTABLE(moto-g-gen1-test test/mock/moto-g-gen1.cc)
-    TARGET_INCLUDE_DIRECTORIES(moto-g-gen1-test BEFORE PRIVATE test/mock)
-    TARGET_LINK_LIBRARIES(moto-g-gen1-test PRIVATE cpuinfo_mock gtest)
-    ADD_TEST(moto-g-gen1-test moto-g-gen1-test)
-
-    ADD_EXECUTABLE(moto-g-gen2-test test/mock/moto-g-gen2.cc)
-    TARGET_INCLUDE_DIRECTORIES(moto-g-gen2-test BEFORE PRIVATE test/mock)
-    TARGET_LINK_LIBRARIES(moto-g-gen2-test PRIVATE cpuinfo_mock gtest)
-    ADD_TEST(moto-g-gen2-test moto-g-gen2-test)
-
-    ADD_EXECUTABLE(moto-g-gen3-test test/mock/moto-g-gen3.cc)
-    TARGET_INCLUDE_DIRECTORIES(moto-g-gen3-test BEFORE PRIVATE test/mock)
-    TARGET_LINK_LIBRARIES(moto-g-gen3-test PRIVATE cpuinfo_mock gtest)
-    ADD_TEST(moto-g-gen3-test moto-g-gen3-test)
-
-    ADD_EXECUTABLE(moto-g-gen4-test test/mock/moto-g-gen4.cc)
-    TARGET_INCLUDE_DIRECTORIES(moto-g-gen4-test BEFORE PRIVATE test/mock)
-    TARGET_LINK_LIBRARIES(moto-g-gen4-test PRIVATE cpuinfo_mock gtest)
-    ADD_TEST(moto-g-gen4-test moto-g-gen4-test)
-
-    ADD_EXECUTABLE(moto-g-gen5-test test/mock/moto-g-gen5.cc)
-    TARGET_INCLUDE_DIRECTORIES(moto-g-gen5-test BEFORE PRIVATE test/mock)
-    TARGET_LINK_LIBRARIES(moto-g-gen5-test PRIVATE cpuinfo_mock gtest)
-    ADD_TEST(moto-g-gen5-test moto-g-gen5-test)
-
-    ADD_EXECUTABLE(nexus-s-test test/mock/nexus-s.cc)
-    TARGET_INCLUDE_DIRECTORIES(nexus-s-test BEFORE PRIVATE test/mock)
-    TARGET_LINK_LIBRARIES(nexus-s-test PRIVATE cpuinfo_mock gtest)
-    ADD_TEST(nexus-s-test nexus-s-test)
-
-    ADD_EXECUTABLE(nexus4-test test/mock/nexus4.cc)
-    TARGET_INCLUDE_DIRECTORIES(nexus4-test BEFORE PRIVATE test/mock)
-    TARGET_LINK_LIBRARIES(nexus4-test PRIVATE cpuinfo_mock gtest)
-    ADD_TEST(nexus4-test nexus4-test)
-
-    ADD_EXECUTABLE(nexus6-test test/mock/nexus6.cc)
-    TARGET_INCLUDE_DIRECTORIES(nexus6-test BEFORE PRIVATE test/mock)
-    TARGET_LINK_LIBRARIES(nexus6-test PRIVATE cpuinfo_mock gtest)
-    ADD_TEST(nexus6-test nexus6-test)
-
-    ADD_EXECUTABLE(nexus10-test test/mock/nexus10.cc)
-    TARGET_INCLUDE_DIRECTORIES(nexus10-test BEFORE PRIVATE test/mock)
-    TARGET_LINK_LIBRARIES(nexus10-test PRIVATE cpuinfo_mock gtest)
-    ADD_TEST(nexus10-test nexus10-test)
-
-    ADD_EXECUTABLE(padcod-10.1-test test/mock/padcod-10.1.cc)
-    TARGET_INCLUDE_DIRECTORIES(padcod-10.1-test BEFORE PRIVATE test/mock)
-    TARGET_LINK_LIBRARIES(padcod-10.1-test PRIVATE cpuinfo_mock gtest)
-    ADD_TEST(padcod-10.1-test padcod-10.1-test)
-
-    ADD_EXECUTABLE(xiaomi-redmi-2a-test test/mock/xiaomi-redmi-2a.cc)
-    TARGET_INCLUDE_DIRECTORIES(xiaomi-redmi-2a-test BEFORE PRIVATE test/mock)
-    TARGET_LINK_LIBRARIES(xiaomi-redmi-2a-test PRIVATE cpuinfo_mock gtest)
-    ADD_TEST(xiaomi-redmi-2a-test xiaomi-redmi-2a-test)
-
-    ADD_EXECUTABLE(xperia-sl-test test/mock/xperia-sl.cc)
-    TARGET_INCLUDE_DIRECTORIES(xperia-sl-test BEFORE PRIVATE test/mock)
-    TARGET_LINK_LIBRARIES(xperia-sl-test PRIVATE cpuinfo_mock gtest)
-    ADD_TEST(xperia-sl-test xperia-sl-test)
-  ENDIF()
-
-  IF(CMAKE_SYSTEM_NAME STREQUAL "Android" AND CMAKE_SYSTEM_PROCESSOR MATCHES "^(armv5te|armv7-a|aarch64)$")
-    ADD_EXECUTABLE(alcatel-revvl-test test/mock/alcatel-revvl.cc)
-    TARGET_INCLUDE_DIRECTORIES(alcatel-revvl-test BEFORE PRIVATE test/mock)
-    TARGET_LINK_LIBRARIES(alcatel-revvl-test PRIVATE cpuinfo_mock gtest)
-    ADD_TEST(alcatel-revvl-test alcatel-revvl-test)
-
-    ADD_EXECUTABLE(galaxy-a8-2018-test test/mock/galaxy-a8-2018.cc)
-    TARGET_INCLUDE_DIRECTORIES(galaxy-a8-2018-test BEFORE PRIVATE test/mock)
-    TARGET_LINK_LIBRARIES(galaxy-a8-2018-test PRIVATE cpuinfo_mock gtest)
-    ADD_TEST(galaxy-a8-2018-test galaxy-a8-2018-test)
-
-    ADD_EXECUTABLE(galaxy-c9-pro-test test/mock/galaxy-c9-pro.cc)
-    TARGET_INCLUDE_DIRECTORIES(galaxy-c9-pro-test BEFORE PRIVATE test/mock)
-    TARGET_LINK_LIBRARIES(galaxy-c9-pro-test PRIVATE cpuinfo_mock gtest)
-    ADD_TEST(galaxy-c9-pro-test galaxy-c9-pro-test)
-
-    ADD_EXECUTABLE(galaxy-s6-test test/mock/galaxy-s6.cc)
-    TARGET_INCLUDE_DIRECTORIES(galaxy-s6-test BEFORE PRIVATE test/mock)
-    TARGET_LINK_LIBRARIES(galaxy-s6-test PRIVATE cpuinfo_mock gtest)
-    ADD_TEST(galaxy-s6-test galaxy-s6-test)
-
-    ADD_EXECUTABLE(galaxy-s7-us-test test/mock/galaxy-s7-us.cc)
-    TARGET_INCLUDE_DIRECTORIES(galaxy-s7-us-test BEFORE PRIVATE test/mock)
-    TARGET_LINK_LIBRARIES(galaxy-s7-us-test PRIVATE cpuinfo_mock gtest)
-    ADD_TEST(galaxy-s7-us-test galaxy-s7-us-test)
-
-    ADD_EXECUTABLE(galaxy-s7-global-test test/mock/galaxy-s7-global.cc)
-    TARGET_INCLUDE_DIRECTORIES(galaxy-s7-global-test BEFORE PRIVATE test/mock)
-    TARGET_LINK_LIBRARIES(galaxy-s7-global-test PRIVATE cpuinfo_mock gtest)
-    ADD_TEST(galaxy-s7-global-test galaxy-s7-global-test)
-
-    ADD_EXECUTABLE(galaxy-s8-us-test test/mock/galaxy-s8-us.cc)
-    TARGET_INCLUDE_DIRECTORIES(galaxy-s8-us-test BEFORE PRIVATE test/mock)
-    TARGET_LINK_LIBRARIES(galaxy-s8-us-test PRIVATE cpuinfo_mock gtest)
-    ADD_TEST(galaxy-s8-us-test galaxy-s8-us-test)
-
-    ADD_EXECUTABLE(galaxy-s8-global-test test/mock/galaxy-s8-global.cc)
-    TARGET_INCLUDE_DIRECTORIES(galaxy-s8-global-test BEFORE PRIVATE test/mock)
-    TARGET_LINK_LIBRARIES(galaxy-s8-global-test PRIVATE cpuinfo_mock gtest)
-    ADD_TEST(galaxy-s8-global-test galaxy-s8-global-test)
-
-    ADD_EXECUTABLE(galaxy-s9-us-test test/mock/galaxy-s9-us.cc)
-    TARGET_INCLUDE_DIRECTORIES(galaxy-s9-us-test BEFORE PRIVATE test/mock)
-    TARGET_LINK_LIBRARIES(galaxy-s9-us-test PRIVATE cpuinfo_mock gtest)
-    ADD_TEST(galaxy-s9-us-test galaxy-s9-us-test)
-
-    ADD_EXECUTABLE(galaxy-s9-global-test test/mock/galaxy-s9-global.cc)
-    TARGET_INCLUDE_DIRECTORIES(galaxy-s9-global-test BEFORE PRIVATE test/mock)
-    TARGET_LINK_LIBRARIES(galaxy-s9-global-test PRIVATE cpuinfo_mock gtest)
-    ADD_TEST(galaxy-s9-global-test galaxy-s9-global-test)
-
-    ADD_EXECUTABLE(huawei-mate-8-test test/mock/huawei-mate-8.cc)
-    TARGET_INCLUDE_DIRECTORIES(huawei-mate-8-test BEFORE PRIVATE test/mock)
-    TARGET_LINK_LIBRARIES(huawei-mate-8-test PRIVATE cpuinfo_mock gtest)
-    ADD_TEST(huawei-mate-8-test huawei-mate-8-test)
-
-    ADD_EXECUTABLE(huawei-mate-9-test test/mock/huawei-mate-9.cc)
-    TARGET_INCLUDE_DIRECTORIES(huawei-mate-9-test BEFORE PRIVATE test/mock)
-    TARGET_LINK_LIBRARIES(huawei-mate-9-test PRIVATE cpuinfo_mock gtest)
-    ADD_TEST(huawei-mate-9-test huawei-mate-9-test)
-
-    ADD_EXECUTABLE(huawei-mate-10-test test/mock/huawei-mate-10.cc)
-    TARGET_INCLUDE_DIRECTORIES(huawei-mate-10-test BEFORE PRIVATE test/mock)
-    TARGET_LINK_LIBRARIES(huawei-mate-10-test PRIVATE cpuinfo_mock gtest)
-    ADD_TEST(huawei-mate-10-test huawei-mate-10-test)
-
-    ADD_EXECUTABLE(huawei-mate-20-test test/mock/huawei-mate-20.cc)
-    TARGET_INCLUDE_DIRECTORIES(huawei-mate-20-test BEFORE PRIVATE test/mock)
-    TARGET_LINK_LIBRARIES(huawei-mate-20-test PRIVATE cpuinfo_mock gtest)
-    ADD_TEST(huawei-mate-20-test huawei-mate-20-test)
-
-    ADD_EXECUTABLE(huawei-p8-lite-test test/mock/huawei-p8-lite.cc)
-    TARGET_INCLUDE_DIRECTORIES(huawei-p8-lite-test BEFORE PRIVATE test/mock)
-    TARGET_LINK_LIBRARIES(huawei-p8-lite-test PRIVATE cpuinfo_mock gtest)
-    ADD_TEST(huawei-p8-lite-test huawei-p8-lite-test)
-
-    ADD_EXECUTABLE(huawei-p9-lite-test test/mock/huawei-p9-lite.cc)
-    TARGET_INCLUDE_DIRECTORIES(huawei-p9-lite-test BEFORE PRIVATE test/mock)
-    TARGET_LINK_LIBRARIES(huawei-p9-lite-test PRIVATE cpuinfo_mock gtest)
-    ADD_TEST(huawei-p9-lite-test huawei-p9-lite-test)
-
-    ADD_EXECUTABLE(huawei-p20-pro-test test/mock/huawei-p20-pro.cc)
-    TARGET_INCLUDE_DIRECTORIES(huawei-p20-pro-test BEFORE PRIVATE test/mock)
-    TARGET_LINK_LIBRARIES(huawei-p20-pro-test PRIVATE cpuinfo_mock gtest)
-    ADD_TEST(huawei-p20-pro-test huawei-p20-pro-test)
-
-    ADD_EXECUTABLE(iconia-one-10-test test/mock/iconia-one-10.cc)
-    TARGET_INCLUDE_DIRECTORIES(iconia-one-10-test BEFORE PRIVATE test/mock)
-    TARGET_LINK_LIBRARIES(iconia-one-10-test PRIVATE cpuinfo_mock gtest)
-    ADD_TEST(iconia-one-10-test iconia-one-10-test)
-
-    ADD_EXECUTABLE(meizu-pro-6-test test/mock/meizu-pro-6.cc)
-    TARGET_INCLUDE_DIRECTORIES(meizu-pro-6-test BEFORE PRIVATE test/mock)
-    TARGET_LINK_LIBRARIES(meizu-pro-6-test PRIVATE cpuinfo_mock gtest)
-    ADD_TEST(meizu-pro-6-test meizu-pro-6-test)
-
-    ADD_EXECUTABLE(meizu-pro-6s-test test/mock/meizu-pro-6s.cc)
-    TARGET_INCLUDE_DIRECTORIES(meizu-pro-6s-test BEFORE PRIVATE test/mock)
-    TARGET_LINK_LIBRARIES(meizu-pro-6s-test PRIVATE cpuinfo_mock gtest)
-    ADD_TEST(meizu-pro-6s-test meizu-pro-6s-test)
-
-    ADD_EXECUTABLE(meizu-pro-7-plus-test test/mock/meizu-pro-7-plus.cc)
-    TARGET_INCLUDE_DIRECTORIES(meizu-pro-7-plus-test BEFORE PRIVATE test/mock)
-    TARGET_LINK_LIBRARIES(meizu-pro-7-plus-test PRIVATE cpuinfo_mock gtest)
-    ADD_TEST(meizu-pro-7-plus-test meizu-pro-7-plus-test)
-
-    ADD_EXECUTABLE(nexus5x-test test/mock/nexus5x.cc)
-    TARGET_INCLUDE_DIRECTORIES(nexus5x-test BEFORE PRIVATE test/mock)
-    TARGET_LINK_LIBRARIES(nexus5x-test PRIVATE cpuinfo_mock gtest)
-    ADD_TEST(nexus5x-test nexus5x-test)
-
-    ADD_EXECUTABLE(nexus6p-test test/mock/nexus6p.cc)
-    TARGET_INCLUDE_DIRECTORIES(nexus6p-test BEFORE PRIVATE test/mock)
-    TARGET_LINK_LIBRARIES(nexus6p-test PRIVATE cpuinfo_mock gtest)
-    ADD_TEST(nexus6p-test nexus6p-test)
-
-    ADD_EXECUTABLE(nexus9-test test/mock/nexus9.cc)
-    TARGET_INCLUDE_DIRECTORIES(nexus9-test BEFORE PRIVATE test/mock)
-    TARGET_LINK_LIBRARIES(nexus9-test PRIVATE cpuinfo_mock gtest)
-    ADD_TEST(nexus9-test nexus9-test)
-
-    ADD_EXECUTABLE(oneplus-3t-test test/mock/oneplus-3t.cc)
-    TARGET_INCLUDE_DIRECTORIES(oneplus-3t-test BEFORE PRIVATE test/mock)
-    TARGET_LINK_LIBRARIES(oneplus-3t-test PRIVATE cpuinfo_mock gtest)
-    ADD_TEST(oneplus-3t-test oneplus-3t-test)
-
-    ADD_EXECUTABLE(oneplus-5-test test/mock/oneplus-5.cc)
-    TARGET_INCLUDE_DIRECTORIES(oneplus-5-test BEFORE PRIVATE test/mock)
-    TARGET_LINK_LIBRARIES(oneplus-5-test PRIVATE cpuinfo_mock gtest)
-    ADD_TEST(oneplus-5-test oneplus-5-test)
-
-    ADD_EXECUTABLE(oneplus-5t-test test/mock/oneplus-5t.cc)
-    TARGET_INCLUDE_DIRECTORIES(oneplus-5t-test BEFORE PRIVATE test/mock)
-    TARGET_LINK_LIBRARIES(oneplus-5t-test PRIVATE cpuinfo_mock gtest)
-    ADD_TEST(oneplus-5t-test oneplus-5t-test)
-
-    ADD_EXECUTABLE(oppo-a37-test test/mock/oppo-a37.cc)
-    TARGET_INCLUDE_DIRECTORIES(oppo-a37-test BEFORE PRIVATE test/mock)
-    TARGET_LINK_LIBRARIES(oppo-a37-test PRIVATE cpuinfo_mock gtest)
-    ADD_TEST(oppo-a37-test oppo-a37-test)
-
-    ADD_EXECUTABLE(oppo-r9-test test/mock/oppo-r9.cc)
-    TARGET_INCLUDE_DIRECTORIES(oppo-r9-test BEFORE PRIVATE test/mock)
-    TARGET_LINK_LIBRARIES(oppo-r9-test PRIVATE cpuinfo_mock gtest)
-    ADD_TEST(oppo-r9-test oppo-r9-test)
-
-    ADD_EXECUTABLE(oppo-r15-test test/mock/oppo-r15.cc)
-    TARGET_INCLUDE_DIRECTORIES(oppo-r15-test BEFORE PRIVATE test/mock)
-    TARGET_LINK_LIBRARIES(oppo-r15-test PRIVATE cpuinfo_mock gtest)
-    ADD_TEST(oppo-r15-test oppo-r15-test)
-
-    ADD_EXECUTABLE(pixel-test test/mock/pixel.cc)
-    TARGET_INCLUDE_DIRECTORIES(pixel-test BEFORE PRIVATE test/mock)
-    TARGET_LINK_LIBRARIES(pixel-test PRIVATE cpuinfo_mock gtest)
-    ADD_TEST(pixel-test pixel-test)
-
-    ADD_EXECUTABLE(pixel-c-test test/mock/pixel-c.cc)
-    TARGET_INCLUDE_DIRECTORIES(pixel-c-test BEFORE PRIVATE test/mock)
-    TARGET_LINK_LIBRARIES(pixel-c-test PRIVATE cpuinfo_mock gtest)
-    ADD_TEST(pixel-c-test pixel-c-test)
-
-    ADD_EXECUTABLE(pixel-xl-test test/mock/pixel-xl.cc)
-    TARGET_INCLUDE_DIRECTORIES(pixel-xl-test BEFORE PRIVATE test/mock)
-    TARGET_LINK_LIBRARIES(pixel-xl-test PRIVATE cpuinfo_mock gtest)
-    ADD_TEST(pixel-xl-test pixel-xl-test)
-
-    ADD_EXECUTABLE(pixel-2-xl-test test/mock/pixel-2-xl.cc)
-    TARGET_INCLUDE_DIRECTORIES(pixel-2-xl-test BEFORE PRIVATE test/mock)
-    TARGET_LINK_LIBRARIES(pixel-2-xl-test PRIVATE cpuinfo_mock gtest)
-    ADD_TEST(pixel-2-xl-test pixel-2-xl-test)
-
-    ADD_EXECUTABLE(xiaomi-mi-5c-test test/mock/xiaomi-mi-5c.cc)
-    TARGET_INCLUDE_DIRECTORIES(xiaomi-mi-5c-test BEFORE PRIVATE test/mock)
-    TARGET_LINK_LIBRARIES(xiaomi-mi-5c-test PRIVATE cpuinfo_mock gtest)
-    ADD_TEST(xiaomi-mi-5c-test xiaomi-mi-5c-test)
-
-    ADD_EXECUTABLE(xiaomi-redmi-note-3-test test/mock/xiaomi-redmi-note-3.cc)
-    TARGET_INCLUDE_DIRECTORIES(xiaomi-redmi-note-3-test BEFORE PRIVATE test/mock)
-    TARGET_LINK_LIBRARIES(xiaomi-redmi-note-3-test PRIVATE cpuinfo_mock gtest)
-    ADD_TEST(xiaomi-redmi-note-3-test xiaomi-redmi-note-3-test)
-
-    ADD_EXECUTABLE(xiaomi-redmi-note-4-test test/mock/xiaomi-redmi-note-4.cc)
-    TARGET_INCLUDE_DIRECTORIES(xiaomi-redmi-note-4-test BEFORE PRIVATE test/mock)
-    TARGET_LINK_LIBRARIES(xiaomi-redmi-note-4-test PRIVATE cpuinfo_mock gtest)
-    ADD_TEST(xiaomi-redmi-note-4-test xiaomi-redmi-note-4-test)
-
-    ADD_EXECUTABLE(xperia-c4-dual-test test/mock/xperia-c4-dual.cc)
-    TARGET_INCLUDE_DIRECTORIES(xperia-c4-dual-test BEFORE PRIVATE test/mock)
-    TARGET_LINK_LIBRARIES(xperia-c4-dual-test PRIVATE cpuinfo_mock gtest)
-    ADD_TEST(xperia-c4-dual-test xperia-c4-dual-test)
-  ENDIF()
-
-  IF(CMAKE_SYSTEM_NAME STREQUAL "Android" AND CMAKE_SYSTEM_PROCESSOR MATCHES "^(i686|x86_64)$")
-    ADD_EXECUTABLE(alldocube-iwork8-test test/mock/alldocube-iwork8.cc)
-    TARGET_INCLUDE_DIRECTORIES(alldocube-iwork8-test BEFORE PRIVATE test/mock)
-    TARGET_LINK_LIBRARIES(alldocube-iwork8-test PRIVATE cpuinfo_mock gtest)
-    ADD_TEST(alldocube-iwork8-test alldocube-iwork8-test)
-
-    ADD_EXECUTABLE(leagoo-t5c-test test/mock/leagoo-t5c.cc)
-    TARGET_INCLUDE_DIRECTORIES(leagoo-t5c-test BEFORE PRIVATE test/mock)
-    TARGET_LINK_LIBRARIES(leagoo-t5c-test PRIVATE cpuinfo_mock gtest)
-    ADD_TEST(leagoo-t5c-test leagoo-t5c-test)
-
-    ADD_EXECUTABLE(memo-pad-7-test test/mock/memo-pad-7.cc)
-    TARGET_INCLUDE_DIRECTORIES(memo-pad-7-test BEFORE PRIVATE test/mock)
-    TARGET_LINK_LIBRARIES(memo-pad-7-test PRIVATE cpuinfo_mock gtest)
-    ADD_TEST(memo-pad-7-test memo-pad-7-test)
-
-    ADD_EXECUTABLE(zenfone-c-test test/mock/zenfone-c.cc)
-    TARGET_INCLUDE_DIRECTORIES(zenfone-c-test BEFORE PRIVATE test/mock)
-    TARGET_LINK_LIBRARIES(zenfone-c-test PRIVATE cpuinfo_mock gtest)
-    ADD_TEST(zenfone-c-test zenfone-c-test)
-
-    ADD_EXECUTABLE(zenfone-2-test test/mock/zenfone-2.cc)
-    TARGET_INCLUDE_DIRECTORIES(zenfone-2-test BEFORE PRIVATE test/mock)
-    TARGET_LINK_LIBRARIES(zenfone-2-test PRIVATE cpuinfo_mock gtest)
-    ADD_TEST(zenfone-2-test zenfone-2-test)
-
-    ADD_EXECUTABLE(zenfone-2e-test test/mock/zenfone-2e.cc)
-    TARGET_INCLUDE_DIRECTORIES(zenfone-2e-test BEFORE PRIVATE test/mock)
-    TARGET_LINK_LIBRARIES(zenfone-2e-test PRIVATE cpuinfo_mock gtest)
-    ADD_TEST(zenfone-2e-test zenfone-2e-test)
-  ENDIF()
-ENDIF()
-
-# ---[ cpuinfo unit tests
-IF(CPUINFO_SUPPORTED_PLATFORM AND CPUINFO_BUILD_UNIT_TESTS)
-  ADD_EXECUTABLE(init-test test/init.cc)
-  CPUINFO_TARGET_ENABLE_CXX11(init-test)
-  CPUINFO_TARGET_RUNTIME_LIBRARY(init-test)
-  TARGET_LINK_LIBRARIES(init-test PRIVATE cpuinfo gtest gtest_main)
-  ADD_TEST(init-test init-test)
-
-  IF(CMAKE_SYSTEM_NAME STREQUAL "Linux" OR CMAKE_SYSTEM_NAME STREQUAL "Android")
-    ADD_EXECUTABLE(get-current-test test/get-current.cc)
-    CPUINFO_TARGET_ENABLE_CXX11(get-current-test)
-    CPUINFO_TARGET_RUNTIME_LIBRARY(get-current-test)
-    TARGET_LINK_LIBRARIES(get-current-test PRIVATE cpuinfo gtest gtest_main)
-    ADD_TEST(get-current-test get-current-test)
-  ENDIF()
-
-  IF(CMAKE_SYSTEM_PROCESSOR MATCHES "^(i[3-6]86|AMD64|x86_64)$")
-    ADD_EXECUTABLE(brand-string-test test/name/brand-string.cc)
-    CPUINFO_TARGET_ENABLE_CXX11(brand-string-test)
-    CPUINFO_TARGET_RUNTIME_LIBRARY(brand-string-test)
-    TARGET_LINK_LIBRARIES(brand-string-test PRIVATE cpuinfo_internals gtest gtest_main)
-    ADD_TEST(brand-string-test brand-string-test)
-  ENDIF()
-
-  IF(CMAKE_SYSTEM_NAME STREQUAL "Android" AND CMAKE_SYSTEM_PROCESSOR MATCHES "^(armv[5-8].*|aarch64)$")
-    ADD_LIBRARY(android_properties_interface STATIC test/name/android-properties-interface.c)
-    CPUINFO_TARGET_ENABLE_C99(android_properties_interface)
-    CPUINFO_TARGET_RUNTIME_LIBRARY(android_properties_interface)
-    TARGET_LINK_LIBRARIES(android_properties_interface PRIVATE cpuinfo_internals)
-
-    ADD_EXECUTABLE(chipset-test
-      test/name/proc-cpuinfo-hardware.cc
-      test/name/ro-product-board.cc
-      test/name/ro-board-platform.cc
-      test/name/ro-mediatek-platform.cc
-      test/name/ro-arch.cc
-      test/name/ro-chipname.cc
-      test/name/android-properties.cc)
-    CPUINFO_TARGET_ENABLE_CXX11(chipset-test)
-    CPUINFO_TARGET_RUNTIME_LIBRARY(chipset-test)
-    TARGET_LINK_LIBRARIES(chipset-test PRIVATE android_properties_interface gtest gtest_main)
-    ADD_TEST(chipset-test chipset-test)
-
-    ADD_EXECUTABLE(cache-test test/arm-cache.cc)
-    CPUINFO_TARGET_ENABLE_CXX11(cache-test)
-    CPUINFO_TARGET_RUNTIME_LIBRARY(cache-test)
-    TARGET_COMPILE_DEFINITIONS(cache-test PRIVATE __STDC_LIMIT_MACROS=1 __STDC_CONSTANT_MACROS=1)
-    TARGET_LINK_LIBRARIES(cache-test PRIVATE cpuinfo_internals gtest gtest_main)
-    ADD_TEST(cache-test, cache-test)
-  ENDIF()
-ENDIF()
-
-# ---[ Helper and debug tools
-IF(CPUINFO_SUPPORTED_PLATFORM AND CPUINFO_BUILD_TOOLS)
-  ADD_EXECUTABLE(isa-info tools/isa-info.c)
-  CPUINFO_TARGET_ENABLE_C99(isa-info)
-  CPUINFO_TARGET_RUNTIME_LIBRARY(isa-info)
-  TARGET_LINK_LIBRARIES(isa-info PRIVATE cpuinfo)
-  INSTALL(TARGETS isa-info RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
-
-  ADD_EXECUTABLE(cpu-info tools/cpu-info.c)
-  CPUINFO_TARGET_ENABLE_C99(cpu-info)
-  CPUINFO_TARGET_RUNTIME_LIBRARY(cpu-info)
-  TARGET_LINK_LIBRARIES(cpu-info PRIVATE cpuinfo)
-  INSTALL(TARGETS cpu-info RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
-
-  ADD_EXECUTABLE(cache-info tools/cache-info.c)
-  CPUINFO_TARGET_ENABLE_C99(cache-info)
-  CPUINFO_TARGET_RUNTIME_LIBRARY(cache-info)
-  TARGET_LINK_LIBRARIES(cache-info PRIVATE cpuinfo)
-  INSTALL(TARGETS cache-info RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
-
-  IF(CMAKE_SYSTEM_NAME MATCHES "^(Android|Linux)$" AND CMAKE_SYSTEM_PROCESSOR MATCHES "^(armv[5-8].*|aarch64)$")
-    ADD_EXECUTABLE(auxv-dump tools/auxv-dump.c)
-    CPUINFO_TARGET_ENABLE_C99(auxv-dump)
-    CPUINFO_TARGET_RUNTIME_LIBRARY(auxv-dump)
-    TARGET_LINK_LIBRARIES(auxv-dump PRIVATE ${CMAKE_DL_LIBS} cpuinfo)
-
-    ADD_EXECUTABLE(cpuinfo-dump tools/cpuinfo-dump.c)
-    CPUINFO_TARGET_ENABLE_C99(cpuinfo-dump)
-    CPUINFO_TARGET_RUNTIME_LIBRARY(cpuinfo-dump)
-  ENDIF()
-
-  IF(CMAKE_SYSTEM_PROCESSOR MATCHES "^(i[3-6]86|AMD64|x86_64)$")
-    ADD_EXECUTABLE(cpuid-dump tools/cpuid-dump.c)
-    CPUINFO_TARGET_ENABLE_C99(cpuid-dump)
-    CPUINFO_TARGET_RUNTIME_LIBRARY(cpuid-dump)
-    TARGET_INCLUDE_DIRECTORIES(cpuid-dump BEFORE PRIVATE src)
-    TARGET_INCLUDE_DIRECTORIES(cpuid-dump BEFORE PRIVATE include)
-    INSTALL(TARGETS cpuid-dump RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
-  ENDIF()
-ENDIF()
diff --git a/README.md b/README.md
index 393c32c..ee5fb82 100644
--- a/README.md
+++ b/README.md
@@ -152,21 +152,20 @@
   - [x] Using `ro.chipname`, `ro.board.platform`, `ro.product.board`, `ro.mediatek.platform`, `ro.arch` properties (Android)
   - [ ] Using kernel log (`dmesg`) on ARM Linux
 - Vendor and microarchitecture detection
-  - [x] Intel-designed x86/x86-64 cores (up to Kaby Lake, Airmont, and Knights Mill)
-  - [x] AMD-designed x86/x86-64 cores (up to Puma/Jaguar and Zen)
+  - [x] Intel-designed x86/x86-64 cores (up to Sunny Cove, Goldmont Plus, and Knights Mill)
+  - [x] AMD-designed x86/x86-64 cores (up to Puma/Jaguar and Zen 2)
   - [ ] VIA-designed x86/x86-64 cores
   - [ ] Other x86 cores (DM&P, RDC, Transmeta, Cyrix, Rise)
-  - [x] ARM-designed ARM cores (up to Cortex-A55 and Cortex-A75)
-  - [x] Qualcomm-designed ARM cores (up to Kryo, Kryo-280, and Kryo-385)
-  - [x] Nvidia-designed ARM cores (Denver)
-  - [x] Samsung-designed ARM cores (Mongoose and Meerkat)
+  - [x] ARM-designed ARM cores (up to Cortex-A55, Cortex-A77, and Neoverse E1/N1)
+  - [x] Qualcomm-designed ARM cores (Scorpion, Krait, and Kryo)
+  - [x] Nvidia-designed ARM cores (Denver and Carmel)
+  - [x] Samsung-designed ARM cores (Exynos)
   - [x] Intel-designed ARM cores (XScale up to 3rd-gen)
-  - [x] Apple-designed ARM cores (up to Hurricane)
+  - [x] Apple-designed ARM cores (up to Lightning and Thunder)
   - [x] Cavium-designed ARM cores (ThunderX)
   - [x] AppliedMicro-designed ARM cores (X-Gene)
 - Instruction set detection
   - [x] Using CPUID (x86/x86-64)
-  - [x] Using dynamic code generation validator (Native Client/x86-64)
   - [x] Using `/proc/cpuinfo` on 32-bit ARM EABI (Linux)
   - [x] Using microarchitecture heuristics on (32-bit ARM)
   - [x] Using `FPSID` and `WCID` registers (32-bit ARM)
diff --git a/bench/get-current.cc b/bench/get-current.cc
index 91b35a0..b547df0 100644
--- a/bench/get-current.cc
+++ b/bench/get-current.cc
@@ -21,4 +21,13 @@
 }
 BENCHMARK(cpuinfo_get_current_core)->Unit(benchmark::kNanosecond);
 
+static void cpuinfo_get_current_uarch_index(benchmark::State& state) {
+	cpuinfo_initialize();
+	while (state.KeepRunning()) {
+		const uint32_t uarch_index = cpuinfo_get_current_uarch_index();
+		benchmark::DoNotOptimize(uarch_index);
+	}
+}
+BENCHMARK(cpuinfo_get_current_uarch_index)->Unit(benchmark::kNanosecond);
+
 BENCHMARK_MAIN();
diff --git a/cmake/DownloadGoogleTest.cmake b/cmake/DownloadGoogleTest.cmake
index d69d19a..dc86c9c 100644
--- a/cmake/DownloadGoogleTest.cmake
+++ b/cmake/DownloadGoogleTest.cmake
@@ -4,8 +4,8 @@
 
 INCLUDE(ExternalProject)
 ExternalProject_Add(googletest
-	URL https://github.com/google/googletest/archive/release-1.8.0.zip
-	URL_HASH SHA256=f3ed3b58511efd272eb074a3a6d6fb79d7c2e6a0e374323d1e6bcbcc1ef141bf
+	URL https://github.com/google/googletest/archive/release-1.10.0.zip
+	URL_HASH SHA256=94c634d499558a76fa649edb13721dce6e98fb1e7018dfaeba3cd7a083945e91
 	SOURCE_DIR "${CONFU_DEPENDENCIES_SOURCE_DIR}/googletest"
 	BINARY_DIR "${CONFU_DEPENDENCIES_BINARY_DIR}/googletest"
 	CONFIGURE_COMMAND ""
diff --git a/configure.py b/configure.py
index a340c4c..0e58dba 100755
--- a/configure.py
+++ b/configure.py
@@ -26,8 +26,8 @@
         sources = ["init.c", "api.c"]
         if build.target.is_x86 or build.target.is_x86_64:
             sources += [
-                "x86/init.c", "x86/info.c", "x86/vendor.c", "x86/uarch.c", "x86/name.c",
-                "x86/topology.c",
+                "x86/init.c", "x86/info.c", "x86/isa.c", "x86/vendor.c",
+                "x86/uarch.c", "x86/name.c", "x86/topology.c",
                 "x86/cache/init.c", "x86/cache/descriptor.c", "x86/cache/deterministic.c",
             ]
             if build.target.is_macos:
@@ -37,7 +37,6 @@
                     "x86/linux/init.c",
                     "x86/linux/cpuinfo.c",
                 ]
-            sources.append("x86/isa.c" if not build.target.is_nacl else "x86/nacl/isa.c")
         if build.target.is_arm or build.target.is_arm64:
             sources += ["arm/uarch.c", "arm/cache.c"]
             if build.target.is_linux or build.target.is_android:
diff --git a/src/arm/android/api.h b/src/arm/android/api.h
index b959894..228632a 100644
--- a/src/arm/android/api.h
+++ b/src/arm/android/api.h
@@ -12,6 +12,7 @@
 	cpuinfo_android_chipset_property_ro_mediatek_platform,
 	cpuinfo_android_chipset_property_ro_arch,
 	cpuinfo_android_chipset_property_ro_chipname,
+	cpuinfo_android_chipset_property_ro_hardware_chipname,
 	cpuinfo_android_chipset_property_max,
 };
 
diff --git a/src/arm/android/properties.c b/src/arm/android/properties.c
index 6e69647..5f93889 100644
--- a/src/arm/android/properties.c
+++ b/src/arm/android/properties.c
@@ -60,4 +60,8 @@
 	const int ro_chipname_length =
 		cpuinfo_android_property_get("ro.chipname", properties->ro_chipname);
 	cpuinfo_log_debug("read ro.chipname = \"%.*s\"", ro_chipname_length, properties->ro_chipname);
+
+	const int ro_hardware_chipname_length =
+		cpuinfo_android_property_get("ro.hardware.chipname", properties->ro_hardware_chipname);
+	cpuinfo_log_debug("read ro.hardware.chipname = \"%.*s\"", ro_hardware_chipname_length, properties->ro_hardware_chipname);
 }
diff --git a/src/arm/api.h b/src/arm/api.h
index 69274bc..48b99dd 100644
--- a/src/arm/api.h
+++ b/src/arm/api.h
@@ -78,45 +78,45 @@
 #define CPUINFO_ARM_CHIPSET_NAME_MAX CPUINFO_PACKAGE_NAME_MAX
 
 #ifndef __cplusplus
-CPUINFO_INTERNAL void cpuinfo_arm_chipset_to_string(
-	const struct cpuinfo_arm_chipset chipset[restrict static 1],
-	char name[restrict static CPUINFO_ARM_CHIPSET_NAME_MAX]);
+	CPUINFO_INTERNAL void cpuinfo_arm_chipset_to_string(
+		const struct cpuinfo_arm_chipset chipset[restrict static 1],
+		char name[restrict static CPUINFO_ARM_CHIPSET_NAME_MAX]);
 
-CPUINFO_INTERNAL void cpuinfo_arm_fixup_chipset(
-	struct cpuinfo_arm_chipset chipset[restrict static 1], uint32_t cores, uint32_t max_cpu_freq_max);
+	CPUINFO_INTERNAL void cpuinfo_arm_fixup_chipset(
+		struct cpuinfo_arm_chipset chipset[restrict static 1], uint32_t cores, uint32_t max_cpu_freq_max);
 
-CPUINFO_INTERNAL void cpuinfo_arm_decode_vendor_uarch(
-	uint32_t midr,
-#if CPUINFO_ARCH_ARM
-	bool has_vfpv4,
-#endif
-	enum cpuinfo_vendor vendor[restrict static 1],
-	enum cpuinfo_uarch uarch[restrict static 1]);
+	CPUINFO_INTERNAL void cpuinfo_arm_decode_vendor_uarch(
+		uint32_t midr,
+	#if CPUINFO_ARCH_ARM
+		bool has_vfpv4,
+	#endif
+		enum cpuinfo_vendor vendor[restrict static 1],
+		enum cpuinfo_uarch uarch[restrict static 1]);
 
-CPUINFO_INTERNAL void cpuinfo_arm_decode_cache(
-	enum cpuinfo_uarch uarch,
-	uint32_t cluster_cores,
-	uint32_t midr,
-	const struct cpuinfo_arm_chipset chipset[restrict static 1],
-	uint32_t cluster_id,
-	uint32_t arch_version,
-	struct cpuinfo_cache l1i[restrict static 1],
-	struct cpuinfo_cache l1d[restrict static 1],
-	struct cpuinfo_cache l2[restrict static 1],
-	struct cpuinfo_cache l3[restrict static 1]);
+	CPUINFO_INTERNAL void cpuinfo_arm_decode_cache(
+		enum cpuinfo_uarch uarch,
+		uint32_t cluster_cores,
+		uint32_t midr,
+		const struct cpuinfo_arm_chipset chipset[restrict static 1],
+		uint32_t cluster_id,
+		uint32_t arch_version,
+		struct cpuinfo_cache l1i[restrict static 1],
+		struct cpuinfo_cache l1d[restrict static 1],
+		struct cpuinfo_cache l2[restrict static 1],
+		struct cpuinfo_cache l3[restrict static 1]);
 
-CPUINFO_INTERNAL uint32_t cpuinfo_arm_compute_max_cache_size(
-	const struct cpuinfo_processor processor[restrict static 1]);
+	CPUINFO_INTERNAL uint32_t cpuinfo_arm_compute_max_cache_size(
+		const struct cpuinfo_processor processor[restrict static 1]);
 #else /* defined(__cplusplus) */
-CPUINFO_INTERNAL void cpuinfo_arm_decode_cache(
-	enum cpuinfo_uarch uarch,
-	uint32_t cluster_cores,
-	uint32_t midr,
-	const struct cpuinfo_arm_chipset chipset[1],
-	uint32_t cluster_id,
-	uint32_t arch_version,
-	struct cpuinfo_cache l1i[1],
-	struct cpuinfo_cache l1d[1],
-	struct cpuinfo_cache l2[1],
-	struct cpuinfo_cache l3[1]);
+	CPUINFO_INTERNAL void cpuinfo_arm_decode_cache(
+		enum cpuinfo_uarch uarch,
+		uint32_t cluster_cores,
+		uint32_t midr,
+		const struct cpuinfo_arm_chipset chipset[1],
+		uint32_t cluster_id,
+		uint32_t arch_version,
+		struct cpuinfo_cache l1i[1],
+		struct cpuinfo_cache l1d[1],
+		struct cpuinfo_cache l2[1],
+		struct cpuinfo_cache l3[1]);
 #endif
diff --git a/src/arm/linux/api.h b/src/arm/linux/api.h
index afefdb3..f99da66 100644
--- a/src/arm/linux/api.h
+++ b/src/arm/linux/api.h
@@ -24,6 +24,7 @@
 		char ro_mediatek_platform[CPUINFO_BUILD_PROP_VALUE_MAX];
 		char ro_arch[CPUINFO_BUILD_PROP_VALUE_MAX];
 		char ro_chipname[CPUINFO_BUILD_PROP_VALUE_MAX];
+		char ro_hardware_chipname[CPUINFO_BUILD_PROP_VALUE_MAX];
 	};
 #endif
 
@@ -323,6 +324,9 @@
 	CPUINFO_INTERNAL struct cpuinfo_arm_chipset
 		cpuinfo_arm_android_decode_chipset_from_ro_chipname(
 			const char ro_chipname[restrict static CPUINFO_BUILD_PROP_VALUE_MAX]);
+	CPUINFO_INTERNAL struct cpuinfo_arm_chipset
+		cpuinfo_arm_android_decode_chipset_from_ro_hardware_chipname(
+			const char ro_hardware_chipname[restrict static CPUINFO_BUILD_PROP_VALUE_MAX]);
 #endif
 
 CPUINFO_INTERNAL bool cpuinfo_arm_linux_detect_core_clusters_by_heuristic(
diff --git a/src/arm/linux/chipset.c b/src/arm/linux/chipset.c
index f365842..35058d9 100644
--- a/src/arm/linux/chipset.c
+++ b/src/arm/linux/chipset.c
@@ -235,6 +235,53 @@
 }
 
 /**
+ * Tries to match /SM\d{4}$/ signature for Qualcomm Snapdragon chipsets.
+ * If match successful, extracts model information into \p chipset argument.
+ *
+ * @param start - start of the /proc/cpuinfo Hardware string to match.
+ * @param end - end of the /proc/cpuinfo Hardware string to match.
+ * @param[out] chipset - location where chipset information will be stored upon a successful match.
+ *
+ * @returns true if signature matched, false otherwise.
+ */
+static bool match_sm(
+	const char* start, const char* end,
+	struct cpuinfo_arm_chipset chipset[restrict static 1])
+{
+	/* Expect exactly 6 symbols: 2 symbols "SM" + 4 digits */
+	if (start + 6 != end) {
+		return false;
+	}
+
+	/* Check that string starts with "SM".
+	 * The first three characters are loaded and compared as 16-bit little endian word.
+	 */
+	const uint32_t expected_sm = load_u16le(start);
+	if (expected_sm != UINT16_C(0x4D53) /* "MS" = reverse("SM") */) {
+		return false;
+	}
+
+	/* Validate and parse 4-digit model number */
+	uint32_t model = 0;
+	for (uint32_t i = 2; i < 6; i++) {
+		const uint32_t digit = (uint32_t) (uint8_t) start[i] - '0';
+		if (digit >= 10) {
+			/* Not really a digit */
+			return false;
+		}
+		model = model * 10 + digit;
+	}
+
+	/* Return parsed chipset. */
+	*chipset = (struct cpuinfo_arm_chipset) {
+		.vendor = cpuinfo_arm_chipset_vendor_qualcomm,
+		.series = cpuinfo_arm_chipset_series_qualcomm_snapdragon,
+		.model = model,
+	};
+	return true;
+}
+
+/**
  * Tries to match /Samsung Exynos\d{4}$/ signature (case-insensitive) for Samsung Exynos chipsets.
  * If match successful, extracts model information into \p chipset argument.
  *
@@ -735,7 +782,7 @@
 }
 
 /**
- * Tries to match, case-insentitively, /sc\d{4}[a-z]*|scx15$/ signature for Spreadtrum SC chipsets.
+ * Tries to match, case-insentitively, /s[cp]\d{4}[a-z]*|scx15$/ signature for Spreadtrum SC chipsets.
  * If match successful, extracts model information into \p chipset argument.
  *
  * @param start - start of the platform identifier (/proc/cpuinfo Hardware string, ro.product.board,
@@ -756,12 +803,16 @@
 	}
 
 	/*
-	 * Check that string starts with "SC" (case-insensitive).
+	 * Check that string starts with "S[CP]" (case-insensitive).
 	 * The first two characters are loaded as 16-bit little endian word and converted to lowercase.
 	 */
-	const uint16_t expected_sc = UINT16_C(0x2020) | load_u16le(start);
-	if (expected_sc != UINT16_C(0x6373) /* "cs" = reverse("sc") */) {
-		return false;
+	const uint16_t expected_sc_or_sp = UINT16_C(0x2020) | load_u16le(start);
+	switch (expected_sc_or_sp) {
+		case UINT16_C(0x6373): /* "cs" = reverse("sc") */
+		case UINT16_C(0x7073): /* "ps" = reverse("sp") */
+			break;
+		default:
+			return false;
 	}
 
 	/* Special case: "scx" prefix (SC7715 reported as "scx15") */
@@ -785,7 +836,7 @@
 		return true;
 	}
 
-	/* Expect at least 6 symbols: "SC" (2 symbols) + 4-digit model number */
+	/* Expect at least 6 symbols: "S[CP]" (2 symbols) + 4-digit model number */
 	if (start + 6 > end) {
 		return false;
 	}
@@ -2188,6 +2239,14 @@
 							return chipset;
 						}
 
+						/* Check SMxxxx (Qualcomm Snapdragon) signature */
+						if (match_sm(pos, hardware_end, &chipset)) {
+							cpuinfo_log_debug(
+								"matched Qualcomm SM signature in /proc/cpuinfo Hardware string \"%.*s\"",
+								(int) hardware_length, hardware);
+							return chipset;
+						}
+
 						/* Check MediaTek MT signature */
 						if (match_mt(pos, hardware_end, true, &chipset)) {
 							cpuinfo_log_debug(
@@ -2949,13 +3008,14 @@
 	}
 
 	/*
-	 * Decodes chipset name from ro.chipname Android system property.
+	 * Decodes chipset name from ro.chipname or ro.hardware.chipname Android system property.
 	 *
-	 * @param[in] chipname - ro.chipname value.
+	 * @param[in] chipname - ro.chipname or ro.hardware.chipname value.
 	 *
 	 * @returns Decoded chipset name. If chipset could not be decoded, the resulting structure would use `unknown` vendor
 	 *          and series identifiers.
 	 */
+
 	struct cpuinfo_arm_chipset cpuinfo_arm_android_decode_chipset_from_ro_chipname(
 		const char chipname[restrict static CPUINFO_BUILD_PROP_VALUE_MAX])
 	{
@@ -2971,6 +3031,14 @@
 			return chipset;
 		}
 
+		/* Check SMxxxx (Qualcomm Snapdragon) signature */
+		if (match_sm(chipname, chipname_end, &chipset)) {
+			cpuinfo_log_debug(
+				"matched Qualcomm SM signature in /proc/cpuinfo Hardware string \"%.*s\"",
+				(int) chipname_length, chipname);
+			return chipset;
+		}
+
 		/* Check exynosXXXX (Samsung Exynos) signature */
 		if (match_exynos(chipname, chipname_end, &chipset)) {
 			cpuinfo_log_debug(
@@ -3181,12 +3249,6 @@
 			}
 			break;
 		}
-		case cpuinfo_arm_chipset_series_qualcomm_snapdragon:
-			/* Snapdragon 670 was renamed to Snapdragon 710 */
-			if (chipset->model == 670) {
-				chipset->model = 710;
-			}
-			break;
 		case cpuinfo_arm_chipset_series_samsung_exynos:
 			switch (chipset->model) {
 #if CPUINFO_ARCH_ARM
@@ -3372,8 +3434,12 @@
 		const struct cpuinfo_arm_chipset proc_cpuinfo_hardware_chipset[restrict static 1],
 		const struct cpuinfo_arm_chipset ro_product_board_chipset[restrict static 1],
 		const struct cpuinfo_arm_chipset ro_board_platform_chipset[restrict static 1],
-		const struct cpuinfo_arm_chipset ro_chipname_chipset[restrict static 1])
+		const struct cpuinfo_arm_chipset ro_chipname_chipset[restrict static 1],
+		const struct cpuinfo_arm_chipset ro_hardware_chipname_chipset[restrict static 1])
 	{
+		if (ro_hardware_chipname_chipset->series != cpuinfo_arm_chipset_series_unknown) {
+			return *ro_hardware_chipname_chipset;
+		}
 		if (ro_chipname_chipset->series != cpuinfo_arm_chipset_series_unknown) {
 			return *ro_chipname_chipset;
 		}
@@ -3524,6 +3590,8 @@
 				cpuinfo_arm_android_decode_chipset_from_ro_arch(properties->ro_arch),
 			[cpuinfo_android_chipset_property_ro_chipname] =
 				cpuinfo_arm_android_decode_chipset_from_ro_chipname(properties->ro_chipname),
+			[cpuinfo_android_chipset_property_ro_hardware_chipname] =
+				cpuinfo_arm_android_decode_chipset_from_ro_chipname(properties->ro_hardware_chipname),
 		};
 		enum cpuinfo_arm_chipset_vendor vendor = cpuinfo_arm_chipset_vendor_unknown;
 		for (size_t i = 0; i < cpuinfo_android_chipset_property_max; i++) {
@@ -3592,7 +3660,8 @@
 								&chipsets[cpuinfo_android_chipset_property_proc_cpuinfo_hardware],
 								&chipsets[cpuinfo_android_chipset_property_ro_product_board],
 								&chipsets[cpuinfo_android_chipset_property_ro_board_platform],
-								&chipsets[cpuinfo_android_chipset_property_ro_chipname]);
+								&chipsets[cpuinfo_android_chipset_property_ro_chipname],
+								&chipsets[cpuinfo_android_chipset_property_ro_hardware_chipname]);
 						case cpuinfo_arm_chipset_vendor_mediatek:
 							return disambiguate_mediatek_chipset(
 								&chipsets[cpuinfo_android_chipset_property_proc_cpuinfo_hardware],
diff --git a/src/cpuinfo/internal-api.h b/src/cpuinfo/internal-api.h
index 8d97e92..c6eed0b 100644
--- a/src/cpuinfo/internal-api.h
+++ b/src/cpuinfo/internal-api.h
@@ -55,6 +55,7 @@
 #endif
 CPUINFO_PRIVATE void cpuinfo_arm_mach_init(void);
 CPUINFO_PRIVATE void cpuinfo_arm_linux_init(void);
+CPUINFO_PRIVATE void cpuinfo_emscripten_init(void);
 
 CPUINFO_PRIVATE uint32_t cpuinfo_compute_max_cache_size(const struct cpuinfo_processor* processor);
 
diff --git a/src/init.c b/src/init.c
index fa69807..10a1afc 100644
--- a/src/init.c
+++ b/src/init.c
@@ -1,6 +1,6 @@
 #ifdef _WIN32
 	#include <windows.h>
-#else
+#elif !defined(__EMSCRIPTEN__) || defined(__EMSCRIPTEN_PTHREADS__)
 	#include <pthread.h>
 #endif
 
@@ -15,8 +15,10 @@
 
 #ifdef _WIN32
 	static INIT_ONCE init_guard = INIT_ONCE_STATIC_INIT;
-#else
+#elif !defined(__EMSCRIPTEN__) || defined(__EMSCRIPTEN_PTHREADS__)
 	static pthread_once_t init_guard = PTHREAD_ONCE_INIT;
+#else
+	static bool init_guard = false;
 #endif
 
 bool CPUINFO_ABI cpuinfo_initialize(void) {
@@ -38,6 +40,15 @@
 	#else
 		cpuinfo_log_error("operating system is not supported in cpuinfo");
 	#endif
+#elif CPUINFO_ARCH_ASMJS || CPUINFO_ARCH_WASM || CPUINFO_ARCH_WASMSIMD
+	#if defined(__EMSCRIPTEN_PTHREADS__)
+		pthread_once(&init_guard, &cpuinfo_emscripten_init);
+	#else
+		if (!init_guard) {
+			cpuinfo_emscripten_init();
+		}
+		init_guard = true;
+	#endif
 #else
 	cpuinfo_log_error("processor architecture is not supported in cpuinfo");
 #endif
diff --git a/src/x86/uarch.c b/src/x86/uarch.c
index ec2c1ef..ecaa762 100644
--- a/src/x86/uarch.c
+++ b/src/x86/uarch.c
@@ -202,9 +202,9 @@
 					}
 				case 0x17:
 					switch (model_info->model) {
-						case 0x01: // 14 nm Naples, Whitehaven, Summit Ridge, Snowy_Owl
+						case 0x01: // 14 nm Naples, Whitehaven, Summit Ridge, Snowy Owl
 						case 0x08: // 12 nm Pinnacle Ridge
-						case 0x11: // 14 nm Raven_Ridge, Great Horned_Owl
+						case 0x11: // 14 nm Raven Ridge, Great Horned Owl
 						case 0x18: // 12 nm Picasso
 							return cpuinfo_uarch_zen;
 						case 0x31: // Rome, Castle Peak
diff --git a/test/arm-cache.cc b/test/arm-cache.cc
index 8cbcc92..7d2e4a4 100644
--- a/test/arm-cache.cc
+++ b/test/arm-cache.cc
@@ -829,7 +829,7 @@
 	struct cpuinfo_cache big_l2 = { 0 };
 	struct cpuinfo_cache big_l3 = { 0 };
 	cpuinfo_arm_decode_cache(
-		cpuinfo_uarch_mongoose_m1, 4, UINT32_C(0x531F0011),
+		cpuinfo_uarch_exynos_m1, 4, UINT32_C(0x531F0011),
 		&chipset, 0, 8,
 		&big_l1i, &big_l1d, &big_l2, &big_l3);
 
@@ -865,7 +865,7 @@
 	struct cpuinfo_cache big_l2 = { 0 };
 	struct cpuinfo_cache big_l3 = { 0 };
 	cpuinfo_arm_decode_cache(
-		cpuinfo_uarch_mongoose_m2, 4, UINT32_C(0x534F0010),
+		cpuinfo_uarch_exynos_m2, 4, UINT32_C(0x534F0010),
 		&chipset, 0, 8,
 		&big_l1i, &big_l1d, &big_l2, &big_l3);
 
@@ -901,7 +901,7 @@
 	struct cpuinfo_cache big_l2 = { 0 };
 	struct cpuinfo_cache big_l3 = { 0 };
 	cpuinfo_arm_decode_cache(
-		cpuinfo_uarch_meerkat_m3, 4, UINT32_C(0x531F0020),
+		cpuinfo_uarch_exynos_m3, 4, UINT32_C(0x531F0020),
 		&chipset, 0, 8,
 		&big_l1i, &big_l1d, &big_l2, &big_l3);
 
diff --git a/test/mock/galaxy-s7-global.cc b/test/mock/galaxy-s7-global.cc
index 7a2ddab..620f2c1 100644
--- a/test/mock/galaxy-s7-global.cc
+++ b/test/mock/galaxy-s7-global.cc
@@ -188,7 +188,7 @@
 			case 1:
 			case 2:
 			case 3:
-				ASSERT_EQ(cpuinfo_uarch_mongoose_m1, cpuinfo_get_core(i)->uarch);
+				ASSERT_EQ(cpuinfo_uarch_exynos_m1, cpuinfo_get_core(i)->uarch);
 				break;
 			case 4:
 			case 5:
@@ -313,7 +313,7 @@
 	for (uint32_t i = 0; i < cpuinfo_get_clusters_count(); i++) {
 		switch (i) {
 			case 0:
-				ASSERT_EQ(cpuinfo_uarch_mongoose_m1, cpuinfo_get_cluster(i)->uarch);
+				ASSERT_EQ(cpuinfo_uarch_exynos_m1, cpuinfo_get_cluster(i)->uarch);
 				break;
 			case 1:
 				ASSERT_EQ(cpuinfo_uarch_cortex_a53, cpuinfo_get_cluster(i)->uarch);
diff --git a/test/mock/galaxy-s8-global.cc b/test/mock/galaxy-s8-global.cc
index ae946ba..30a2826 100644
--- a/test/mock/galaxy-s8-global.cc
+++ b/test/mock/galaxy-s8-global.cc
@@ -188,7 +188,7 @@
 			case 1:
 			case 2:
 			case 3:
-				ASSERT_EQ(cpuinfo_uarch_mongoose_m2, cpuinfo_get_core(i)->uarch);
+				ASSERT_EQ(cpuinfo_uarch_exynos_m2, cpuinfo_get_core(i)->uarch);
 				break;
 			case 4:
 			case 5:
@@ -313,7 +313,7 @@
 	for (uint32_t i = 0; i < cpuinfo_get_clusters_count(); i++) {
 		switch (i) {
 			case 0:
-				ASSERT_EQ(cpuinfo_uarch_mongoose_m2, cpuinfo_get_cluster(i)->uarch);
+				ASSERT_EQ(cpuinfo_uarch_exynos_m2, cpuinfo_get_cluster(i)->uarch);
 				break;
 			case 1:
 				ASSERT_EQ(cpuinfo_uarch_cortex_a53, cpuinfo_get_cluster(i)->uarch);
diff --git a/test/mock/galaxy-s9-global.cc b/test/mock/galaxy-s9-global.cc
index 412476e..6c72513 100644
--- a/test/mock/galaxy-s9-global.cc
+++ b/test/mock/galaxy-s9-global.cc
@@ -201,13 +201,13 @@
 			case 1:
 			case 2:
 			case 3:
-				ASSERT_EQ(cpuinfo_uarch_meerkat_m3, cpuinfo_get_core(i)->uarch);
+				ASSERT_EQ(cpuinfo_uarch_exynos_m3, cpuinfo_get_core(i)->uarch);
 				break;
 			case 4:
 			case 5:
 			case 6:
 			case 7:
-				ASSERT_EQ(cpuinfo_uarch_cortex_a55, cpuinfo_get_core(i)->uarch);
+				ASSERT_EQ(cpuinfo_uarch_cortex_a55r0, cpuinfo_get_core(i)->uarch);
 				break;
 		}
 	}
@@ -326,10 +326,10 @@
 	for (uint32_t i = 0; i < cpuinfo_get_clusters_count(); i++) {
 		switch (i) {
 			case 0:
-				ASSERT_EQ(cpuinfo_uarch_meerkat_m3, cpuinfo_get_cluster(i)->uarch);
+				ASSERT_EQ(cpuinfo_uarch_exynos_m3, cpuinfo_get_cluster(i)->uarch);
 				break;
 			case 1:
-				ASSERT_EQ(cpuinfo_uarch_cortex_a55, cpuinfo_get_cluster(i)->uarch);
+				ASSERT_EQ(cpuinfo_uarch_cortex_a55r0, cpuinfo_get_cluster(i)->uarch);
 				break;
 		}
 	}
diff --git a/test/mock/galaxy-s9-us.cc b/test/mock/galaxy-s9-us.cc
index 6df7f3c..ceea969 100644
--- a/test/mock/galaxy-s9-us.cc
+++ b/test/mock/galaxy-s9-us.cc
@@ -168,7 +168,7 @@
 			case 5:
 			case 6:
 			case 7:
-				ASSERT_EQ(cpuinfo_uarch_cortex_a55, cpuinfo_get_core(i)->uarch);
+				ASSERT_EQ(cpuinfo_uarch_cortex_a55r0, cpuinfo_get_core(i)->uarch);
 				break;
 		}
 	}
@@ -283,7 +283,7 @@
 				ASSERT_EQ(cpuinfo_uarch_cortex_a75, cpuinfo_get_cluster(i)->uarch);
 				break;
 			case 1:
-				ASSERT_EQ(cpuinfo_uarch_cortex_a55, cpuinfo_get_cluster(i)->uarch);
+				ASSERT_EQ(cpuinfo_uarch_cortex_a55r0, cpuinfo_get_cluster(i)->uarch);
 				break;
 		}
 	}
@@ -817,4 +817,4 @@
 	cpuinfo_initialize();
 	::testing::InitGoogleTest(&argc, argv);
 	return RUN_ALL_TESTS();
-}
\ No newline at end of file
+}
diff --git a/test/name/proc-cpuinfo-hardware.cc b/test/name/proc-cpuinfo-hardware.cc
index 3076ea2..5e6561b 100644
--- a/test/name/proc-cpuinfo-hardware.cc
+++ b/test/name/proc-cpuinfo-hardware.cc
@@ -288,6 +288,11 @@
 		parse_proc_cpuinfo_hardware("Qualcomm Technologies, Inc SDM660"));
 }
 
+TEST(PROC_CPUINFO_HARDWARE, qualcomm_sm) {
+	EXPECT_EQ("Qualcomm Snapdragon 8150",
+		parse_proc_cpuinfo_hardware("Qualcomm Technologies, Inc SM8150"));
+}
+
 TEST(PROC_CPUINFO_HARDWARE, mediatek_mt) {
 	EXPECT_EQ("MediaTek MT5507",
 		parse_proc_cpuinfo_hardware("MT5507"));