[binutils-gdb] gold: Update GNU_PROPERTY_X86_XXX macros

H.J. Lu hjl@sourceware.org
Tue Oct 13 12:30:20 GMT 2020


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

commit 586e30940e640f67bd55bd72e1d1355a4faf8079
Author: H.J. Lu <hjl.tools@gmail.com>
Date:   Tue Oct 13 05:20:49 2020 -0700

    gold: Update GNU_PROPERTY_X86_XXX macros
    
    This patch updates GNU_PROPERTY_X86_XXX macros for gold:
    
    1. GNU_PROPERTY_X86_UINT32_AND_XXX: A 4-byte unsigned integer property.
    A bit is set if it is set in all relocatable inputs:
    
     #define GNU_PROPERTY_X86_UINT32_AND_LO      0xc0000002
     #define GNU_PROPERTY_X86_UINT32_AND_HI      0xc0007fff
    
    2. GNU_PROPERTY_X86_UINT32_OR_XXX: A 4-byte unsigned integer property.
    A bit is set if it is set in any relocatable inputs:
    
     #define GNU_PROPERTY_X86_UINT32_OR_LO    0xc0008000
     #define GNU_PROPERTY_X86_UINT32_OR_HI    0xc000ffff
    
    3. GNU_PROPERTY_X86_UINT32_OR_AND_XXX: A 4-byte unsigned integer property.
    A bit is set if it is set in any relocatable inputs and the property is
    present in all relocatable inputs:
    
     #define GNU_PROPERTY_X86_UINT32_OR_AND_LO   0xc0010000
     #define GNU_PROPERTY_X86_UINT32_OR_AND_HI   0xc0017fff
    
    4. GNU_PROPERTY_X86_FEATURE_2_NEEDED, GNU_PROPERTY_X86_FEATURE_2_USED
    and GNU_PROPERTY_X86_FEATURE_2_XXX bits.
    
    GNU_PROPERTY_X86_FEATURE_1_AND is unchanged.  GNU_PROPERTY_X86_ISA_1_USED
    and GNU_PROPERTY_X86_ISA_1_NEEDED are updated to better support targeted
    processors since GNU_PROPERTY_X86_ISA_1_?86 aren't isn't very useful.
    A new set of GNU_PROPERTY_X86_ISA_1_XXX bits are defined.  The previous
    GNU_PROPERTY_X86_ISA_1_XXX macros are deprecated and renamed to
    GNU_PROPERTY_X86_COMPAT_ISA_1_XXX and GNU_PROPERTY_X86_COMPAT_2_ISA_1_XXX.
    
    elfcpp/
    
            * elfcpp.h (GNU_PROPERTY_X86_ISA_1_USED): Renamed to ...
            (GNU_PROPERTY_X86_COMPAT_ISA_1_USED): This.
            (GNU_PROPERTY_X86_ISA_1_NEEDED): Renamed to ...
            (GNU_PROPERTY_X86_COMPAT_ISA_1_NEEDED): This.
            (GNU_PROPERTY_X86_UINT32_AND_LO): New.
            (GNU_PROPERTY_X86_UINT32_AND_HI): Likewise.
            (GNU_PROPERTY_X86_UINT32_OR_LO): Likewise.
            (GNU_PROPERTY_X86_UINT32_OR_HI): Likewise.
            (GNU_PROPERTY_X86_UINT32_OR_AND_LO): Likewise.
            (GNU_PROPERTY_X86_UINT32_OR_AND_HI): Likewise.
            (GNU_PROPERTY_X86_COMPAT_2_ISA_1_NEEDED): New.
            (GNU_PROPERTY_X86_COMPAT_2_ISA_1_NEEDED): Likewise.
            (GNU_PROPERTY_X86_FEATURE_1_AND): Updated to
            (GNU_PROPERTY_X86_UINT32_AND_LO + 0).
            (GNU_PROPERTY_X86_ISA_1_NEEDED): New.  Defined to
            GNU_PROPERTY_X86_UINT32_OR_LO + 2.
            (GNU_PROPERTY_X86_FEATURE_2_NEEDED): New.  Defined to
            (GNU_PROPERTY_X86_UINT32_OR_LO + 1).
            (GNU_PROPERTY_X86_ISA_1_USED): New.  Defined to
            GNU_PROPERTY_X86_UINT32_OR_AND_LO + 2.
            (GNU_PROPERTY_X86_FEATURE_2_USED): New.  Defined to
            (GNU_PROPERTY_X86_UINT32_OR_AND_LO + 1).
    
    gold/
    
            * x86_64.cc (Target_x86_64::Target_x86_64): Initialize
            feature_2_used_, feature_2_needed_ and object_feature_2_used_.
            (Target_x86_64::feature_2_used_): New data member.
            (Target_x86_64::feature_2_needed_): Likewise.
            (Target_x86_64::object_isa_1_used_): Likewise.
            (Target_x86_64::record_gnu_property): Support
            GNU_PROPERTY_X86_COMPAT_ISA_1_USED,
            GNU_PROPERTY_X86_COMPAT_ISA_1_NEEDED,
            GNU_PROPERTY_X86_COMPAT_2_ISA_1_USED,
            GNU_PROPERTY_X86_COMPAT_2_ISA_1_NEEDED,
            GNU_PROPERTY_X86_FEATURE_2_USED and
            GNU_PROPERTY_X86_FEATURE_2_NEEDED.
            (Target_x86_64::merge_gnu_properties): Merge FEATURE_2_USED bits.
            Initialize object_feature_2_used_.
            (Target_x86_64::do_finalize_gnu_properties): Support
            GNU_PROPERTY_X86_FEATURE_2_USED and
            GNU_PROPERTY_X86_FEATURE_2_NEEDED.
            * testsuite/gnu_property_a.S (GNU_PROPERTY_X86_ISA_1_USED): Set
            to 0xc0010002.
            (GNU_PROPERTY_X86_ISA_1_NEEDED): Set to 0xc0008002.
            * testsuite/gnu_property_b.S (GNU_PROPERTY_X86_ISA_1_USED): Set
            to 0xc0010002.
            (GNU_PROPERTY_X86_ISA_1_NEEDED): Set to 0xc0008002.
            * testsuite/gnu_property_c.S (GNU_PROPERTY_X86_ISA_1_USED): Set
            to 0xc0010002.
            (GNU_PROPERTY_X86_ISA_1_NEEDED): Set to 0xc0008002.
            * testsuite/gnu_property_test.sh: Updated.

