This is the mail archive of the binutils-cvs@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[binutils-gdb] [ARM] Rework selection of feature bits to base build attributes on


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=54bab2816dfd025fc53618e46be140573d5bc02e

commit 54bab2816dfd025fc53618e46be140573d5bc02e
Author: Thomas Preud'homme <thomas.preudhomme@arm.com>
Date:   Wed Jun 21 14:57:53 2017 +0100

    [ARM] Rework selection of feature bits to base build attributes on
    
    === Context ===
    
    This patch is part of a patch series to add support for ARMv8-R
    architecture. Its purpose is to set the feature bits on which to decide
    what the build attributes should be according to the mode
    (autodetection, user specified architecture or CPU, or
    -march/-mcpu=all).
    
    === Motivation ===
    
    Currently, the flags variable which is used to determine the build
    attribute is constructed from the instruction used (arm_arch_used and
    thumb_arch_used) as well as the user specified architecture or CPU
    (selected_cpu). This means when several .arch are specified the
    resulting feature bits can be such that no architecture provide them
    all and can thus result in incorrect Tag_CPU_arch. See for instance
    what having both .arch armv8-a and .arch armv8-m.base would result in.
    This is not caught by the testsuite because of further bugs in the
    Tag_CPU_arch build attribute value selection logic (see next patch in
    the series).
    
    === Patch description ===
    
    As one would expect, this patch solves the problem by setting flags
    from feature bits used if in autodetection mode [1] and from
    selected_cpu otherwise. The logic to set arm_ext_v1, arm_ext_v4t and
    arm_ext_os feature bits is also moved to only run in autodetection mode
    since otherwise the architecture or CPU would have a consistent set of
    feature bits already.
    
    [1] No architecture or CPU was specified by the user
    
    2017-06-21  Thomas Preud'homme  <thomas.preudhomme@arm.com>
    
    gas/
    	* config/tc-arm.c (aeabi_set_public_attributes): Populate flags from
    	feature bits used or selected_cpu depending on whether a CPU was
    	selected by the user.

Diff:
---
 gas/ChangeLog       |  6 ++++++
 gas/config/tc-arm.c | 40 ++++++++++++++++++++++++----------------
 2 files changed, 30 insertions(+), 16 deletions(-)

diff --git a/gas/ChangeLog b/gas/ChangeLog
index 4c8fc41..82b25ac 100644
--- a/gas/ChangeLog
+++ b/gas/ChangeLog
@@ -1,5 +1,11 @@
 2017-06-21  Thomas Preud'homme  <thomas.preudhomme@arm.com>
 
+	* config/tc-arm.c (aeabi_set_public_attributes): Populate flags from
+	feature bits used or selected_cpu depending on whether a CPU was
+	selected by the user.
+
+2017-06-21  Thomas Preud'homme  <thomas.preudhomme@arm.com>
+
 	* config/tc-arm.c (aeabi_set_public_attributes): Test *mcpu_ext_opt to
 	decide whether to set Tag_DSP_extension build attribute value.  Remove
 	now useless arm_arch variable.
diff --git a/gas/config/tc-arm.c b/gas/config/tc-arm.c
index 88f3dc9..86acb86 100644
--- a/gas/config/tc-arm.c
+++ b/gas/config/tc-arm.c
@@ -26605,19 +26605,33 @@ aeabi_set_public_attributes (void)
   arm_feature_set arm_arch_v8m_base = ARM_ARCH_V8M_BASE;
   const cpu_arch_ver_table *p;
 
-  /* Choose the architecture based on the capabilities of the requested cpu
-     (if any) and/or the instructions actually used.  */
-  ARM_MERGE_FEATURE_SETS (flags, arm_arch_used, thumb_arch_used);
-  ARM_MERGE_FEATURE_SETS (flags, flags, *mfpu_opt);
-  ARM_MERGE_FEATURE_SETS (flags, flags, selected_cpu);
+  /* Autodetection mode, choose the architecture based the instructions
+     actually used.  */
+  if (no_cpu_selected ())
+    {
+      ARM_MERGE_FEATURE_SETS (flags, arm_arch_used, thumb_arch_used);
 
-  if (ARM_CPU_HAS_FEATURE (arm_arch_used, arm_arch_any))
-    ARM_MERGE_FEATURE_SETS (flags, flags, arm_ext_v1);
+      if (ARM_CPU_HAS_FEATURE (arm_arch_used, arm_arch_any))
+	ARM_MERGE_FEATURE_SETS (flags, flags, arm_ext_v1);
 
-  if (ARM_CPU_HAS_FEATURE (thumb_arch_used, arm_arch_any))
-    ARM_MERGE_FEATURE_SETS (flags, flags, arm_ext_v4t);
+      if (ARM_CPU_HAS_FEATURE (thumb_arch_used, arm_arch_any))
+	ARM_MERGE_FEATURE_SETS (flags, flags, arm_ext_v4t);
 
-  selected_cpu = flags;
+      /* We need to make sure that the attributes do not identify us as v6S-M
+	 when the only v6S-M feature in use is the Operating System
+	 Extensions.  */
+      if (ARM_CPU_HAS_FEATURE (flags, arm_ext_os))
+	if (!ARM_CPU_HAS_FEATURE (flags, arm_arch_v6m_only))
+	  ARM_CLEAR_FEATURE (flags, flags, arm_ext_os);
+
+      /* Code run during relaxation relies on selected_cpu being set.  */
+      selected_cpu = flags;
+    }
+  /* Otherwise, choose the architecture based on the capabilities of the
+     requested cpu.  */
+  else
+    flags = selected_cpu;
+  ARM_MERGE_FEATURE_SETS (flags, flags, *mfpu_opt);
 
   /* Allow the user to override the reported architecture.  */
   if (object_arch)
@@ -26626,12 +26640,6 @@ aeabi_set_public_attributes (void)
       ARM_MERGE_FEATURE_SETS (flags, flags, *object_arch);
     }
 
-  /* We need to make sure that the attributes do not identify us as v6S-M
-     when the only v6S-M feature in use is the Operating System Extensions.  */
-  if (ARM_CPU_HAS_FEATURE (flags, arm_ext_os))
-      if (!ARM_CPU_HAS_FEATURE (flags, arm_arch_v6m_only))
-	ARM_CLEAR_FEATURE (flags, flags, arm_ext_os);
-
   tmp = flags;
   arch = 0;
   for (p = cpu_arch_ver; p->val; p++)


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]