[PATCH] D153335: [ELFAttributeParser] Skip unknown vendor subsections.

Simon Tatham via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Mon Jun 26 03:49:29 PDT 2023


simon_tatham updated this revision to Diff 534489.
simon_tatham added a comment.

Rewritten the test to use llvm-mc instead of yaml2obj.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D153335/new/

https://reviews.llvm.org/D153335

Files:
  lld/test/ELF/Inputs/arm-vfp-arg-vfp-vendor.s
  lld/test/ELF/arm-tag-vfp-args-errs.s
  llvm/lib/Support/ELFAttributeParser.cpp


Index: llvm/lib/Support/ELFAttributeParser.cpp
===================================================================
--- llvm/lib/Support/ELFAttributeParser.cpp
+++ llvm/lib/Support/ELFAttributeParser.cpp
@@ -127,10 +127,14 @@
     sw->printString("Vendor", vendorName);
   }
 
-  // Ignore unrecognized vendor-name.
-  if (vendorName.lower() != vendor)
-    return createStringError(errc::invalid_argument,
-                             "unrecognized vendor-name: " + vendorName);
+  // Handle a subsection with an unrecognized vendor-name by skipping
+  // over it to the next subsection. ADDENDA32 in the Arm ABI defines
+  // that vendor attribute sections must not affect compatibility, so
+  // this should always be safe.
+  if (vendorName.lower() != vendor) {
+    cursor.seek(end);
+    return Error::success();
+  }
 
   while (cursor.tell() < end) {
     /// Tag_File | Tag_Section | Tag_Symbol   uleb128:byte-size
Index: lld/test/ELF/arm-tag-vfp-args-errs.s
===================================================================
--- lld/test/ELF/arm-tag-vfp-args-errs.s
+++ lld/test/ELF/arm-tag-vfp-args-errs.s
@@ -1,9 +1,11 @@
 // REQUIRES:arm
 // RUN: llvm-mc -filetype=obj -triple=armv7a-none-linux-gnueabi %S/Inputs/arm-vfp-arg-base.s -o %tbase.o
 // RUN: llvm-mc -filetype=obj -triple=armv7a-none-linux-gnueabi %S/Inputs/arm-vfp-arg-vfp.s -o %tvfp.o
+// RUN: llvm-mc -filetype=obj -triple=armv7a-none-linux-gnueabi %S/Inputs/arm-vfp-arg-vfp-vendor.s -o %tvfpvendor.o
 // RUN: llvm-mc -filetype=obj -triple=armv7a-none-linux-gnueabi %S/Inputs/arm-vfp-arg-toolchain.s -o %ttoolchain.o
 // RUN: llvm-mc -filetype=obj -triple=armv7a-none-linux-gnueabi %s -o %t.o
 // RUN: not ld.lld %t.o %tbase.o %tvfp.o -o%t 2>&1 | FileCheck %s
+// RUN: not ld.lld %t.o %tbase.o %tvfpvendor.o -o%t 2>&1 | FileCheck %s
 // RUN: not ld.lld %t.o %tbase.o %ttoolchain.o -o%t 2>&1 | FileCheck %s
 // RUN: not ld.lld %t.o %tvfp.o %tbase.o -o%t 2>&1 | FileCheck %s
 // RUN: not ld.lld %t.o %tvfp.o %ttoolchain.o -o%t 2>&1 | FileCheck %s
Index: lld/test/ELF/Inputs/arm-vfp-arg-vfp-vendor.s
===================================================================
--- /dev/null
+++ lld/test/ELF/Inputs/arm-vfp-arg-vfp-vendor.s
@@ -0,0 +1,53 @@
+// Variant form of arm-vfp-arg-vfp.s which constructs the attributes
+// section manually, in order to add a vendor-specific attribute
+// subsection in front of the "aeabi" one. LLD ought to skip over it
+// and still parse the "aeabi" subsection beyond it.
+//
+// Used by lld/test/ELF/arm-tag-vfp-args-errs.s .
+
+        .syntax unified
+
+        // Manually construct a custom .ARM.attributes section
+        .section .ARM.attributes,"",%0x70000003 // SHT_ARM_ATTRIBUTES
+
+        // Initial byte giving the section format version
+        .byte 'A'
+
+        // Subsection with a name that won't be recognised as a known vendor
+vendor_subsect_start:
+        .word vendor_subsect_end - vendor_subsect_start // subsection length
+        .asciz "ShouldBeIgnored" // vendor name
+        .dcb.b 64, 0xff // dummy vendor section contents
+vendor_subsect_end:
+
+        // Subsection that should be identical to the attributes defined by
+        // arm-vfp-arg-vfp.s
+aeabi_subsect_start:
+        .word aeabi_subsect_end - aeabi_subsect_start
+        .asciz "aeabi" // vendor name indicating the standard subsection
+file_subsubsect_start:
+        .byte 1 // introduce sub-subsection of attributes for the whole file
+        .word file_subsubsect_end - file_subsubsect_start // sub-subsection len
+        .byte 5 // CPU_name
+        .asciz "7-A"
+        .byte 6, 10 // CPU_arch = ARM v7
+        .byte 7, 'A' // CPU_arch_profile = Application
+        .byte 8, 1 // ARM_ISA_use = Permitted
+        .byte 9, 2 // THUMB_ISA_use = Thumb-2
+        .byte 18, 4 // ABI_PCS_wchar_t = 4-byte
+        .byte 20, 1 // ABI_FP_denormal = IEEE-754
+        .byte 21, 1 // ABI_FP_exceptions = IEEE-754
+        .byte 23, 3 // ABI_FP_number_model = IEEE-754
+        .byte 24, 1 // ABI_align_needed = 8-byte alignment
+        .byte 25, 1 // ABI_align_preserved = 8-byte data alignment
+        .byte 26, 2 // ABI_enum_size = Int32
+        .byte 28, 1 // ABI_VFP_args = AAPCS VFP
+        .byte 30, 6 // ABI_optimization_goals = Best Debugging
+        .byte 34, 1 // CPU_unaligned_access = v6-style
+file_subsubsect_end:
+aeabi_subsect_end:
+
+        .text
+        .global f1
+        .type f1, %function
+f1:     bx lr


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D153335.534489.patch
Type: text/x-patch
Size: 4451 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20230626/cbbd49d4/attachment.bin>


More information about the llvm-commits mailing list