aboutsummaryrefslogtreecommitdiffstats
path: root/gcc-4.6/libgcc/config
diff options
context:
space:
mode:
authorJing Yu <jingyu@google.com>2012-02-15 15:40:16 -0800
committerJing Yu <jingyu@google.com>2012-02-15 15:40:16 -0800
commit3f73d6ef90458b45bbbb33ef4c2b174d4662a22d (patch)
tree1b5f0d96c51b51168b3713058a1b62e92f1136eb /gcc-4.6/libgcc/config
parentd7030123e04baab5dbff9c9ee04c0de99bd9a774 (diff)
downloadtoolchain_gcc-3f73d6ef90458b45bbbb33ef4c2b174d4662a22d.tar.gz
toolchain_gcc-3f73d6ef90458b45bbbb33ef4c2b174d4662a22d.tar.bz2
toolchain_gcc-3f73d6ef90458b45bbbb33ef4c2b174d4662a22d.zip
Sync down FSF r184235@google/gcc-4_6_2-mobile branch
1) Get mostly new patches from FSF gcc-4.6 branch 2) Fix PR52129 3) Insert GNU-stack note for all ARM targets Change-Id: I2b9926981210e517e4021242908074319a91d6bd
Diffstat (limited to 'gcc-4.6/libgcc/config')
-rw-r--r--gcc-4.6/libgcc/config/arm/bpabi-lib.h11
-rw-r--r--gcc-4.6/libgcc/config/i386/64/sfp-machine.h12
-rw-r--r--gcc-4.6/libgcc/config/i386/i386-cpuinfo.c307
-rw-r--r--gcc-4.6/libgcc/config/i386/t-cpuinfo1
-rw-r--r--gcc-4.6/libgcc/config/libbid/ChangeLog4
5 files changed, 324 insertions, 11 deletions
diff --git a/gcc-4.6/libgcc/config/arm/bpabi-lib.h b/gcc-4.6/libgcc/config/arm/bpabi-lib.h
index 49a28c3c2..fc0e59507 100644
--- a/gcc-4.6/libgcc/config/arm/bpabi-lib.h
+++ b/gcc-4.6/libgcc/config/arm/bpabi-lib.h
@@ -20,17 +20,10 @@
see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
<http://www.gnu.org/licenses/>. */
-#if defined (__thumb__)
-#define RENAME_LIBRARY_SET ".thumb_set"
-#else
-#define RENAME_LIBRARY_SET ".set"
-#endif
-
/* Make __aeabi_AEABI_NAME an alias for __GCC_NAME. */
#define RENAME_LIBRARY(GCC_NAME, AEABI_NAME) \
- __asm__ (".globl\t__aeabi_" #AEABI_NAME "\n" \
- RENAME_LIBRARY_SET "\t__aeabi_" #AEABI_NAME \
- ", __" #GCC_NAME "\n");
+ typeof (__##GCC_NAME) __aeabi_##AEABI_NAME \
+ __attribute__((alias ("__" #GCC_NAME)));
/* Give some libgcc functions an additional __aeabi name. */
#ifdef L_muldi3
diff --git a/gcc-4.6/libgcc/config/i386/64/sfp-machine.h b/gcc-4.6/libgcc/config/i386/64/sfp-machine.h
index 5adf6dbba..5186c24ff 100644
--- a/gcc-4.6/libgcc/config/i386/64/sfp-machine.h
+++ b/gcc-4.6/libgcc/config/i386/64/sfp-machine.h
@@ -79,17 +79,25 @@ struct fenv
unsigned short int __unused5;
};
+#ifdef __AVX__
+ #define ASM_INVALID "vdivss %0, %0, %0"
+ #define ASM_DIVZERO "vdivss %1, %0, %0"
+#else
+ #define ASM_INVALID "divss %0, %0"
+ #define ASM_DIVZERO "divss %1, %0"
+#endif
+
#define FP_HANDLE_EXCEPTIONS \
do { \
if (_fex & FP_EX_INVALID) \
{ \
float f = 0.0; \
- __asm__ __volatile__ ("divss %0, %0 " : : "x" (f)); \
+ __asm__ __volatile__ (ASM_INVALID : : "x" (f)); \
} \
if (_fex & FP_EX_DIVZERO) \
{ \
float f = 1.0, g = 0.0; \
- __asm__ __volatile__ ("divss %1, %0" : : "x" (f), "x" (g)); \
+ __asm__ __volatile__ (ASM_DIVZERO : : "x" (f), "x" (g)); \
} \
if (_fex & FP_EX_OVERFLOW) \
{ \
diff --git a/gcc-4.6/libgcc/config/i386/i386-cpuinfo.c b/gcc-4.6/libgcc/config/i386/i386-cpuinfo.c
new file mode 100644
index 000000000..362bfc4cb
--- /dev/null
+++ b/gcc-4.6/libgcc/config/i386/i386-cpuinfo.c
@@ -0,0 +1,307 @@
+/* Get CPU type and Features for x86 processors.
+ Copyright (C) 2011 Free Software Foundation, Inc.
+ Contributed by Sriraman Tallam (tmsriram@google.com)
+
+This file is part of GCC.
+
+GCC is free software; you can redistribute it and/or modify it under
+the terms of the GNU General Public License as published by the Free
+Software Foundation; either version 3, or (at your option) any later
+version.
+
+GCC is distributed in the hope that it will be useful, but WITHOUT ANY
+WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with GCC; see the file COPYING3. If not see
+<http://www.gnu.org/licenses/>. */
+
+#include "cpuid.h"
+#include "tsystem.h"
+
+int __cpu_indicator_init (void) __attribute__ ((constructor));
+
+enum vendor_signatures
+{
+ SIG_INTEL = 0x756e6547 /* Genu */,
+ SIG_AMD = 0x68747541 /* Auth */
+};
+
+
+/* Features supported. */
+
+struct __processor_features
+{
+ unsigned int __cpu_cmov : 1;
+ unsigned int __cpu_mmx : 1;
+ unsigned int __cpu_popcnt : 1;
+ unsigned int __cpu_sse : 1;
+ unsigned int __cpu_sse2 : 1;
+ unsigned int __cpu_sse3 : 1;
+ unsigned int __cpu_ssse3 : 1;
+ unsigned int __cpu_sse4_1 : 1;
+ unsigned int __cpu_sse4_2 : 1;
+} __cpu_features;
+
+/* Processor Model. */
+
+struct __processor_model
+{
+ /* Vendor. */
+ unsigned int __cpu_is_amd : 1;
+ unsigned int __cpu_is_intel : 1;
+ /* CPU type. */
+ unsigned int __cpu_is_intel_atom : 1;
+ unsigned int __cpu_is_intel_core2 : 1;
+ unsigned int __cpu_is_intel_corei7 : 1;
+ unsigned int __cpu_is_intel_corei7_nehalem : 1;
+ unsigned int __cpu_is_intel_corei7_westmere : 1;
+ unsigned int __cpu_is_intel_corei7_sandybridge : 1;
+ unsigned int __cpu_is_amdfam10h : 1;
+ unsigned int __cpu_is_amdfam10h_barcelona : 1;
+ unsigned int __cpu_is_amdfam10h_shanghai : 1;
+ unsigned int __cpu_is_amdfam10h_istanbul : 1;
+ unsigned int __cpu_is_amdfam15h_bdver1 : 1;
+ unsigned int __cpu_is_amdfam15h_bdver2 : 1;
+} __cpu_model;
+
+/* Get the specific type of AMD CPU. */
+
+static void
+get_amd_cpu (unsigned int family, unsigned int model)
+{
+ switch (family)
+ {
+ /* AMD Family 10h. */
+ case 0x10:
+ switch (model)
+ {
+ case 0x2:
+ /* Barcelona. */
+ __cpu_model.__cpu_is_amdfam10h = 1;
+ __cpu_model.__cpu_is_amdfam10h_barcelona = 1;
+ break;
+ case 0x4:
+ /* Shanghai. */
+ __cpu_model.__cpu_is_amdfam10h = 1;
+ __cpu_model.__cpu_is_amdfam10h_shanghai = 1;
+ break;
+ case 0x8:
+ /* Istanbul. */
+ __cpu_model.__cpu_is_amdfam10h = 1;
+ __cpu_model.__cpu_is_amdfam10h_istanbul = 1;
+ break;
+ default:
+ break;
+ }
+ break;
+ /* AMD Family 15h. */
+ case 0x15:
+ /* Bulldozer version 1. */
+ if (model >= 0 && model <= 0xf)
+ __cpu_model.__cpu_is_amdfam15h_bdver1 = 1;
+ /* Bulldozer version 2. */
+ if (model >= 0x10 && model <= 0x1f)
+ __cpu_model.__cpu_is_amdfam15h_bdver2 = 1;
+ break;
+ default:
+ break;
+ }
+}
+
+/* Get the specific type of Intel CPU. */
+
+static void
+get_intel_cpu (unsigned int family, unsigned int model, unsigned int brand_id)
+{
+ /* Parse family and model only if brand ID is 0. */
+ if (brand_id == 0)
+ {
+ switch (family)
+ {
+ case 0x5:
+ /* Pentium. */
+ break;
+ case 0x6:
+ switch (model)
+ {
+ case 0x1c:
+ case 0x26:
+ /* Atom. */
+ __cpu_model.__cpu_is_intel_atom = 1;
+ break;
+ case 0x1a:
+ case 0x1e:
+ case 0x1f:
+ case 0x2e:
+ /* Nehalem. */
+ __cpu_model.__cpu_is_intel_corei7 = 1;
+ __cpu_model.__cpu_is_intel_corei7_nehalem = 1;
+ break;
+ case 0x25:
+ case 0x2c:
+ case 0x2f:
+ /* Westmere. */
+ __cpu_model.__cpu_is_intel_corei7 = 1;
+ __cpu_model.__cpu_is_intel_corei7_westmere = 1;
+ break;
+ case 0x2a:
+ /* Sandy Bridge. */
+ __cpu_model.__cpu_is_intel_corei7 = 1;
+ __cpu_model.__cpu_is_intel_corei7_sandybridge = 1;
+ break;
+ case 0x17:
+ case 0x1d:
+ /* Penryn. */
+ case 0x0f:
+ /* Merom. */
+ __cpu_model.__cpu_is_intel_core2 = 1;
+ break;
+ default:
+ break;
+ }
+ break;
+ default:
+ /* We have no idea. */
+ break;
+ }
+ }
+}
+
+static void
+get_available_features (unsigned int ecx, unsigned int edx)
+{
+ __cpu_features.__cpu_cmov = (edx & bit_CMOV) ? 1 : 0;
+ __cpu_features.__cpu_mmx = (edx & bit_MMX) ? 1 : 0;
+ __cpu_features.__cpu_sse = (edx & bit_SSE) ? 1 : 0;
+ __cpu_features.__cpu_sse2 = (edx & bit_SSE2) ? 1 : 0;
+ __cpu_features.__cpu_popcnt = (ecx & bit_POPCNT) ? 1 : 0;
+ __cpu_features.__cpu_sse3 = (ecx & bit_SSE3) ? 1 : 0;
+ __cpu_features.__cpu_ssse3 = (ecx & bit_SSSE3) ? 1 : 0;
+ __cpu_features.__cpu_sse4_1 = (ecx & bit_SSE4_1) ? 1 : 0;
+ __cpu_features.__cpu_sse4_2 = (ecx & bit_SSE4_2) ? 1 : 0;
+}
+
+
+/* Sanity check for the vendor and cpu type flags. */
+
+static int
+sanity_check (void)
+{
+ unsigned int one_type = 0;
+
+ /* Vendor cannot be Intel and AMD. */
+ gcc_assert((__cpu_model.__cpu_is_intel == 0)
+ || (__cpu_model.__cpu_is_amd == 0));
+
+ /* Only one CPU type can be set. */
+ one_type = (__cpu_model.__cpu_is_intel_atom
+ + __cpu_model.__cpu_is_intel_core2
+ + __cpu_model.__cpu_is_intel_corei7_nehalem
+ + __cpu_model.__cpu_is_intel_corei7_westmere
+ + __cpu_model.__cpu_is_intel_corei7_sandybridge
+ + __cpu_model.__cpu_is_amdfam10h_barcelona
+ + __cpu_model.__cpu_is_amdfam10h_shanghai
+ + __cpu_model.__cpu_is_amdfam10h_istanbul
+ + __cpu_model.__cpu_is_amdfam15h_bdver1
+ + __cpu_model.__cpu_is_amdfam15h_bdver2);
+
+ gcc_assert (one_type <= 1);
+ return 0;
+}
+
+/* A noinline function calling __get_cpuid. Having many calls to
+ cpuid in one function in 32-bit mode causes GCC to complain:
+ "can’t find a register in class ‘CLOBBERED_REGS’". This is
+ related to PR rtl-optimization 44174. */
+
+static int __attribute__ ((noinline))
+__get_cpuid_output (unsigned int __level,
+ unsigned int *__eax, unsigned int *__ebx,
+ unsigned int *__ecx, unsigned int *__edx)
+{
+ return __get_cpuid (__level, __eax, __ebx, __ecx, __edx);
+}
+
+
+/* A constructor function that is sets __cpu_model and __cpu_features with
+ the right values. This needs to run only once.
+ If another constructor needs to use these values, explicitly call this
+ function from the other constructor. Otherwise, the ordering of
+ constructors could make this constructor run later. */
+
+int __attribute__ ((constructor))
+__cpu_indicator_init (void)
+{
+ unsigned int eax, ebx, ecx, edx;
+
+ int max_level = 5;
+ unsigned int vendor;
+ unsigned int model, family, brand_id;
+ unsigned int extended_model, extended_family;
+ static int called = 0;
+
+ /* This function needs to run just once. */
+ if (called)
+ return 0;
+ else
+ called = 1;
+
+ /* Assume cpuid insn present. Run in level 0 to get vendor id. */
+ if (!__get_cpuid_output (0, &eax, &ebx, &ecx, &edx))
+ return -1;
+
+ vendor = ebx;
+ max_level = eax;
+
+ if (max_level < 1)
+ return -1;
+
+ if (!__get_cpuid_output (1, &eax, &ebx, &ecx, &edx))
+ return -1;
+
+ model = (eax >> 4) & 0x0f;
+ family = (eax >> 8) & 0x0f;
+ brand_id = ebx & 0xff;
+ extended_model = (eax >> 12) & 0xf0;
+ extended_family = (eax >> 20) & 0xff;
+
+ if (vendor == SIG_INTEL)
+ {
+ /* Adjust model and family for Intel CPUS. */
+ if (family == 0x0f)
+ {
+ family += extended_family;
+ model += extended_model;
+ }
+ else if (family == 0x06)
+ model += extended_model;
+
+ /* Get CPU type. */
+ __cpu_model.__cpu_is_intel = 1;
+ get_intel_cpu (family, model, brand_id);
+ }
+
+ if (vendor == SIG_AMD)
+ {
+ /* Adjust model and family for AMD CPUS. */
+ if (family == 0x0f)
+ {
+ family += extended_family;
+ model += (extended_model << 4);
+ }
+
+ /* Get CPU type. */
+ __cpu_model.__cpu_is_amd = 1;
+ get_amd_cpu (family, model);
+ }
+
+ /* Find available features. */
+ get_available_features (ecx, edx);
+
+ sanity_check ();
+
+ return 0;
+}
diff --git a/gcc-4.6/libgcc/config/i386/t-cpuinfo b/gcc-4.6/libgcc/config/i386/t-cpuinfo
new file mode 100644
index 000000000..dd271f9db
--- /dev/null
+++ b/gcc-4.6/libgcc/config/i386/t-cpuinfo
@@ -0,0 +1 @@
+LIB2ADD += $(srcdir)/config/i386/i386-cpuinfo.c
diff --git a/gcc-4.6/libgcc/config/libbid/ChangeLog b/gcc-4.6/libgcc/config/libbid/ChangeLog
index c41204289..5c1f7845e 100644
--- a/gcc-4.6/libgcc/config/libbid/ChangeLog
+++ b/gcc-4.6/libgcc/config/libbid/ChangeLog
@@ -1,3 +1,7 @@
+2011-10-26 Release Manager
+
+ * GCC 4.6.2 released.
+
2011-06-27 Release Manager
* GCC 4.6.1 released.