Diff:
---
 elfcpp/ChangeLog                    | 25 +++++++++++++++++++++++++
 elfcpp/elfcpp.h                     | 18 +++++++++++++++---
 gold/ChangeLog                      | 30 ++++++++++++++++++++++++++++++
 gold/testsuite/gnu_property_a.S     |  4 ++--
 gold/testsuite/gnu_property_b.S     |  4 ++--
 gold/testsuite/gnu_property_c.S     |  4 ++--
 gold/testsuite/gnu_property_test.sh |  4 ++--
 gold/x86_64.cc                      | 34 ++++++++++++++++++++++++++++++++--
 8 files changed, 110 insertions(+), 13 deletions(-)

diff --git a/elfcpp/ChangeLog b/elfcpp/ChangeLog
index 87e4fc8698f..c72a432e095 100644
--- a/elfcpp/ChangeLog
+++ b/elfcpp/ChangeLog
@@ -1,3 +1,28 @@
+2020-10-13  H.J. Lu  <hongjiu.lu@intel.com>
+
+	* elfcpp.h (GNU_PROPERTY_X86_ISA_1_USED): Renamed to ...
+	(GNU_PROPERTY_X86_COMPAT_ISA_1_USED): This.
+	(GNU_PROPERTY_X86_ISA_1_NEEDED): Renamed to ...
+	(GNU_PROPERTY_X86_COMPAT_ISA_1_NEEDED): This.
+	(GNU_PROPERTY_X86_UINT32_AND_LO): New.
+	(GNU_PROPERTY_X86_UINT32_AND_HI): Likewise.
+	(GNU_PROPERTY_X86_UINT32_OR_LO): Likewise.
+	(GNU_PROPERTY_X86_UINT32_OR_HI): Likewise.
+	(GNU_PROPERTY_X86_UINT32_OR_AND_LO): Likewise.
+	(GNU_PROPERTY_X86_UINT32_OR_AND_HI): Likewise.
+	(GNU_PROPERTY_X86_COMPAT_2_ISA_1_NEEDED): New.
+	(GNU_PROPERTY_X86_COMPAT_2_ISA_1_NEEDED): Likewise.
+	(GNU_PROPERTY_X86_FEATURE_1_AND): Updated to
+	(GNU_PROPERTY_X86_UINT32_AND_LO + 0).
+	(GNU_PROPERTY_X86_ISA_1_NEEDED): New.  Defined to
+	GNU_PROPERTY_X86_UINT32_OR_LO + 2.
+	(GNU_PROPERTY_X86_FEATURE_2_NEEDED): New.  Defined to
+	(GNU_PROPERTY_X86_UINT32_OR_LO + 1).
+	(GNU_PROPERTY_X86_ISA_1_USED): New.  Defined to
+	GNU_PROPERTY_X86_UINT32_OR_AND_LO + 2.
+	(GNU_PROPERTY_X86_FEATURE_2_USED): New.  Defined to
+	(GNU_PROPERTY_X86_UINT32_OR_AND_LO + 1).
+
 2020-09-25  Alan Modra  <amodra@gmail.com>
 
 	* dwarf.h (DW_FIRST_UT, DW_UT, DW_END_UT): Define.
