Add gnu.property new C++ dual ABI compiler flag 46/244046/2 accepted/tizen/base/tool/20200917.222725 submit/tizen_base/20200917.055737
authorAndrey Kazmin <a.kazmin@partner.samsung.com>
Fri, 6 Mar 2020 14:01:37 +0000 (17:01 +0300)
committerAndrey Kazmin <a.kazmin@partner.samsung.com>
Mon, 14 Sep 2020 09:52:42 +0000 (09:52 +0000)
It denotes that object file doesn't rely on any C++ ABI.
Also this flag is used to skip C++ ABI validation in linker.

Change-Id: I1ed4be997190a2ffdc4642946743ee9908a30348
Signed-off-by: Andrey Kazmin <a.kazmin@partner.samsung.com>
bfd/elf-properties.c
binutils/readelf.c
include/elf/common.h

index d942012..537dc00 100644 (file)
@@ -294,7 +294,9 @@ elf_validate_compiler_flags_properties (bfd *abfd,
       return FALSE;
     }
 
-  if (!elf_gnu_property_validate_flag(aprop->u.number,
+  if (!(aprop->u.number & GNU_PROPERTY_DUAL_CXX_ABI ||
+       bprop->u.number & GNU_PROPERTY_DUAL_CXX_ABI) &&
+      !elf_gnu_property_validate_flag(aprop->u.number,
                                      bprop->u.number,
                                      GNU_PROPERTY_USECXX_VALIDATION,
                                      GNU_PROPERTY_USECXX11_ABI))
@@ -364,10 +366,23 @@ elf_merge_gnu_properties_compiler_flags (elf_property *aprop,
       is_updated = TRUE;
     }
 
-  if ((aprop->u.number ^ bprop->u.number) & GNU_PROPERTY_USECXX11_ABI)
+  if (aprop->u.number & GNU_PROPERTY_DUAL_CXX_ABI)
     {
-      aprop->u.number |= GNU_PROPERTY_USECXX11_ABI;
-      is_updated = TRUE;
+      if (!(bprop->u.number & GNU_PROPERTY_DUAL_CXX_ABI))
+       {
+         aprop->u.number &= ~(GNU_PROPERTY_DUAL_CXX_ABI | GNU_PROPERTY_USECXX11_ABI);
+         aprop->u.number |= bprop->u.number & GNU_PROPERTY_USECXX11_ABI;
+         is_updated = TRUE;
+       }
+    }
+  else
+    {
+      if ((aprop->u.number ^ bprop->u.number) & GNU_PROPERTY_USECXX11_ABI &&
+         !(bprop->u.number & GNU_PROPERTY_DUAL_CXX_ABI))
+       {
+         aprop->u.number |= GNU_PROPERTY_USECXX11_ABI;
+         is_updated = TRUE;
+       }
     }
 
   if ((aprop->u.number ^ bprop->u.number) & GNU_PROPERTY_TIZEN_VALIDATION)
index 3dfcb55..ed8c850 100644 (file)
@@ -17754,8 +17754,9 @@ decode_compiler_flags_notes (unsigned long bitmask)
 {
   printf("%#lx [", bitmask);
 
-  printf("%c%ccxx11, ", bitmask & GNU_PROPERTY_USECXX_VALIDATION ? '=' : '~',
-        bitmask & GNU_PROPERTY_USECXX11_ABI ? '+' : '!');
+  printf("%c%ccxx11 %cdual, ", bitmask & GNU_PROPERTY_USECXX_VALIDATION ? '=' : '~',
+        bitmask & GNU_PROPERTY_USECXX11_ABI ? '+' : '!',
+        bitmask & GNU_PROPERTY_DUAL_CXX_ABI ? '+' : '!');
 
   printf("%c%casan, ", bitmask & GNU_PROPERTY_SANITIZE_VALIDATION ? '=' : '~',
         bitmask & GNU_PROPERTY_SANITIZE_ADDRESS ? '+' : '!');
index 55b0ec2..dcf9df4 100644 (file)
 /* Pre/post cxx11 ABI.  */
 #define GNU_PROPERTY_USECXX_VALIDATION         (1U << 0)
 #define GNU_PROPERTY_USECXX11_ABI              (1U << 1)
+#define GNU_PROPERTY_DUAL_CXX_ABI              (1U << 2)
 /* Sanitizer flags.  */
-#define GNU_PROPERTY_SANITIZE_VALIDATION       (1U << 2)
-#define GNU_PROPERTY_SANITIZE_ADDRESS          (1U << 3)
-#define GNU_PROPERTY_SANITIZE_UNDEFINED                (1U << 4)
-#define GNU_PROPERTY_SANITIZE_THREAD           (1U << 5)
-/* Reserved flag */
-#define GNU_PROPERTY_RESERVED_FIELD            (1U << 6)
+#define GNU_PROPERTY_SANITIZE_VALIDATION       (1U << 3)
+#define GNU_PROPERTY_SANITIZE_ADDRESS          (1U << 4)
+#define GNU_PROPERTY_SANITIZE_UNDEFINED                (1U << 5)
+#define GNU_PROPERTY_SANITIZE_THREAD           (1U << 6)
 /* Tizen version flag */
 #define GNU_PROPERTY_TIZEN_VALIDATION          (1U << 7)
 /* Tizen version offset and mask */