From 9c3824aad7f727591798441a65af5e92eaef8f67 Mon Sep 17 00:00:00 2001 From: Michal Gorny Date: Fri, 26 Apr 2019 13:21:46 +0000 Subject: [PATCH] [lldb] [lit] Add feature flags for native CPU features Add a new lit-cpuid tool that detects CPU features used by some of the tests, and use it to populate available_features in lit. For now, this means that the test for MM/XMM register read will be run only when the host CPU support SSE instruction set. However, this is going to make it possible to introduce additional tests relying on AVX. Differential Revision: https://reviews.llvm.org/D61073 llvm-svn: 359303 --- lldb/CMakeLists.txt | 1 + lldb/lit/CMakeLists.txt | 1 + lldb/lit/Register/x86-mm-xmm-read.test | 2 +- lldb/lit/lit.cfg.py | 14 ++++++++++++++ lldb/utils/lit-cpuid/CMakeLists.txt | 5 +++++ lldb/utils/lit-cpuid/lit-cpuid.cpp | 33 +++++++++++++++++++++++++++++++++ 6 files changed, 55 insertions(+), 1 deletion(-) create mode 100644 lldb/utils/lit-cpuid/CMakeLists.txt create mode 100644 lldb/utils/lit-cpuid/lit-cpuid.cpp diff --git a/lldb/CMakeLists.txt b/lldb/CMakeLists.txt index a826c25..71a3de4 100644 --- a/lldb/CMakeLists.txt +++ b/lldb/CMakeLists.txt @@ -138,6 +138,7 @@ if(LLDB_INCLUDE_TESTS) add_subdirectory(test) add_subdirectory(unittests) add_subdirectory(lit) + add_subdirectory(utils/lit-cpuid) add_subdirectory(utils/lldb-dotest) endif() diff --git a/lldb/lit/CMakeLists.txt b/lldb/lit/CMakeLists.txt index ea7f897..e5b6249 100644 --- a/lldb/lit/CMakeLists.txt +++ b/lldb/lit/CMakeLists.txt @@ -20,6 +20,7 @@ string(REPLACE ${CMAKE_CFG_INTDIR} ${LLVM_BUILD_MODE} LLDB_DOTEST_ARGS "${LLDB_D list(APPEND LLDB_TEST_DEPS LLDBUnitTests dsymutil + lit-cpuid llc lldb lldb-test diff --git a/lldb/lit/Register/x86-mm-xmm-read.test b/lldb/lit/Register/x86-mm-xmm-read.test index 510d131..5902c34 100644 --- a/lldb/lit/Register/x86-mm-xmm-read.test +++ b/lldb/lit/Register/x86-mm-xmm-read.test @@ -1,6 +1,6 @@ # XFAIL: system-darwin # XFAIL: system-windows -# REQUIRES: native && (target-x86 || target-x86_64) +# REQUIRES: native && (target-x86 || target-x86_64) && native-cpu-sse # RUN: %clangxx %p/Inputs/x86-mm-xmm-read.cpp -o %t # RUN: %lldb -b -s %s %t | FileCheck %s process launch diff --git a/lldb/lit/lit.cfg.py b/lldb/lit/lit.cfg.py index e1db762..f96152e 100644 --- a/lldb/lit/lit.cfg.py +++ b/lldb/lit/lit.cfg.py @@ -73,3 +73,17 @@ for i in ['module-cache-clang', 'module-cache-lldb']: if os.path.isdir(cachedir): print("Deleting module cache at %s."%cachedir) shutil.rmtree(cachedir) + +# If running tests natively, check for CPU features needed for some tests. + +if 'native' in config.available_features: + cpuid_exe = lit.util.which('lit-cpuid', config.lldb_tools_dir) + if cpuid_exe is None: + lit_config.warning("lit-cpuid not found, tests requiring CPU extensions will be skipped") + else: + out, err, exitcode = lit.util.executeCommand([cpuid_exe]) + if exitcode == 0: + for x in out.split(): + config.available_features.add('native-cpu-%s' % x) + else: + lit_config.warning("lit-cpuid failed: %s" % err) diff --git a/lldb/utils/lit-cpuid/CMakeLists.txt b/lldb/utils/lit-cpuid/CMakeLists.txt new file mode 100644 index 0000000..b3af817 --- /dev/null +++ b/lldb/utils/lit-cpuid/CMakeLists.txt @@ -0,0 +1,5 @@ +add_llvm_utility(lit-cpuid + lit-cpuid.cpp + ) + +target_link_libraries(lit-cpuid PRIVATE LLVMSupport) diff --git a/lldb/utils/lit-cpuid/lit-cpuid.cpp b/lldb/utils/lit-cpuid/lit-cpuid.cpp new file mode 100644 index 0000000..65c552b --- /dev/null +++ b/lldb/utils/lit-cpuid/lit-cpuid.cpp @@ -0,0 +1,33 @@ +//===- lit-cpuid.cpp - Get CPU feature flags for lit exported features ----===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +// +// lit-cpuid obtains the feature list for the currently running CPU, and outputs +// those flags that are interesting for LLDB lit tests. +// +//===----------------------------------------------------------------------===// + +#include "llvm/ADT/StringMap.h" +#include "llvm/Support/Host.h" +#include "llvm/Support/raw_ostream.h" + +using namespace llvm; + +int main(int argc, char **argv) { +#if defined(__i386__) || defined(_M_IX86) || \ + defined(__x86_64__) || defined(_M_X64) + StringMap features; + + if (!sys::getHostCPUFeatures(features)) + return 1; + + if (features["sse"]) + outs() << "sse\n"; +#endif + + return 0; +} -- 2.7.4