From: Uros Bizjak Date: Mon, 1 May 2017 15:38:14 +0000 (+0200) Subject: re PR target/68491 (libgcc calls __get_cpuid with 0 level breaks on early 486) X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=a6c78ea30381cc28ea0b2cf8f0bd584a91dda948;p=gcc.git re PR target/68491 (libgcc calls __get_cpuid with 0 level breaks on early 486) PR target/68491 * config/i386/cpuid.h (__get_cpuid): Always return 0 when __get_cpuid_max returns 0. (__get_cpuid_count): Ditto. From-SVN: r247439 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 07b205c81bf..c58e4173880 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2017-05-01 Uros Bizjak + + PR target/68491 + * config/i386/cpuid.h (__get_cpuid): Always return 0 when + __get_cpuid_max returns 0. + (__get_cpuid_count): Ditto. + 2017-05-01 Eric Botcazou * tree.c (substitute_in_expr) : Also inline a call if the @@ -79,7 +86,7 @@ (init_target_to_host_charmap, target_to_host, target_strtol10): New functions. (maybe_warn, format_directive, parse_directive): Use new functions. - (pass_sprintf_length::execute): Call init_target_to_host_charmap. + (pass_sprintf_length::execute): Call init_target_to_host_charmap. 2017-04-28 Marc Glisse @@ -106,7 +113,7 @@ * ipa-inline-analysis.c (estimate_node_size_and_time, estimate_ipcp_clone_size_and_time, do_estimate_edge_time): Likewise. (estimate_time_after_inlining): Remove. - + 2017-04-28 Martin Liska * doc/gcov.texi: Enhance documentation of gcov. diff --git a/gcc/config/i386/cpuid.h b/gcc/config/i386/cpuid.h index d451e977e55..f915d2dbd5a 100644 --- a/gcc/config/i386/cpuid.h +++ b/gcc/config/i386/cpuid.h @@ -246,8 +246,9 @@ __get_cpuid (unsigned int __leaf, unsigned int *__ecx, unsigned int *__edx) { unsigned int __ext = __leaf & 0x80000000; + unsigned int __maxlevel = __get_cpuid_max (__ext, 0); - if (__get_cpuid_max (__ext, 0) < __leaf) + if (__maxlevel == 0 || __maxlevel < __leaf) return 0; __cpuid (__leaf, *__eax, *__ebx, *__ecx, *__edx); @@ -262,8 +263,9 @@ __get_cpuid_count (unsigned int __leaf, unsigned int __subleaf, unsigned int *__ecx, unsigned int *__edx) { unsigned int __ext = __leaf & 0x80000000; + unsigned int __maxlevel = __get_cpuid_max (__ext, 0); - if (__get_cpuid_max (__ext, 0) < __leaf) + if (__maxlevel == 0 || __maxlevel < __leaf) return 0; __cpuid_count (__leaf, __subleaf, *__eax, *__ebx, *__ecx, *__edx);