diff options
author | H.J. Lu <hjl.tools@gmail.com> | 2020-10-13 05:20:49 -0700 |
---|---|---|
committer | H.J. Lu <hjl.tools@gmail.com> | 2020-10-13 05:21:05 -0700 |
commit | 586e30940e640f67bd55bd72e1d1355a4faf8079 (patch) | |
tree | 278d223a2c3820c46af259ed69fbd381f9d331d6 /gold | |
parent | 6bf4a34047452f882c5cc66bd85812ee1bb5a41c (diff) | |
download | fsf-binutils-gdb-586e30940e640f67bd55bd72e1d1355a4faf8079.zip fsf-binutils-gdb-586e30940e640f67bd55bd72e1d1355a4faf8079.tar.gz fsf-binutils-gdb-586e30940e640f67bd55bd72e1d1355a4faf8079.tar.bz2 |
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.
Diffstat (limited to 'gold')
-rw-r--r-- | gold/ChangeLog | 30 | ||||
-rw-r--r-- | gold/testsuite/gnu_property_a.S | 4 | ||||
-rw-r--r-- | gold/testsuite/gnu_property_b.S | 4 | ||||
-rw-r--r-- | gold/testsuite/gnu_property_c.S | 4 | ||||
-rwxr-xr-x | gold/testsuite/gnu_property_test.sh | 4 | ||||
-rw-r--r-- | gold/x86_64.cc | 34 |
6 files changed, 70 insertions, 10 deletions
diff --git a/gold/ChangeLog b/gold/ChangeLog index 2ebe2c1..41fe6e0 100644 --- a/gold/ChangeLog +++ b/gold/ChangeLog @@ -1,5 +1,35 @@ 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 PR gold/23535 * layout.cc (Layout::attach_allocated_section_to_segment): Place diff --git a/gold/testsuite/gnu_property_a.S b/gold/testsuite/gnu_property_a.S index 463bc8e..5fbbbc9 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 0c0c038..7028f73 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 ace159a..c8cbd8b 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 1806d34..a409600 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 9cb2cf0..378bac1 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. |