diff --git a/elfcpp/elfcpp.h b/elfcpp/elfcpp.h
index 65d803c00e2..4b6ff94a654 100644
--- a/elfcpp/elfcpp.h
+++ b/elfcpp/elfcpp.h
@@ -1013,9 +1013,21 @@ enum
   GNU_PROPERTY_STACK_SIZE = 1,
   GNU_PROPERTY_NO_COPY_ON_PROTECTED = 2,
   GNU_PROPERTY_LOPROC = 0xc0000000,
-  GNU_PROPERTY_X86_ISA_1_USED = 0xc0000000,
-  GNU_PROPERTY_X86_ISA_1_NEEDED = 0xc0000001,
-  GNU_PROPERTY_X86_FEATURE_1_AND = 0xc0000002,
+  GNU_PROPERTY_X86_COMPAT_ISA_1_USED = 0xc0000000,
+  GNU_PROPERTY_X86_COMPAT_ISA_1_NEEDED = 0xc0000001,
+  GNU_PROPERTY_X86_UINT32_AND_LO = 0xc0000002,
+  GNU_PROPERTY_X86_UINT32_AND_HI = 0xc0007fff,
+  GNU_PROPERTY_X86_UINT32_OR_LO = 0xc0008000,
+  GNU_PROPERTY_X86_UINT32_OR_HI = 0xc000ffff,
+  GNU_PROPERTY_X86_UINT32_OR_AND_LO = 0xc0010000,
+  GNU_PROPERTY_X86_UINT32_OR_AND_HI = 0xc0017fff,
+  GNU_PROPERTY_X86_COMPAT_2_ISA_1_NEEDED = GNU_PROPERTY_X86_UINT32_OR_LO + 0,
+  GNU_PROPERTY_X86_COMPAT_2_ISA_1_USED = GNU_PROPERTY_X86_UINT32_OR_AND_LO + 0,
+  GNU_PROPERTY_X86_FEATURE_1_AND = GNU_PROPERTY_X86_UINT32_AND_LO + 0,
+  GNU_PROPERTY_X86_ISA_1_NEEDED = GNU_PROPERTY_X86_UINT32_OR_LO + 2,
+  GNU_PROPERTY_X86_FEATURE_2_NEEDED = GNU_PROPERTY_X86_UINT32_OR_LO + 1,
+  GNU_PROPERTY_X86_ISA_1_USED = GNU_PROPERTY_X86_UINT32_OR_AND_LO + 2,
+  GNU_PROPERTY_X86_FEATURE_2_USED = GNU_PROPERTY_X86_UINT32_OR_AND_LO + 1,
   GNU_PROPERTY_HIPROC = 0xdfffffff,
   GNU_PROPERTY_LOUSER = 0xe0000000,
   GNU_PROPERTY_HIUSER = 0xffffffff
