[libc++] accept ELF Tool Chain readelf format in tooling
authorEd Maste <emaste@FreeBSD.org>
Mon, 19 Dec 2022 17:13:42 +0000 (12:13 -0500)
committerEd Maste <emaste@FreeBSD.org>
Tue, 20 Dec 2022 14:39:24 +0000 (09:39 -0500)
ELF Tool Chain provides alternatives to most GNU binutils tools,
including readelf.  These tools are currently used by FreeBSD.

ELF Tool Chain's readelf currently emits headings for symbol table
information in a slightly different format compared to GNU or LLVM
readelf.  Accept both formats.

Reviewed by: philnik
Sponsored by: The FreeBSD Foundation
Differential Revision: https://reviews.llvm.org/D140313

libcxx/utils/libcxx/sym_check/extract.py

index 33411e2..c563720 100644 (file)
@@ -175,10 +175,16 @@ class ReadElfExtractor(object):
         start = -1
         end = -1
         for i in range(len(lines)):
-            if lines[i].startswith("Symbol table '.dynsym'"):
+            # Accept both GNU and ELF Tool Chain readelf format.  Some versions
+            # of ELF Tool Chain readelf use ( ) around the symbol table name
+            # instead of ' ', and omit the blank line before the heading.
+            if re.match(r"Symbol table ['(].dynsym[')]", lines[i]):
                 start = i + 2
-            if start != -1 and end == -1 and not lines[i].strip():
-                end = i + 1
+            elif start != -1 and end == -1:
+                if not lines[i].strip():
+                    end = i + 1
+                if lines[i].startswith("Symbol table ("):
+                    end = i
         assert start != -1
         if end == -1:
             end = len(lines)