summarylogtreecommitdiffstats
path: root/0004-PR23486-Properly-merge-GNU_PROPERTY_X86_ISA_1_USED-x86_64.patch
blob: d56d8b7b6fd2cc0409883fae35d1c2e146732975 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
From 96027b49650718ebcd20d81bd8d0fbbd36a33558 Mon Sep 17 00:00:00 2001
From: Cary Coutant <ccoutant@gmail.com>
Date: Tue, 7 Aug 2018 21:35:12 -0700
Subject: [PATCH] Properly merge GNU_PROPERTY_X86_ISA_1_USED (x86_64).

gold/
	PR ld/23486
	* x86_64.cc (Target_x86_64::Target_x86_64): Initialize
	object_isa_1_used_.
	(Target_x86_64::object_isa_1_used_): New data member.
	(Target_x86_64::record_gnu_property): Save ISA_1_USED bits for object.
	(Target_x86_64::merge_gnu_properties): Merge ISA_1_USED bits.
---
 gold/x86_64.cc | 22 +++++++++++++++++++---
 1 file changed, 19 insertions(+), 3 deletions(-)

diff --git a/gold/x86_64.cc b/gold/x86_64.cc
index 27f273d64b..ac958616c6 100644
--- a/gold/x86_64.cc
+++ b/gold/x86_64.cc
@@ -706,7 +706,8 @@ 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_feature_1_(0), seen_first_object_(false)
+      feature_1_(0), object_isa_1_used_(0), object_feature_1_(0),
+      seen_first_object_(false)
   { }
 
   // Hook for a new output section.
@@ -1381,6 +1382,11 @@ class Target_x86_64 : public Sized_target<size, false>
   uint32_t isa_1_needed_;
   uint32_t feature_1_;
   // 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
+  // is absent from an object), the result should be all zeroes.
+  // (See PR ld/23486.)
+  uint32_t object_isa_1_used_;
   // These bits get ANDed into FEATURE_1_ after all properties for the object
   // have been processed.
   uint32_t object_feature_1_;
@@ -1609,7 +1615,7 @@ Target_x86_64<size>::record_gnu_property(
   switch (pr_type)
     {
     case elfcpp::GNU_PROPERTY_X86_ISA_1_USED:
-      this->isa_1_used_ |= val;
+      this->object_isa_1_used_ |= val;
       break;
     case elfcpp::GNU_PROPERTY_X86_ISA_1_NEEDED:
       this->isa_1_needed_ |= val;
@@ -1627,12 +1633,22 @@ void
 Target_x86_64<size>::merge_gnu_properties(const Object*)
 {
   if (this->seen_first_object_)
-    this->feature_1_ &= this->object_feature_1_;
+    {
+      // If any object is missing the ISA_1_USED property, we must omit
+      // it from the output file.
+      if (this->object_isa_1_used_ == 0)
+	this->isa_1_used_ = 0;
+      else if (this->isa_1_used_ != 0)
+	this->isa_1_used_ |= this->object_isa_1_used_;
+      this->feature_1_ &= this->object_feature_1_;
+    }
   else
     {
+      this->isa_1_used_ = this->object_isa_1_used_;
       this->feature_1_ = this->object_feature_1_;
       this->seen_first_object_ = true;
     }
+  this->object_isa_1_used_ = 0;
   this->object_feature_1_ = 0;
 }
 
-- 
2.18.0