diff --git a/gold/ChangeLog b/gold/ChangeLog
index 2ebe2c1c3c6..41fe6e033e9 100644
--- a/gold/ChangeLog
+++ b/gold/ChangeLog
@@ -1,3 +1,33 @@
+2020-10-13  H.J. Lu  <hongjiu.lu@intel.com>
+
+	* x86_64.cc (Target_x86_64::Target_x86_64): Initialize
+	feature_2_used_, feature_2_needed_ and object_feature_2_used_.
+	(Target_x86_64::feature_2_used_): New data member.
+	(Target_x86_64::feature_2_needed_): Likewise.
+	(Target_x86_64::object_isa_1_used_): Likewise.
+	(Target_x86_64::record_gnu_property): Support
+	GNU_PROPERTY_X86_COMPAT_ISA_1_USED,
+	GNU_PROPERTY_X86_COMPAT_ISA_1_NEEDED,
+	GNU_PROPERTY_X86_COMPAT_2_ISA_1_USED,
+	GNU_PROPERTY_X86_COMPAT_2_ISA_1_NEEDED,
+	GNU_PROPERTY_X86_FEATURE_2_USED and
+	GNU_PROPERTY_X86_FEATURE_2_NEEDED.
+	(Target_x86_64::merge_gnu_properties): Merge FEATURE_2_USED bits.
+	Initialize object_feature_2_used_.
+	(Target_x86_64::do_finalize_gnu_properties): Support
+	GNU_PROPERTY_X86_FEATURE_2_USED and
+	GNU_PROPERTY_X86_FEATURE_2_NEEDED.
+	* testsuite/gnu_property_a.S (GNU_PROPERTY_X86_ISA_1_USED): Set
+	to 0xc0010002.
+	(GNU_PROPERTY_X86_ISA_1_NEEDED): Set to 0xc0008002.
+	* testsuite/gnu_property_b.S (GNU_PROPERTY_X86_ISA_1_USED): Set
+	to 0xc0010002.
+	(GNU_PROPERTY_X86_ISA_1_NEEDED): Set to 0xc0008002.
+	* testsuite/gnu_property_c.S (GNU_PROPERTY_X86_ISA_1_USED): Set
+	to 0xc0010002.
+	(GNU_PROPERTY_X86_ISA_1_NEEDED): Set to 0xc0008002.
+	* testsuite/gnu_property_test.sh: Updated.
+
 2020-10-13  H.J. Lu  <hongjiu.lu@intel.com>
 
 	PR gold/22914
diff --git a/gold/testsuite/gnu_property_a.S b/gold/testsuite/gnu_property_a.S
index 463bc8e52fe..5fbbbc9c4bb 100644
--- a/gold/testsuite/gnu_property_a.S
+++ b/gold/testsuite/gnu_property_a.S
@@ -1,8 +1,8 @@
 #define NT_GNU_PROPERTY_TYPE_0 5
 
 #define GNU_PROPERTY_STACK_SIZE 1
-#define GNU_PROPERTY_X86_ISA_1_USED 0xc0000000
-#define GNU_PROPERTY_X86_ISA_1_NEEDED 0xc0000001
+#define GNU_PROPERTY_X86_ISA_1_USED 0xc0010002
+#define GNU_PROPERTY_X86_ISA_1_NEEDED 0xc0008002
 #define GNU_PROPERTY_X86_FEATURE_1_AND 0xc0000002
 
 #if __SIZEOF_PTRDIFF_T__  == 8
