From 25c6a5073dfc9573bf14dcc0ed1d0f1950175eba Mon Sep 17 00:00:00 2001 From: Joseph Tremoulet Date: Wed, 24 Apr 2019 18:00:12 +0000 Subject: [PATCH] [lldb] Use local definition of get_cpuid_count Summary: This is needed for gcc/cstdlib++ 5.4.0, where __get_cpuid_count is not defined in cpuid.h. Reviewers: labath Reviewed By: labath Subscribers: lldb-commits Tags: #lldb Differential Revision: https://reviews.llvm.org/D61036 llvm-svn: 359120 --- .../Linux/NativeRegisterContextLinux_x86_64.cpp | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_x86_64.cpp b/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_x86_64.cpp index ad2d432..c35cb54 100644 --- a/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_x86_64.cpp +++ b/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_x86_64.cpp @@ -21,6 +21,23 @@ #include #include +// Newer toolchains define __get_cpuid_count in cpuid.h, but some +// older-but-still-supported ones (e.g. gcc 5.4.0) don't, so we +// define it locally here, following the definition in clang/lib/Headers. +static inline int get_cpuid_count(unsigned int __leaf, + unsigned int __subleaf, + unsigned int *__eax, unsigned int *__ebx, + unsigned int *__ecx, unsigned int *__edx) +{ + unsigned int __max_leaf = __get_cpuid_max(__leaf & 0x80000000, 0); + + if (__max_leaf == 0 || __max_leaf < __leaf) + return 0; + + __cpuid_count(__leaf, __subleaf, *__eax, *__ebx, *__ecx, *__edx); + return 1; +} + using namespace lldb_private; using namespace lldb_private::process_linux; @@ -269,7 +286,7 @@ static std::size_t GetXSTATESize() { return sizeof(FPR); // Then fetch the maximum size of the area. - if (!__get_cpuid_count(0x0d, 0, &eax, &ebx, &ecx, &edx)) + if (!get_cpuid_count(0x0d, 0, &eax, &ebx, &ecx, &edx)) return sizeof(FPR); return std::max(ecx, sizeof(FPR)); } -- 2.7.4