diff --git a/gold/testsuite/gnu_property_b.S b/gold/testsuite/gnu_property_b.S
index 0c0c038ead1..7028f73d7ab 100644
--- a/gold/testsuite/gnu_property_b.S
+++ b/gold/testsuite/gnu_property_b.S
@@ -2,8 +2,8 @@
 
 #define GNU_PROPERTY_STACK_SIZE 1
 #define GNU_PROPERTY_NO_COPY_ON_PROTECTED 2
-#define GNU_PROPERTY_X86_ISA_1_USED 0xc0000000
-#define GNU_PROPERTY_X86_ISA_1_NEEDED 0xc0000001
+#define GNU_PROPERTY_X86_ISA_1_USED 0xc0010002
+#define GNU_PROPERTY_X86_ISA_1_NEEDED 0xc0008002
 #define GNU_PROPERTY_X86_FEATURE_1_AND 0xc0000002
 
 #if __SIZEOF_PTRDIFF_T__  == 8
diff --git a/gold/testsuite/gnu_property_c.S b/gold/testsuite/gnu_property_c.S
index ace159a9a9d..c8cbd8bce28 100644
--- a/gold/testsuite/gnu_property_c.S
+++ b/gold/testsuite/gnu_property_c.S
@@ -2,8 +2,8 @@
 
 #define GNU_PROPERTY_STACK_SIZE 1
 #define GNU_PROPERTY_NO_COPY_ON_PROTECTED 2
-#define GNU_PROPERTY_X86_ISA_1_USED 0xc0000000
-#define GNU_PROPERTY_X86_ISA_1_NEEDED 0xc0000001
+#define GNU_PROPERTY_X86_ISA_1_USED 0xc0010002
+#define GNU_PROPERTY_X86_ISA_1_NEEDED 0xc0008002
 #define GNU_PROPERTY_X86_FEATURE_1_AND 0xc0000002
 
 #if __SIZEOF_PTRDIFF_T__  == 8
diff --git a/gold/testsuite/gnu_property_test.sh b/gold/testsuite/gnu_property_test.sh
index 1806d3474cc..a4096005b78 100755
--- a/gold/testsuite/gnu_property_test.sh
+++ b/gold/testsuite/gnu_property_test.sh
@@ -77,8 +77,8 @@ check_count gnu_property_test.stdout "^  NOTE" 2
 
 check gnu_property_test.stdout "stack size: 0x111100"
 check gnu_property_test.stdout "no copy on protected"
-check gnu_property_test.stdout "x86 ISA used: i486, SSE2, SSE4_2, AVX512CD"
-check gnu_property_test.stdout "x86 ISA needed: i486, SSE2, SSE4_2, AVX512CD"
+check gnu_property_test.stdout "x86 ISA used: x86-64-v2, <unknown: 10>, <unknown: 100>, <unknown: 1000>"
+check gnu_property_test.stdout "x86 ISA needed: x86-64-v2, <unknown: 10>, <unknown: 100>, <unknown: 1000>"
 check gnu_property_test.stdout "x86 feature: IBT"
 
 exit 0
diff --git a/gold/x86_64.cc b/gold/x86_64.cc
index 9cb2cf0a322..378bac16f78 100644
--- a/gold/x86_64.cc
+++ b/gold/x86_64.cc
@@ -706,8 +706,9 @@ class Target_x86_64 : public Sized_target<size, false>
       rela_irelative_(NULL), copy_relocs_(elfcpp::R_X86_64_COPY),
       got_mod_index_offset_(-1U), tlsdesc_reloc_info_(),
       tls_base_symbol_defined_(false), isa_1_used_(0), isa_1_needed_(0),
-      feature_1_(0), object_isa_1_used_(0), object_feature_1_(0),
-      seen_first_object_(false)
+      feature_1_(0), feature_2_used_(0), feature_2_needed_(0),
+      object_isa_1_used_(0), object_feature_1_(0),
+      object_feature_2_used_(0), seen_first_object_(false)
   { }
 
   // Hook for a new output section.
@@ -1382,6 +1383,8 @@ class Target_x86_64 : public Sized_target<size, false>
   uint32_t isa_1_used_;
   uint32_t isa_1_needed_;
   uint32_t feature_1_;
+  uint32_t feature_2_used_;
+  uint32_t feature_2_needed_;
   // Target-specific properties from the current object.
   // These bits get ORed into ISA_1_USED_ after all properties for the object
   // have been processed. But if either is all zeroes (as when the property
@@ -1391,6 +1394,7 @@ class Target_x86_64 : public Sized_target<size, false>
   // These bits get ANDed into FEATURE_1_ after all properties for the object
   // have been processed.
   uint32_t object_feature_1_;
+  uint32_t object_feature_2_used_;
   // Whether we have seen our first object, for use in initializing FEATURE_1_.
   bool seen_first_object_;
 };
@@ -1594,9 +1598,15 @@ Target_x86_64<size>::record_gnu_property(
 
   switch (pr_type)
     {
+    case elfcpp::GNU_PROPERTY_X86_COMPAT_ISA_1_USED:
+    case elfcpp::GNU_PROPERTY_X86_COMPAT_ISA_1_NEEDED:
+    case elfcpp::GNU_PROPERTY_X86_COMPAT_2_ISA_1_USED:
+    case elfcpp::GNU_PROPERTY_X86_COMPAT_2_ISA_1_NEEDED:
     case elfcpp::GNU_PROPERTY_X86_ISA_1_USED:
     case elfcpp::GNU_PROPERTY_X86_ISA_1_NEEDED:
     case elfcpp::GNU_PROPERTY_X86_FEATURE_1_AND:
+    case elfcpp::GNU_PROPERTY_X86_FEATURE_2_USED:
+    case elfcpp::GNU_PROPERTY_X86_FEATURE_2_NEEDED:
       if (pr_datasz != 4)
 	{
 	  gold_warning(_("%s: corrupt .note.gnu.property section "
@@ -1625,6 +1635,12 @@ Target_x86_64<size>::record_gnu_property(
       // If we see multiple feature props in one object, OR them together.
       this->object_feature_1_ |= val;
       break;
+    case elfcpp::GNU_PROPERTY_X86_FEATURE_2_USED:
+      this->object_feature_2_used_ |= val;
+      break;
+    case elfcpp::GNU_PROPERTY_X86_FEATURE_2_NEEDED:
+      this->feature_2_needed_ |= val;
+      break;
     }
 }
 
@@ -1642,15 +1658,23 @@ Target_x86_64<size>::merge_gnu_properties(const Object*)
       else if (this->isa_1_used_ != 0)
 	this->isa_1_used_ |= this->object_isa_1_used_;
       this->feature_1_ &= this->object_feature_1_;
+      // If any object is missing the FEATURE_2_USED property, we must
+      // omit it from the output file.
+      if (this->object_feature_2_used_ == 0)
+	this->feature_2_used_ = 0;
+      else if (this->feature_2_used_ != 0)
+	this->feature_2_used_ |= this->object_feature_2_used_;
     }
   else
     {
       this->isa_1_used_ = this->object_isa_1_used_;
       this->feature_1_ = this->object_feature_1_;
+      this->feature_2_used_ = this->object_feature_2_used_;
       this->seen_first_object_ = true;
     }
   this->object_isa_1_used_ = 0;
   this->object_feature_1_ = 0;
+  this->object_feature_2_used_ = 0;
 }
 
 static inline void
@@ -1676,6 +1700,12 @@ Target_x86_64<size>::do_finalize_gnu_properties(Layout* layout) const
   if (this->feature_1_ != 0)
     add_property(layout, elfcpp::GNU_PROPERTY_X86_FEATURE_1_AND,
 		 this->feature_1_);
+  if (this->feature_2_used_ != 0)
+    add_property(layout, elfcpp::GNU_PROPERTY_X86_FEATURE_2_USED,
+		 this->feature_2_used_);
+  if (this->feature_2_needed_ != 0)
+    add_property(layout, elfcpp::GNU_PROPERTY_X86_FEATURE_2_NEEDED,
+		 this->feature_2_needed_);
 }
 
 // Write the first three reserved words of the .got.plt section.


More information about the Binutils-cvs mailing list