[llvm] [llvm-objcopy] Add --skip-symbol and --skip-symbols options (PR #80873)

Ilia Kuklin via llvm-commits llvm-commits at lists.llvm.org
Wed Mar 20 02:30:31 PDT 2024


https://github.com/kuilpd updated https://github.com/llvm/llvm-project/pull/80873

>From da84199bd0e514f4e139e456d58e53b9af651724 Mon Sep 17 00:00:00 2001
From: Ilia Kuklin <ikuklin at accesssoftek.com>
Date: Tue, 6 Feb 2024 21:19:50 +0500
Subject: [PATCH 01/20] Add llvm-objcopy option --ignore-symbol

---
 llvm/include/llvm/ObjCopy/ELF/ELFConfig.h     |  1 +
 llvm/lib/ObjCopy/ELF/ELFObjcopy.cpp           |  2 +
 .../llvm-objcopy/ELF/ignore-symbols.test      | 41 +++++++++++++++++++
 llvm/tools/llvm-objcopy/ObjcopyOptions.cpp    |  9 ++++
 llvm/tools/llvm-objcopy/ObjcopyOpts.td        | 14 +++++++
 5 files changed, 67 insertions(+)
 create mode 100644 llvm/test/tools/llvm-objcopy/ELF/ignore-symbols.test

diff --git a/llvm/include/llvm/ObjCopy/ELF/ELFConfig.h b/llvm/include/llvm/ObjCopy/ELF/ELFConfig.h
index eafed92516c7df..ee0673a6961f11 100644
--- a/llvm/include/llvm/ObjCopy/ELF/ELFConfig.h
+++ b/llvm/include/llvm/ObjCopy/ELF/ELFConfig.h
@@ -19,6 +19,7 @@ namespace objcopy {
 struct ELFConfig {
   uint8_t NewSymbolVisibility = (uint8_t)ELF::STV_DEFAULT;
 
+  NameMatcher SymbolsToIgnore;
   std::vector<std::pair<NameMatcher, uint8_t>> SymbolsToSetVisibility;
 
   // ELF entry point address expression. The input parameter is an entry point
diff --git a/llvm/lib/ObjCopy/ELF/ELFObjcopy.cpp b/llvm/lib/ObjCopy/ELF/ELFObjcopy.cpp
index e4d6e02f3aa60d..ceb76c2a8bbe69 100644
--- a/llvm/lib/ObjCopy/ELF/ELFObjcopy.cpp
+++ b/llvm/lib/ObjCopy/ELF/ELFObjcopy.cpp
@@ -291,6 +291,8 @@ static Error updateAndRemoveSymbols(const CommonConfig &Config,
     return Error::success();
 
   Obj.SymbolTable->updateSymbols([&](Symbol &Sym) {
+    if (ELFConfig.SymbolsToIgnore.matches(Sym.Name))
+      return;
     // Common and undefined symbols don't make sense as local symbols, and can
     // even cause crashes if we localize those, so skip them.
     if (!Sym.isCommon() && Sym.getShndx() != SHN_UNDEF &&
diff --git a/llvm/test/tools/llvm-objcopy/ELF/ignore-symbols.test b/llvm/test/tools/llvm-objcopy/ELF/ignore-symbols.test
new file mode 100644
index 00000000000000..13a15b46038ee7
--- /dev/null
+++ b/llvm/test/tools/llvm-objcopy/ELF/ignore-symbols.test
@@ -0,0 +1,41 @@
+
+# RUN: yaml2obj %s -o %t.o
+# RUN: echo 'foo[2-3]' > %t.ignore.regex
+
+# RUN: cp  %t.o  %t1.o
+# RUN: llvm-objcopy  %t1.o --localize-hidden --ignore-symbols=%t.ignore.regex --regex
+# RUN: llvm-readelf -s  %t1.o | FileCheck %s --check-prefix=SYMS
+# SYMS-DAG: LOCAL  HIDDEN      1 foo1
+# SYMS-DAG: GLOBAL HIDDEN      1 foo2
+# SYMS-DAG: GLOBAL HIDDEN      1 foo3
+
+# RUN: cp  %t.o  %t1.o
+# RUN: llvm-objcopy  %t1.o --localize-hidden --ignore-symbol=foo3
+# RUN: llvm-readelf -s  %t1.o | FileCheck %s --check-prefix=SYM
+# SYM-DAG: LOCAL  HIDDEN      1 foo1
+# SYM-DAG: LOCAL  HIDDEN      1 foo2
+# SYM-DAG: GLOBAL HIDDEN      1 foo3
+
+!ELF
+FileHeader:
+  Class:           ELFCLASS64
+  Data:            ELFDATA2LSB
+  Type:            ET_REL
+  Machine:         EM_X86_64
+Sections:
+  - Name:            .text
+    Type:            SHT_PROGBITS
+    Flags:           [ SHF_ALLOC, SHF_EXECINSTR ]
+Symbols:
+  - Name:    foo1
+    Section: .text
+    Binding:  STB_GLOBAL
+    Other:    [ STV_HIDDEN ]
+  - Name:    foo2
+    Section: .text
+    Binding:  STB_GLOBAL
+    Other:    [ STV_HIDDEN ]
+  - Name:    foo3
+    Section: .text
+    Binding:  STB_GLOBAL
+    Other:    [ STV_HIDDEN ]
diff --git a/llvm/tools/llvm-objcopy/ObjcopyOptions.cpp b/llvm/tools/llvm-objcopy/ObjcopyOptions.cpp
index a0c6415bf0e6ae..ff912d0f39b199 100644
--- a/llvm/tools/llvm-objcopy/ObjcopyOptions.cpp
+++ b/llvm/tools/llvm-objcopy/ObjcopyOptions.cpp
@@ -978,6 +978,15 @@ objcopy::parseObjcopyOptions(ArrayRef<const char *> RawArgsArr,
             addSymbolsFromFile(Config.SymbolsToKeep, DC.Alloc, Arg->getValue(),
                                SymbolMatchStyle, ErrorCallback))
       return std::move(E);
+  for (auto *Arg : InputArgs.filtered(OBJCOPY_ignore_symbol))
+    if (Error E = ELFConfig.SymbolsToIgnore.addMatcher(NameOrPattern::create(
+            Arg->getValue(), SymbolMatchStyle, ErrorCallback)))
+      return std::move(E);
+  for (auto *Arg : InputArgs.filtered(OBJCOPY_ignore_symbols))
+    if (Error E = addSymbolsFromFile(ELFConfig.SymbolsToIgnore, DC.Alloc,
+                                     Arg->getValue(), SymbolMatchStyle,
+                                     ErrorCallback))
+      return std::move(E);
   for (auto *Arg : InputArgs.filtered(OBJCOPY_add_symbol)) {
     Expected<NewSymbolInfo> SymInfo = parseNewSymbolInfo(Arg->getValue());
     if (!SymInfo)
diff --git a/llvm/tools/llvm-objcopy/ObjcopyOpts.td b/llvm/tools/llvm-objcopy/ObjcopyOpts.td
index 3c0e5cd475a36b..fccfaaecc45cef 100644
--- a/llvm/tools/llvm-objcopy/ObjcopyOpts.td
+++ b/llvm/tools/llvm-objcopy/ObjcopyOpts.td
@@ -206,6 +206,20 @@ defm keep_symbols
          "be repeated to read symbols from many files">,
       MetaVarName<"filename">;
 
+defm ignore_symbol : Eq<"ignore-symbol", "Do not change parameters of symbol <symbol> "
+                        "when executing other options that can change the symbol's "
+                        "name, binding or visibility">,
+                     MetaVarName<"symbol">;
+
+defm ignore_symbols
+    : Eq<"ignore-symbols",
+         "Reads a list of symbols from <filename> and runs as if "
+         "--ignore-symbol=<symbol> is set for each one. <filename> "
+         "contains one symbol per line and may contain comments beginning with "
+         "'#'. Leading and trailing whitespace is stripped from each line. May "
+         "be repeated to read symbols from many files">,
+      MetaVarName<"filename">;
+
 defm dump_section
     : Eq<"dump-section",
          "Dump contents of section named <section> into file <file>">,

>From a7b0edbbaea7b2831afdf3fc6a523faa43c6c711 Mon Sep 17 00:00:00 2001
From: Ilia Kuklin <ikuklin at accesssoftek.com>
Date: Mon, 12 Feb 2024 20:10:24 +0500
Subject: [PATCH 02/20] Adjust and expand ignore-symbols.test

---
 .../llvm-objcopy/ELF/ignore-symbols.test      | 44 +++++++++++++------
 1 file changed, 30 insertions(+), 14 deletions(-)

diff --git a/llvm/test/tools/llvm-objcopy/ELF/ignore-symbols.test b/llvm/test/tools/llvm-objcopy/ELF/ignore-symbols.test
index 13a15b46038ee7..1d3bb81e12f589 100644
--- a/llvm/test/tools/llvm-objcopy/ELF/ignore-symbols.test
+++ b/llvm/test/tools/llvm-objcopy/ELF/ignore-symbols.test
@@ -2,19 +2,36 @@
 # RUN: yaml2obj %s -o %t.o
 # RUN: echo 'foo[2-3]' > %t.ignore.regex
 
-# RUN: cp  %t.o  %t1.o
-# RUN: llvm-objcopy  %t1.o --localize-hidden --ignore-symbols=%t.ignore.regex --regex
-# RUN: llvm-readelf -s  %t1.o | FileCheck %s --check-prefix=SYMS
-# SYMS-DAG: LOCAL  HIDDEN      1 foo1
-# SYMS-DAG: GLOBAL HIDDEN      1 foo2
-# SYMS-DAG: GLOBAL HIDDEN      1 foo3
-
-# RUN: cp  %t.o  %t1.o
-# RUN: llvm-objcopy  %t1.o --localize-hidden --ignore-symbol=foo3
-# RUN: llvm-readelf -s  %t1.o | FileCheck %s --check-prefix=SYM
-# SYM-DAG: LOCAL  HIDDEN      1 foo1
-# SYM-DAG: LOCAL  HIDDEN      1 foo2
-# SYM-DAG: GLOBAL HIDDEN      1 foo3
+# Check --ignore-symbols functionality when changing symbol bindings
+# RUN: llvm-objcopy %t.o %t1.o --localize-hidden --ignore-symbols=%t.ignore.regex --regex
+# RUN: llvm-readelf -s %t1.o | FileCheck %s --check-prefix=LH-SYMS
+# LH-SYMS-DAG: LOCAL  HIDDEN      1 foo1
+# LH-SYMS-DAG: GLOBAL HIDDEN      1 foo2
+# LH-SYMS-DAG: GLOBAL HIDDEN      1 foo3
+
+# Check --ignore-symbol functionality when changing symbol bindings
+# RUN: llvm-objcopy %t.o %t2.o --localize-hidden --ignore-symbol=foo3
+# RUN: llvm-readelf -s %t2.o | FileCheck %s --check-prefix=LH-SYM
+# LH-SYM-DAG: LOCAL  HIDDEN      1 foo1
+# LH-SYM-DAG: LOCAL  HIDDEN      1 foo2
+# LH-SYM-DAG: GLOBAL HIDDEN      1 foo3
+
+
+# Check --ignore-symbols functionality when changing symbol names
+# RUN: echo -e "foo1 bar1\nfoo2 bar2" > %t.renames.list
+# RUN: llvm-objcopy %t.o %t3.o --redefine-syms=%t.renames.list --ignore-symbols=%t.ignore.regex --regex
+# RUN: llvm-readelf -s %t3.o | FileCheck %s --check-prefix=RS-SYMS
+# RS-SYMS-DAG: bar1
+# RS-SYMS-DAG: foo2
+# RS-SYMS-DAG: foo3
+
+# Check --ignore-symbols functionality when changing symbol names
+# RUN: llvm-objcopy %t.o %t4.o --redefine-sym=foo1=bar1 --ignore-symbol=fo.* --regex
+# RUN: llvm-readelf -s %t4.o | FileCheck %s --check-prefix=RS-SYM
+# RS-SYM-DAG: foo1
+# RS-SYM-DAG: foo2
+# RS-SYM-DAG: foo3
+
 
 !ELF
 FileHeader:
@@ -25,7 +42,6 @@ FileHeader:
 Sections:
   - Name:            .text
     Type:            SHT_PROGBITS
-    Flags:           [ SHF_ALLOC, SHF_EXECINSTR ]
 Symbols:
   - Name:    foo1
     Section: .text

>From 85f031e6b0aa9aaa7d7a0fcef2b7bd81cdb9a7db Mon Sep 17 00:00:00 2001
From: Ilia Kuklin <ikuklin at accesssoftek.com>
Date: Mon, 12 Feb 2024 20:30:22 +0500
Subject: [PATCH 03/20] Update the llvm-objcopy documentation

---
 llvm/docs/CommandGuide/llvm-objcopy.rst | 12 ++++++++++++
 1 file changed, 12 insertions(+)

diff --git a/llvm/docs/CommandGuide/llvm-objcopy.rst b/llvm/docs/CommandGuide/llvm-objcopy.rst
index 9d0cb7ad119589..9193296c3dfbbc 100644
--- a/llvm/docs/CommandGuide/llvm-objcopy.rst
+++ b/llvm/docs/CommandGuide/llvm-objcopy.rst
@@ -346,6 +346,18 @@ them.
  symbol, with leading and trailing whitespace ignored, as is anything following
  a '#'. Can be specified multiple times to read names from multiple files.
 
+.. option:: --ignore-symbol <symbol>
+
+ Do not change parameters of symbol <symbol> when executing other options that
+ can change the symbol's name, binding or visibility
+
+.. option:: --ignore-symbols <filename>
+
+ Reads a list of symbols from <filename> and runs as if --ignore-symbol=<symbol>
+ is set for each one. <filename> contains one symbol per line and may contain
+ comments beginning with '#'. Leading and trailing whitespace is stripped from
+ each line. May be repeated to read symbols from many files.
+
 .. option:: --input-target <format>, -I
 
  Read the input as the specified format. See `SUPPORTED FORMATS`_ for a list of

>From e9b8a8bce92c73fb6154eac428f0901d6ef72e2a Mon Sep 17 00:00:00 2001
From: Ilia Kuklin <ikuklin at accesssoftek.com>
Date: Mon, 12 Feb 2024 20:31:58 +0500
Subject: [PATCH 04/20] Add a test for checking various error cases

---
 .../ELF/ignore-symbols-check-errors.test      | 19 +++++++++++++++++++
 1 file changed, 19 insertions(+)
 create mode 100644 llvm/test/tools/llvm-objcopy/ELF/ignore-symbols-check-errors.test

diff --git a/llvm/test/tools/llvm-objcopy/ELF/ignore-symbols-check-errors.test b/llvm/test/tools/llvm-objcopy/ELF/ignore-symbols-check-errors.test
new file mode 100644
index 00000000000000..a92fecb88b3b07
--- /dev/null
+++ b/llvm/test/tools/llvm-objcopy/ELF/ignore-symbols-check-errors.test
@@ -0,0 +1,19 @@
+
+# RUN: yaml2obj %s -o %t.o
+
+# Check if using an invalid symbol pattern generates an error
+# RUN: echo '*.' > %t.symbols.regex
+# RUN: not llvm-objcopy %t.o --ignore-symbols=%t.symbols.regex --regex 2>&1 | FileCheck %s --check-prefix=SYMBOL
+# RUN: not llvm-objcopy %t.o --ignore-symbol=*. --regex 2>&1 | FileCheck %s --check-prefix=SYMBOL
+# SYMBOL: error: cannot compile regular expression '*.': repetition-operator operand invalid
+
+# Check passing an invalid filename generates an error
+# RUN: not llvm-objcopy %t.o --ignore-symbols=no_file 2>&1 | FileCheck %s --check-prefix=FILE
+# FILE: error: 'no_file': No such file or directory
+
+!ELF
+FileHeader:
+  Class:           ELFCLASS64
+  Data:            ELFDATA2LSB
+  Type:            ET_REL
+  Machine:         EM_X86_64

>From 6491013c0ab5a970130019ad9d2a8977839bebc8 Mon Sep 17 00:00:00 2001
From: Ilia Kuklin <ikuklin at accesssoftek.com>
Date: Thu, 15 Feb 2024 21:28:36 +0500
Subject: [PATCH 05/20] Adjust formatting and wording in tests

---
 .../ELF/ignore-symbols-check-errors.test      | 14 +++++-----
 .../llvm-objcopy/ELF/ignore-symbols.test      | 26 +++++++++----------
 2 files changed, 20 insertions(+), 20 deletions(-)

diff --git a/llvm/test/tools/llvm-objcopy/ELF/ignore-symbols-check-errors.test b/llvm/test/tools/llvm-objcopy/ELF/ignore-symbols-check-errors.test
index a92fecb88b3b07..74ab9e186441b2 100644
--- a/llvm/test/tools/llvm-objcopy/ELF/ignore-symbols-check-errors.test
+++ b/llvm/test/tools/llvm-objcopy/ELF/ignore-symbols-check-errors.test
@@ -1,14 +1,16 @@
-
 # RUN: yaml2obj %s -o %t.o
 
-# Check if using an invalid symbol pattern generates an error
+## Check that using an invalid symbol pattern generates an error
 # RUN: echo '*.' > %t.symbols.regex
-# RUN: not llvm-objcopy %t.o --ignore-symbols=%t.symbols.regex --regex 2>&1 | FileCheck %s --check-prefix=SYMBOL
-# RUN: not llvm-objcopy %t.o --ignore-symbol=*. --regex 2>&1 | FileCheck %s --check-prefix=SYMBOL
+# RUN: not llvm-objcopy %t.o --ignore-symbols=%t.symbols.regex --regex 2>&1 | \
+# RUN:   FileCheck %s --check-prefix=SYMBOL
+# RUN: not llvm-objcopy %t.o --ignore-symbol=*. --regex 2>&1 | \
+# RUN:   FileCheck %s --check-prefix=SYMBOL
 # SYMBOL: error: cannot compile regular expression '*.': repetition-operator operand invalid
 
-# Check passing an invalid filename generates an error
-# RUN: not llvm-objcopy %t.o --ignore-symbols=no_file 2>&1 | FileCheck %s --check-prefix=FILE
+## Check passing an invalid filename generates an error
+# RUN: not llvm-objcopy %t.o --ignore-symbols=no_file 2>&1 | \
+# RUN:   FileCheck %s --check-prefix=FILE
 # FILE: error: 'no_file': No such file or directory
 
 !ELF
diff --git a/llvm/test/tools/llvm-objcopy/ELF/ignore-symbols.test b/llvm/test/tools/llvm-objcopy/ELF/ignore-symbols.test
index 1d3bb81e12f589..47bf190c9c2d1f 100644
--- a/llvm/test/tools/llvm-objcopy/ELF/ignore-symbols.test
+++ b/llvm/test/tools/llvm-objcopy/ELF/ignore-symbols.test
@@ -1,47 +1,45 @@
-
 # RUN: yaml2obj %s -o %t.o
 # RUN: echo 'foo[2-3]' > %t.ignore.regex
 
-# Check --ignore-symbols functionality when changing symbol bindings
+## Check --ignore-symbols functionality when changing symbol bindings
 # RUN: llvm-objcopy %t.o %t1.o --localize-hidden --ignore-symbols=%t.ignore.regex --regex
 # RUN: llvm-readelf -s %t1.o | FileCheck %s --check-prefix=LH-SYMS
 # LH-SYMS-DAG: LOCAL  HIDDEN      1 foo1
 # LH-SYMS-DAG: GLOBAL HIDDEN      1 foo2
 # LH-SYMS-DAG: GLOBAL HIDDEN      1 foo3
 
-# Check --ignore-symbol functionality when changing symbol bindings
+## Check --ignore-symbol functionality when changing symbol bindings
 # RUN: llvm-objcopy %t.o %t2.o --localize-hidden --ignore-symbol=foo3
 # RUN: llvm-readelf -s %t2.o | FileCheck %s --check-prefix=LH-SYM
 # LH-SYM-DAG: LOCAL  HIDDEN      1 foo1
 # LH-SYM-DAG: LOCAL  HIDDEN      1 foo2
 # LH-SYM-DAG: GLOBAL HIDDEN      1 foo3
 
-
-# Check --ignore-symbols functionality when changing symbol names
+## Check --ignore-symbols functionality when changing symbol names
 # RUN: echo -e "foo1 bar1\nfoo2 bar2" > %t.renames.list
-# RUN: llvm-objcopy %t.o %t3.o --redefine-syms=%t.renames.list --ignore-symbols=%t.ignore.regex --regex
+# RUN: llvm-objcopy %t.o %t3.o --redefine-syms=%t.renames.list \
+# RUN:   --ignore-symbols=%t.ignore.regex --regex
 # RUN: llvm-readelf -s %t3.o | FileCheck %s --check-prefix=RS-SYMS
 # RS-SYMS-DAG: bar1
 # RS-SYMS-DAG: foo2
 # RS-SYMS-DAG: foo3
 
-# Check --ignore-symbols functionality when changing symbol names
+## Check --ignore-symbol functionality when changing symbol names
 # RUN: llvm-objcopy %t.o %t4.o --redefine-sym=foo1=bar1 --ignore-symbol=fo.* --regex
 # RUN: llvm-readelf -s %t4.o | FileCheck %s --check-prefix=RS-SYM
 # RS-SYM-DAG: foo1
 # RS-SYM-DAG: foo2
 # RS-SYM-DAG: foo3
 
-
 !ELF
 FileHeader:
-  Class:           ELFCLASS64
-  Data:            ELFDATA2LSB
-  Type:            ET_REL
-  Machine:         EM_X86_64
+  Class:   ELFCLASS64
+  Data:    ELFDATA2LSB
+  Type:    ET_REL
+  Machine: EM_X86_64
 Sections:
-  - Name:            .text
-    Type:            SHT_PROGBITS
+  - Name:  .text
+    Type:  SHT_PROGBITS
 Symbols:
   - Name:    foo1
     Section: .text

>From 55af35c7e47af4d88d0946315d0fc6a9a8f0543c Mon Sep 17 00:00:00 2001
From: Ilia Kuklin <ikuklin at accesssoftek.com>
Date: Thu, 15 Feb 2024 21:33:38 +0500
Subject: [PATCH 06/20] Use %errc_ENOENT for 'No such file or directory'
 message

---
 .../tools/llvm-objcopy/ELF/ignore-symbols-check-errors.test   | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/llvm/test/tools/llvm-objcopy/ELF/ignore-symbols-check-errors.test b/llvm/test/tools/llvm-objcopy/ELF/ignore-symbols-check-errors.test
index 74ab9e186441b2..23ef3d46c1b91b 100644
--- a/llvm/test/tools/llvm-objcopy/ELF/ignore-symbols-check-errors.test
+++ b/llvm/test/tools/llvm-objcopy/ELF/ignore-symbols-check-errors.test
@@ -10,8 +10,8 @@
 
 ## Check passing an invalid filename generates an error
 # RUN: not llvm-objcopy %t.o --ignore-symbols=no_file 2>&1 | \
-# RUN:   FileCheck %s --check-prefix=FILE
-# FILE: error: 'no_file': No such file or directory
+# RUN:   FileCheck %s --check-prefix=FILE -DMSG=%errc_ENOENT
+# FILE: error: 'no_file': [[MSG]]
 
 !ELF
 FileHeader:

>From e25e5f21af9688583a012aefe027bfa826927910 Mon Sep 17 00:00:00 2001
From: Ilia Kuklin <ikuklin at accesssoftek.com>
Date: Thu, 15 Feb 2024 21:50:31 +0500
Subject: [PATCH 07/20] Use a wildcard instead of a regex in one of the test
 cases

---
 llvm/test/tools/llvm-objcopy/ELF/ignore-symbols.test | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/llvm/test/tools/llvm-objcopy/ELF/ignore-symbols.test b/llvm/test/tools/llvm-objcopy/ELF/ignore-symbols.test
index 47bf190c9c2d1f..738f20c452292f 100644
--- a/llvm/test/tools/llvm-objcopy/ELF/ignore-symbols.test
+++ b/llvm/test/tools/llvm-objcopy/ELF/ignore-symbols.test
@@ -25,7 +25,7 @@
 # RS-SYMS-DAG: foo3
 
 ## Check --ignore-symbol functionality when changing symbol names
-# RUN: llvm-objcopy %t.o %t4.o --redefine-sym=foo1=bar1 --ignore-symbol=fo.* --regex
+# RUN: llvm-objcopy %t.o %t4.o --redefine-sym=foo1=bar1 --ignore-symbol=fo* --wildcard
 # RUN: llvm-readelf -s %t4.o | FileCheck %s --check-prefix=RS-SYM
 # RS-SYM-DAG: foo1
 # RS-SYM-DAG: foo2

>From 151029c2f759f384c5b8cead053cf961282ef158 Mon Sep 17 00:00:00 2001
From: Ilia Kuklin <ikuklin at accesssoftek.com>
Date: Sat, 17 Feb 2024 00:31:43 +0500
Subject: [PATCH 08/20] Adjust test formatting

---
 .../ELF/ignore-symbols-check-errors.test             | 12 ++++++------
 llvm/test/tools/llvm-objcopy/ELF/ignore-symbols.test |  8 ++++----
 2 files changed, 10 insertions(+), 10 deletions(-)

diff --git a/llvm/test/tools/llvm-objcopy/ELF/ignore-symbols-check-errors.test b/llvm/test/tools/llvm-objcopy/ELF/ignore-symbols-check-errors.test
index 23ef3d46c1b91b..3cf34c6c1c59e9 100644
--- a/llvm/test/tools/llvm-objcopy/ELF/ignore-symbols-check-errors.test
+++ b/llvm/test/tools/llvm-objcopy/ELF/ignore-symbols-check-errors.test
@@ -1,6 +1,6 @@
 # RUN: yaml2obj %s -o %t.o
 
-## Check that using an invalid symbol pattern generates an error
+## Check that using an invalid symbol pattern generates an error.
 # RUN: echo '*.' > %t.symbols.regex
 # RUN: not llvm-objcopy %t.o --ignore-symbols=%t.symbols.regex --regex 2>&1 | \
 # RUN:   FileCheck %s --check-prefix=SYMBOL
@@ -8,14 +8,14 @@
 # RUN:   FileCheck %s --check-prefix=SYMBOL
 # SYMBOL: error: cannot compile regular expression '*.': repetition-operator operand invalid
 
-## Check passing an invalid filename generates an error
+## Check passing an invalid filename generates an error.
 # RUN: not llvm-objcopy %t.o --ignore-symbols=no_file 2>&1 | \
 # RUN:   FileCheck %s --check-prefix=FILE -DMSG=%errc_ENOENT
 # FILE: error: 'no_file': [[MSG]]
 
 !ELF
 FileHeader:
-  Class:           ELFCLASS64
-  Data:            ELFDATA2LSB
-  Type:            ET_REL
-  Machine:         EM_X86_64
+  Class:   ELFCLASS64
+  Data:    ELFDATA2LSB
+  Type:    ET_REL
+  Machine: EM_X86_64
diff --git a/llvm/test/tools/llvm-objcopy/ELF/ignore-symbols.test b/llvm/test/tools/llvm-objcopy/ELF/ignore-symbols.test
index 738f20c452292f..6403b7cfe6e86f 100644
--- a/llvm/test/tools/llvm-objcopy/ELF/ignore-symbols.test
+++ b/llvm/test/tools/llvm-objcopy/ELF/ignore-symbols.test
@@ -1,21 +1,21 @@
 # RUN: yaml2obj %s -o %t.o
 # RUN: echo 'foo[2-3]' > %t.ignore.regex
 
-## Check --ignore-symbols functionality when changing symbol bindings
+## Check --ignore-symbols functionality when changing symbol bindings.
 # RUN: llvm-objcopy %t.o %t1.o --localize-hidden --ignore-symbols=%t.ignore.regex --regex
 # RUN: llvm-readelf -s %t1.o | FileCheck %s --check-prefix=LH-SYMS
 # LH-SYMS-DAG: LOCAL  HIDDEN      1 foo1
 # LH-SYMS-DAG: GLOBAL HIDDEN      1 foo2
 # LH-SYMS-DAG: GLOBAL HIDDEN      1 foo3
 
-## Check --ignore-symbol functionality when changing symbol bindings
+## Check --ignore-symbol functionality when changing symbol bindings.
 # RUN: llvm-objcopy %t.o %t2.o --localize-hidden --ignore-symbol=foo3
 # RUN: llvm-readelf -s %t2.o | FileCheck %s --check-prefix=LH-SYM
 # LH-SYM-DAG: LOCAL  HIDDEN      1 foo1
 # LH-SYM-DAG: LOCAL  HIDDEN      1 foo2
 # LH-SYM-DAG: GLOBAL HIDDEN      1 foo3
 
-## Check --ignore-symbols functionality when changing symbol names
+## Check --ignore-symbols functionality when changing symbol names.
 # RUN: echo -e "foo1 bar1\nfoo2 bar2" > %t.renames.list
 # RUN: llvm-objcopy %t.o %t3.o --redefine-syms=%t.renames.list \
 # RUN:   --ignore-symbols=%t.ignore.regex --regex
@@ -24,7 +24,7 @@
 # RS-SYMS-DAG: foo2
 # RS-SYMS-DAG: foo3
 
-## Check --ignore-symbol functionality when changing symbol names
+## Check --ignore-symbol functionality when changing symbol names.
 # RUN: llvm-objcopy %t.o %t4.o --redefine-sym=foo1=bar1 --ignore-symbol=fo* --wildcard
 # RUN: llvm-readelf -s %t4.o | FileCheck %s --check-prefix=RS-SYM
 # RS-SYM-DAG: foo1

>From 7f65088a713d6864c0ec85bacbccfd586535b348 Mon Sep 17 00:00:00 2001
From: Ilia Kuklin <ikuklin at accesssoftek.com>
Date: Wed, 28 Feb 2024 00:26:43 +0500
Subject: [PATCH 09/20] Rename the options to --skip-symbols(s)

---
 llvm/docs/CommandGuide/llvm-objcopy.rst       | 24 +++++++++----------
 llvm/include/llvm/ObjCopy/ELF/ELFConfig.h     |  2 +-
 llvm/lib/ObjCopy/ELF/ELFObjcopy.cpp           |  2 +-
 ...rs.test => skip-symbols-check-errors.test} |  6 ++---
 ...{ignore-symbols.test => skip-symbols.test} | 18 +++++++-------
 llvm/tools/llvm-objcopy/ObjcopyOptions.cpp    |  8 +++----
 llvm/tools/llvm-objcopy/ObjcopyOpts.td        | 10 ++++----
 7 files changed, 35 insertions(+), 35 deletions(-)
 rename llvm/test/tools/llvm-objcopy/ELF/{ignore-symbols-check-errors.test => skip-symbols-check-errors.test} (73%)
 rename llvm/test/tools/llvm-objcopy/ELF/{ignore-symbols.test => skip-symbols.test} (66%)

diff --git a/llvm/docs/CommandGuide/llvm-objcopy.rst b/llvm/docs/CommandGuide/llvm-objcopy.rst
index 9193296c3dfbbc..cbf16c174304be 100644
--- a/llvm/docs/CommandGuide/llvm-objcopy.rst
+++ b/llvm/docs/CommandGuide/llvm-objcopy.rst
@@ -346,18 +346,6 @@ them.
  symbol, with leading and trailing whitespace ignored, as is anything following
  a '#'. Can be specified multiple times to read names from multiple files.
 
-.. option:: --ignore-symbol <symbol>
-
- Do not change parameters of symbol <symbol> when executing other options that
- can change the symbol's name, binding or visibility
-
-.. option:: --ignore-symbols <filename>
-
- Reads a list of symbols from <filename> and runs as if --ignore-symbol=<symbol>
- is set for each one. <filename> contains one symbol per line and may contain
- comments beginning with '#'. Leading and trailing whitespace is stripped from
- each line. May be repeated to read symbols from many files.
-
 .. option:: --input-target <format>, -I
 
  Read the input as the specified format. See `SUPPORTED FORMATS`_ for a list of
@@ -476,6 +464,18 @@ them.
  Read a list of symbols from <filename> and change their visibility to the
  specified value. Visibility values: default, internal, hidden, protected.
 
+.. option:: --skip-symbol <symbol>
+
+ Do not change parameters of symbol <symbol> when executing other options that
+ can change the symbol's name, binding or visibility
+
+.. option:: --skip-symbols <filename>
+
+ Read a list of symbols from <filename> and run as if --skip-symbol=<symbol>
+ is set for each one. <filename> contains one symbol per line and may contain
+ comments beginning with '#'. Leading and trailing whitespace is stripped from
+ each line. May be repeated to read symbols from many files.
+
 .. option:: --split-dwo <dwo-file>
 
  Equivalent to running :program:`llvm-objcopy` with :option:`--extract-dwo` and
diff --git a/llvm/include/llvm/ObjCopy/ELF/ELFConfig.h b/llvm/include/llvm/ObjCopy/ELF/ELFConfig.h
index ee0673a6961f11..6e1119699ca6bc 100644
--- a/llvm/include/llvm/ObjCopy/ELF/ELFConfig.h
+++ b/llvm/include/llvm/ObjCopy/ELF/ELFConfig.h
@@ -19,7 +19,7 @@ namespace objcopy {
 struct ELFConfig {
   uint8_t NewSymbolVisibility = (uint8_t)ELF::STV_DEFAULT;
 
-  NameMatcher SymbolsToIgnore;
+  NameMatcher SymbolsToSkip;
   std::vector<std::pair<NameMatcher, uint8_t>> SymbolsToSetVisibility;
 
   // ELF entry point address expression. The input parameter is an entry point
diff --git a/llvm/lib/ObjCopy/ELF/ELFObjcopy.cpp b/llvm/lib/ObjCopy/ELF/ELFObjcopy.cpp
index ceb76c2a8bbe69..92cc8b53360821 100644
--- a/llvm/lib/ObjCopy/ELF/ELFObjcopy.cpp
+++ b/llvm/lib/ObjCopy/ELF/ELFObjcopy.cpp
@@ -291,7 +291,7 @@ static Error updateAndRemoveSymbols(const CommonConfig &Config,
     return Error::success();
 
   Obj.SymbolTable->updateSymbols([&](Symbol &Sym) {
-    if (ELFConfig.SymbolsToIgnore.matches(Sym.Name))
+    if (ELFConfig.SymbolsToSkip.matches(Sym.Name))
       return;
     // Common and undefined symbols don't make sense as local symbols, and can
     // even cause crashes if we localize those, so skip them.
diff --git a/llvm/test/tools/llvm-objcopy/ELF/ignore-symbols-check-errors.test b/llvm/test/tools/llvm-objcopy/ELF/skip-symbols-check-errors.test
similarity index 73%
rename from llvm/test/tools/llvm-objcopy/ELF/ignore-symbols-check-errors.test
rename to llvm/test/tools/llvm-objcopy/ELF/skip-symbols-check-errors.test
index 3cf34c6c1c59e9..db55346f2d97c0 100644
--- a/llvm/test/tools/llvm-objcopy/ELF/ignore-symbols-check-errors.test
+++ b/llvm/test/tools/llvm-objcopy/ELF/skip-symbols-check-errors.test
@@ -2,14 +2,14 @@
 
 ## Check that using an invalid symbol pattern generates an error.
 # RUN: echo '*.' > %t.symbols.regex
-# RUN: not llvm-objcopy %t.o --ignore-symbols=%t.symbols.regex --regex 2>&1 | \
+# RUN: not llvm-objcopy %t.o --skip-symbols=%t.symbols.regex --regex 2>&1 | \
 # RUN:   FileCheck %s --check-prefix=SYMBOL
-# RUN: not llvm-objcopy %t.o --ignore-symbol=*. --regex 2>&1 | \
+# RUN: not llvm-objcopy %t.o --skip-symbol=*. --regex 2>&1 | \
 # RUN:   FileCheck %s --check-prefix=SYMBOL
 # SYMBOL: error: cannot compile regular expression '*.': repetition-operator operand invalid
 
 ## Check passing an invalid filename generates an error.
-# RUN: not llvm-objcopy %t.o --ignore-symbols=no_file 2>&1 | \
+# RUN: not llvm-objcopy %t.o --skip-symbols=no_file 2>&1 | \
 # RUN:   FileCheck %s --check-prefix=FILE -DMSG=%errc_ENOENT
 # FILE: error: 'no_file': [[MSG]]
 
diff --git a/llvm/test/tools/llvm-objcopy/ELF/ignore-symbols.test b/llvm/test/tools/llvm-objcopy/ELF/skip-symbols.test
similarity index 66%
rename from llvm/test/tools/llvm-objcopy/ELF/ignore-symbols.test
rename to llvm/test/tools/llvm-objcopy/ELF/skip-symbols.test
index 6403b7cfe6e86f..24a118f3f88f37 100644
--- a/llvm/test/tools/llvm-objcopy/ELF/ignore-symbols.test
+++ b/llvm/test/tools/llvm-objcopy/ELF/skip-symbols.test
@@ -1,31 +1,31 @@
 # RUN: yaml2obj %s -o %t.o
-# RUN: echo 'foo[2-3]' > %t.ignore.regex
+# RUN: echo 'foo[2-3]' > %t.skip.regex
 
-## Check --ignore-symbols functionality when changing symbol bindings.
-# RUN: llvm-objcopy %t.o %t1.o --localize-hidden --ignore-symbols=%t.ignore.regex --regex
+## Check --skip-symbols functionality when changing symbol bindings.
+# RUN: llvm-objcopy %t.o %t1.o --localize-hidden --skip-symbols=%t.skip.regex --regex
 # RUN: llvm-readelf -s %t1.o | FileCheck %s --check-prefix=LH-SYMS
 # LH-SYMS-DAG: LOCAL  HIDDEN      1 foo1
 # LH-SYMS-DAG: GLOBAL HIDDEN      1 foo2
 # LH-SYMS-DAG: GLOBAL HIDDEN      1 foo3
 
-## Check --ignore-symbol functionality when changing symbol bindings.
-# RUN: llvm-objcopy %t.o %t2.o --localize-hidden --ignore-symbol=foo3
+## Check --skip-symbol functionality when changing symbol bindings.
+# RUN: llvm-objcopy %t.o %t2.o --localize-hidden --skip-symbol=foo3
 # RUN: llvm-readelf -s %t2.o | FileCheck %s --check-prefix=LH-SYM
 # LH-SYM-DAG: LOCAL  HIDDEN      1 foo1
 # LH-SYM-DAG: LOCAL  HIDDEN      1 foo2
 # LH-SYM-DAG: GLOBAL HIDDEN      1 foo3
 
-## Check --ignore-symbols functionality when changing symbol names.
+## Check --skip-symbols functionality when changing symbol names.
 # RUN: echo -e "foo1 bar1\nfoo2 bar2" > %t.renames.list
 # RUN: llvm-objcopy %t.o %t3.o --redefine-syms=%t.renames.list \
-# RUN:   --ignore-symbols=%t.ignore.regex --regex
+# RUN:   --skip-symbols=%t.skip.regex --regex
 # RUN: llvm-readelf -s %t3.o | FileCheck %s --check-prefix=RS-SYMS
 # RS-SYMS-DAG: bar1
 # RS-SYMS-DAG: foo2
 # RS-SYMS-DAG: foo3
 
-## Check --ignore-symbol functionality when changing symbol names.
-# RUN: llvm-objcopy %t.o %t4.o --redefine-sym=foo1=bar1 --ignore-symbol=fo* --wildcard
+## Check --skip-symbol functionality when changing symbol names.
+# RUN: llvm-objcopy %t.o %t4.o --redefine-sym=foo1=bar1 --skip-symbol=fo* --wildcard
 # RUN: llvm-readelf -s %t4.o | FileCheck %s --check-prefix=RS-SYM
 # RS-SYM-DAG: foo1
 # RS-SYM-DAG: foo2
diff --git a/llvm/tools/llvm-objcopy/ObjcopyOptions.cpp b/llvm/tools/llvm-objcopy/ObjcopyOptions.cpp
index ff912d0f39b199..0268e4b22deed3 100644
--- a/llvm/tools/llvm-objcopy/ObjcopyOptions.cpp
+++ b/llvm/tools/llvm-objcopy/ObjcopyOptions.cpp
@@ -978,12 +978,12 @@ objcopy::parseObjcopyOptions(ArrayRef<const char *> RawArgsArr,
             addSymbolsFromFile(Config.SymbolsToKeep, DC.Alloc, Arg->getValue(),
                                SymbolMatchStyle, ErrorCallback))
       return std::move(E);
-  for (auto *Arg : InputArgs.filtered(OBJCOPY_ignore_symbol))
-    if (Error E = ELFConfig.SymbolsToIgnore.addMatcher(NameOrPattern::create(
+  for (auto *Arg : InputArgs.filtered(OBJCOPY_skip_symbol))
+    if (Error E = ELFConfig.SymbolsToSkip.addMatcher(NameOrPattern::create(
             Arg->getValue(), SymbolMatchStyle, ErrorCallback)))
       return std::move(E);
-  for (auto *Arg : InputArgs.filtered(OBJCOPY_ignore_symbols))
-    if (Error E = addSymbolsFromFile(ELFConfig.SymbolsToIgnore, DC.Alloc,
+  for (auto *Arg : InputArgs.filtered(OBJCOPY_skip_symbols))
+    if (Error E = addSymbolsFromFile(ELFConfig.SymbolsToSkip, DC.Alloc,
                                      Arg->getValue(), SymbolMatchStyle,
                                      ErrorCallback))
       return std::move(E);
diff --git a/llvm/tools/llvm-objcopy/ObjcopyOpts.td b/llvm/tools/llvm-objcopy/ObjcopyOpts.td
index fccfaaecc45cef..be02616e8c68e3 100644
--- a/llvm/tools/llvm-objcopy/ObjcopyOpts.td
+++ b/llvm/tools/llvm-objcopy/ObjcopyOpts.td
@@ -206,15 +206,15 @@ defm keep_symbols
          "be repeated to read symbols from many files">,
       MetaVarName<"filename">;
 
-defm ignore_symbol : Eq<"ignore-symbol", "Do not change parameters of symbol <symbol> "
+defm skip_symbol : Eq<"skip-symbol", "Do not change parameters of symbol <symbol> "
                         "when executing other options that can change the symbol's "
                         "name, binding or visibility">,
                      MetaVarName<"symbol">;
 
-defm ignore_symbols
-    : Eq<"ignore-symbols",
-         "Reads a list of symbols from <filename> and runs as if "
-         "--ignore-symbol=<symbol> is set for each one. <filename> "
+defm skip_symbols
+    : Eq<"skip-symbols",
+         "Read a list of symbols from <filename> and run as if "
+         "--skip-symbol=<symbol> is set for each one. <filename> "
          "contains one symbol per line and may contain comments beginning with "
          "'#'. Leading and trailing whitespace is stripped from each line. May "
          "be repeated to read symbols from many files">,

>From 55d3fd8f12cfb41b672ac5570ee5cc4f2707ce49 Mon Sep 17 00:00:00 2001
From: Ilia Kuklin <ikuklin at accesssoftek.com>
Date: Wed, 28 Feb 2024 00:29:04 +0500
Subject: [PATCH 10/20] Merge tests into one file

---
 .../ELF/skip-symbols-check-errors.test        | 21 -------------------
 .../tools/llvm-objcopy/ELF/skip-symbols.test  | 15 ++++++++++++-
 2 files changed, 14 insertions(+), 22 deletions(-)
 delete mode 100644 llvm/test/tools/llvm-objcopy/ELF/skip-symbols-check-errors.test

diff --git a/llvm/test/tools/llvm-objcopy/ELF/skip-symbols-check-errors.test b/llvm/test/tools/llvm-objcopy/ELF/skip-symbols-check-errors.test
deleted file mode 100644
index db55346f2d97c0..00000000000000
--- a/llvm/test/tools/llvm-objcopy/ELF/skip-symbols-check-errors.test
+++ /dev/null
@@ -1,21 +0,0 @@
-# RUN: yaml2obj %s -o %t.o
-
-## Check that using an invalid symbol pattern generates an error.
-# RUN: echo '*.' > %t.symbols.regex
-# RUN: not llvm-objcopy %t.o --skip-symbols=%t.symbols.regex --regex 2>&1 | \
-# RUN:   FileCheck %s --check-prefix=SYMBOL
-# RUN: not llvm-objcopy %t.o --skip-symbol=*. --regex 2>&1 | \
-# RUN:   FileCheck %s --check-prefix=SYMBOL
-# SYMBOL: error: cannot compile regular expression '*.': repetition-operator operand invalid
-
-## Check passing an invalid filename generates an error.
-# RUN: not llvm-objcopy %t.o --skip-symbols=no_file 2>&1 | \
-# RUN:   FileCheck %s --check-prefix=FILE -DMSG=%errc_ENOENT
-# FILE: error: 'no_file': [[MSG]]
-
-!ELF
-FileHeader:
-  Class:   ELFCLASS64
-  Data:    ELFDATA2LSB
-  Type:    ET_REL
-  Machine: EM_X86_64
diff --git a/llvm/test/tools/llvm-objcopy/ELF/skip-symbols.test b/llvm/test/tools/llvm-objcopy/ELF/skip-symbols.test
index 24a118f3f88f37..a3e6cd99c0e0ed 100644
--- a/llvm/test/tools/llvm-objcopy/ELF/skip-symbols.test
+++ b/llvm/test/tools/llvm-objcopy/ELF/skip-symbols.test
@@ -25,12 +25,25 @@
 # RS-SYMS-DAG: foo3
 
 ## Check --skip-symbol functionality when changing symbol names.
-# RUN: llvm-objcopy %t.o %t4.o --redefine-sym=foo1=bar1 --skip-symbol=fo* --wildcard
+# RUN: llvm-objcopy %t.o %t4.o --redefine-sym=foo1=bar1 --skip-symbol='fo*' --wildcard
 # RUN: llvm-readelf -s %t4.o | FileCheck %s --check-prefix=RS-SYM
 # RS-SYM-DAG: foo1
 # RS-SYM-DAG: foo2
 # RS-SYM-DAG: foo3
 
+## Check that using an invalid symbol pattern generates an error.
+# RUN: echo '*.' > %t.symbols.regex
+# RUN: not llvm-objcopy %t.o --skip-symbols=%t.symbols.regex --regex 2>&1 | \
+# RUN:   FileCheck %s --check-prefix=SYMBOL
+# RUN: not llvm-objcopy %t.o --skip-symbol='*.' --regex 2>&1 | \
+# RUN:   FileCheck %s --check-prefix=SYMBOL
+# SYMBOL: error: cannot compile regular expression '*.': repetition-operator operand invalid
+
+## Check passing an invalid filename generates an error.
+# RUN: not llvm-objcopy %t.o --skip-symbols=no_file 2>&1 | \
+# RUN:   FileCheck %s --check-prefix=FILE -DMSG=%errc_ENOENT
+# FILE: error: 'no_file': [[MSG]]
+
 !ELF
 FileHeader:
   Class:   ELFCLASS64

>From 4006d11885f7b0eb44056b428309a36484903c94 Mon Sep 17 00:00:00 2001
From: Ilia Kuklin <ikuklin at accesssoftek.com>
Date: Wed, 28 Feb 2024 00:35:18 +0500
Subject: [PATCH 11/20] Added the options to release notes

---
 llvm/docs/ReleaseNotes.rst | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/llvm/docs/ReleaseNotes.rst b/llvm/docs/ReleaseNotes.rst
index 254f76d9e5148b..56d45d5b0504ef 100644
--- a/llvm/docs/ReleaseNotes.rst
+++ b/llvm/docs/ReleaseNotes.rst
@@ -174,6 +174,10 @@ Changes to the LLVM tools
   ``--set-symbols-visibility`` options for ELF input to change the
   visibility of symbols.
 
+* llvm-objcopy now supports ``--skip-symbol`` and ``--skip-symbols`` options
+  for ELF input to skip the specified symbols when executing other options
+  that can change a symbol's name, binding or visibility.
+
 Changes to LLDB
 ---------------------------------
 

>From 10f6e33f58c950fca3097e7b8294ea9c5ab082c5 Mon Sep 17 00:00:00 2001
From: Ilia Kuklin <ikuklin at accesssoftek.com>
Date: Wed, 28 Feb 2024 21:44:18 +0500
Subject: [PATCH 12/20] Address nits

---
 llvm/docs/CommandGuide/llvm-objcopy.rst | 2 +-
 llvm/lib/ObjCopy/ELF/ELFObjcopy.cpp     | 1 +
 2 files changed, 2 insertions(+), 1 deletion(-)

diff --git a/llvm/docs/CommandGuide/llvm-objcopy.rst b/llvm/docs/CommandGuide/llvm-objcopy.rst
index cbf16c174304be..e8b3c1415127f5 100644
--- a/llvm/docs/CommandGuide/llvm-objcopy.rst
+++ b/llvm/docs/CommandGuide/llvm-objcopy.rst
@@ -467,7 +467,7 @@ them.
 .. option:: --skip-symbol <symbol>
 
  Do not change parameters of symbol <symbol> when executing other options that
- can change the symbol's name, binding or visibility
+ can change the symbol's name, binding or visibility.
 
 .. option:: --skip-symbols <filename>
 
diff --git a/llvm/lib/ObjCopy/ELF/ELFObjcopy.cpp b/llvm/lib/ObjCopy/ELF/ELFObjcopy.cpp
index 92cc8b53360821..f91d02a83b902f 100644
--- a/llvm/lib/ObjCopy/ELF/ELFObjcopy.cpp
+++ b/llvm/lib/ObjCopy/ELF/ELFObjcopy.cpp
@@ -293,6 +293,7 @@ static Error updateAndRemoveSymbols(const CommonConfig &Config,
   Obj.SymbolTable->updateSymbols([&](Symbol &Sym) {
     if (ELFConfig.SymbolsToSkip.matches(Sym.Name))
       return;
+
     // Common and undefined symbols don't make sense as local symbols, and can
     // even cause crashes if we localize those, so skip them.
     if (!Sym.isCommon() && Sym.getShndx() != SHN_UNDEF &&

>From da81eb3644b1640f34b412d82971ba0427aca77a Mon Sep 17 00:00:00 2001
From: Ilia Kuklin <ikuklin at accesssoftek.com>
Date: Wed, 28 Feb 2024 22:28:36 +0500
Subject: [PATCH 13/20] Move the option to common config and add checks in
 config manager

---
 llvm/include/llvm/ObjCopy/CommonConfig.h   | 1 +
 llvm/include/llvm/ObjCopy/ELF/ELFConfig.h  | 1 -
 llvm/lib/ObjCopy/ConfigManager.cpp         | 8 ++++----
 llvm/lib/ObjCopy/ELF/ELFObjcopy.cpp        | 2 +-
 llvm/tools/llvm-objcopy/ObjcopyOptions.cpp | 8 ++++----
 5 files changed, 10 insertions(+), 10 deletions(-)

diff --git a/llvm/include/llvm/ObjCopy/CommonConfig.h b/llvm/include/llvm/ObjCopy/CommonConfig.h
index 8f69c9fbeaf5ef..9d6d5fb23b18e7 100644
--- a/llvm/include/llvm/ObjCopy/CommonConfig.h
+++ b/llvm/include/llvm/ObjCopy/CommonConfig.h
@@ -233,6 +233,7 @@ struct CommonConfig {
   NameMatcher UnneededSymbolsToRemove;
   NameMatcher SymbolsToWeaken;
   NameMatcher SymbolsToKeepGlobal;
+  NameMatcher SymbolsToSkip;
 
   // Map options
   StringMap<SectionRename> SectionsToRename;
diff --git a/llvm/include/llvm/ObjCopy/ELF/ELFConfig.h b/llvm/include/llvm/ObjCopy/ELF/ELFConfig.h
index 6e1119699ca6bc..eafed92516c7df 100644
--- a/llvm/include/llvm/ObjCopy/ELF/ELFConfig.h
+++ b/llvm/include/llvm/ObjCopy/ELF/ELFConfig.h
@@ -19,7 +19,6 @@ namespace objcopy {
 struct ELFConfig {
   uint8_t NewSymbolVisibility = (uint8_t)ELF::STV_DEFAULT;
 
-  NameMatcher SymbolsToSkip;
   std::vector<std::pair<NameMatcher, uint8_t>> SymbolsToSetVisibility;
 
   // ELF entry point address expression. The input parameter is an entry point
diff --git a/llvm/lib/ObjCopy/ConfigManager.cpp b/llvm/lib/ObjCopy/ConfigManager.cpp
index e46b595a56dc44..6442f1b958fb4d 100644
--- a/llvm/lib/ObjCopy/ConfigManager.cpp
+++ b/llvm/lib/ObjCopy/ConfigManager.cpp
@@ -15,7 +15,7 @@ namespace objcopy {
 
 Expected<const COFFConfig &> ConfigManager::getCOFFConfig() const {
   if (!Common.SplitDWO.empty() || !Common.SymbolsPrefix.empty() ||
-      !Common.SymbolsPrefixRemove.empty() ||
+      !Common.SymbolsPrefixRemove.empty() || !Common.SymbolsToSkip.empty() ||
       !Common.AllocSectionsPrefix.empty() || !Common.KeepSection.empty() ||
       !Common.SymbolsToGlobalize.empty() || !Common.SymbolsToKeep.empty() ||
       !Common.SymbolsToLocalize.empty() || !Common.SymbolsToWeaken.empty() ||
@@ -34,7 +34,7 @@ Expected<const COFFConfig &> ConfigManager::getCOFFConfig() const {
 
 Expected<const MachOConfig &> ConfigManager::getMachOConfig() const {
   if (!Common.SplitDWO.empty() || !Common.SymbolsPrefix.empty() ||
-      !Common.SymbolsPrefixRemove.empty() ||
+      !Common.SymbolsPrefixRemove.empty() || !Common.SymbolsToSkip.empty() ||
       !Common.AllocSectionsPrefix.empty() || !Common.KeepSection.empty() ||
       !Common.SymbolsToGlobalize.empty() || !Common.SymbolsToKeep.empty() ||
       !Common.SymbolsToLocalize.empty() ||
@@ -56,7 +56,7 @@ Expected<const MachOConfig &> ConfigManager::getMachOConfig() const {
 Expected<const WasmConfig &> ConfigManager::getWasmConfig() const {
   if (!Common.AddGnuDebugLink.empty() || Common.ExtractPartition ||
       !Common.SplitDWO.empty() || !Common.SymbolsPrefix.empty() ||
-      !Common.SymbolsPrefixRemove.empty() ||
+      !Common.SymbolsPrefixRemove.empty() || !Common.SymbolsToSkip.empty() ||
       !Common.AllocSectionsPrefix.empty() ||
       Common.DiscardMode != DiscardType::None || !Common.SymbolsToAdd.empty() ||
       !Common.SymbolsToGlobalize.empty() || !Common.SymbolsToLocalize.empty() ||
@@ -77,7 +77,7 @@ Expected<const WasmConfig &> ConfigManager::getWasmConfig() const {
 Expected<const XCOFFConfig &> ConfigManager::getXCOFFConfig() const {
   if (!Common.AddGnuDebugLink.empty() || Common.ExtractPartition ||
       !Common.SplitDWO.empty() || !Common.SymbolsPrefix.empty() ||
-      !Common.SymbolsPrefixRemove.empty() ||
+      !Common.SymbolsPrefixRemove.empty() || !Common.SymbolsToSkip.empty() ||
       !Common.AllocSectionsPrefix.empty() ||
       Common.DiscardMode != DiscardType::None || !Common.AddSection.empty() ||
       !Common.DumpSection.empty() || !Common.SymbolsToAdd.empty() ||
diff --git a/llvm/lib/ObjCopy/ELF/ELFObjcopy.cpp b/llvm/lib/ObjCopy/ELF/ELFObjcopy.cpp
index f91d02a83b902f..205bc1ef5b1a19 100644
--- a/llvm/lib/ObjCopy/ELF/ELFObjcopy.cpp
+++ b/llvm/lib/ObjCopy/ELF/ELFObjcopy.cpp
@@ -291,7 +291,7 @@ static Error updateAndRemoveSymbols(const CommonConfig &Config,
     return Error::success();
 
   Obj.SymbolTable->updateSymbols([&](Symbol &Sym) {
-    if (ELFConfig.SymbolsToSkip.matches(Sym.Name))
+    if (Config.SymbolsToSkip.matches(Sym.Name))
       return;
 
     // Common and undefined symbols don't make sense as local symbols, and can
diff --git a/llvm/tools/llvm-objcopy/ObjcopyOptions.cpp b/llvm/tools/llvm-objcopy/ObjcopyOptions.cpp
index 0268e4b22deed3..7269c51a08d6b5 100644
--- a/llvm/tools/llvm-objcopy/ObjcopyOptions.cpp
+++ b/llvm/tools/llvm-objcopy/ObjcopyOptions.cpp
@@ -979,13 +979,13 @@ objcopy::parseObjcopyOptions(ArrayRef<const char *> RawArgsArr,
                                SymbolMatchStyle, ErrorCallback))
       return std::move(E);
   for (auto *Arg : InputArgs.filtered(OBJCOPY_skip_symbol))
-    if (Error E = ELFConfig.SymbolsToSkip.addMatcher(NameOrPattern::create(
+    if (Error E = Config.SymbolsToSkip.addMatcher(NameOrPattern::create(
             Arg->getValue(), SymbolMatchStyle, ErrorCallback)))
       return std::move(E);
   for (auto *Arg : InputArgs.filtered(OBJCOPY_skip_symbols))
-    if (Error E = addSymbolsFromFile(ELFConfig.SymbolsToSkip, DC.Alloc,
-                                     Arg->getValue(), SymbolMatchStyle,
-                                     ErrorCallback))
+    if (Error E =
+            addSymbolsFromFile(Config.SymbolsToSkip, DC.Alloc, Arg->getValue(),
+                               SymbolMatchStyle, ErrorCallback))
       return std::move(E);
   for (auto *Arg : InputArgs.filtered(OBJCOPY_add_symbol)) {
     Expected<NewSymbolInfo> SymInfo = parseNewSymbolInfo(Arg->getValue());

>From 6dd013581d41770c63bb20d7ce6436ddd1caa268 Mon Sep 17 00:00:00 2001
From: Ilia Kuklin <ikuklin at accesssoftek.com>
Date: Wed, 28 Feb 2024 22:43:28 +0500
Subject: [PATCH 14/20] Add a test to check both multiple uses and order with
 --set-symbol-visibility

---
 llvm/test/tools/llvm-objcopy/ELF/skip-symbols.test | 10 ++++++++++
 1 file changed, 10 insertions(+)

diff --git a/llvm/test/tools/llvm-objcopy/ELF/skip-symbols.test b/llvm/test/tools/llvm-objcopy/ELF/skip-symbols.test
index a3e6cd99c0e0ed..1728af797be1a5 100644
--- a/llvm/test/tools/llvm-objcopy/ELF/skip-symbols.test
+++ b/llvm/test/tools/llvm-objcopy/ELF/skip-symbols.test
@@ -31,6 +31,16 @@
 # RS-SYM-DAG: foo2
 # RS-SYM-DAG: foo3
 
+## Check the functionality when using skip options multiple times.
+# RUN: echo "foo3" > %t.symbol.list
+# RUN: llvm-objcopy %t.o %t5.o --set-symbol-visibility='foo*'=internal --wildcard \
+# RUN:   --skip-symbol=foo1 --skip-symbol=foo2 --skip-symbols=%t.symbol.list
+# RUN: llvm-readelf -s %t5.o | FileCheck %s --check-prefix=BOTH
+## All the symbols are skipped
+# BOTH-DAG: GLOBAL HIDDEN      1 foo1
+# BOTH-DAG: GLOBAL HIDDEN      1 foo2
+# BOTH-DAG: GLOBAL HIDDEN      1 foo3
+
 ## Check that using an invalid symbol pattern generates an error.
 # RUN: echo '*.' > %t.symbols.regex
 # RUN: not llvm-objcopy %t.o --skip-symbols=%t.symbols.regex --regex 2>&1 | \

>From a80800394aef0785be5bd8141af152d58d00affa Mon Sep 17 00:00:00 2001
From: Ilia Kuklin <ikuklin at accesssoftek.com>
Date: Tue, 19 Mar 2024 22:02:15 +0500
Subject: [PATCH 15/20] Rename skip-symbols.test

---
 .../llvm-objcopy/ELF/{skip-symbols.test => skip-symbol.test}      | 0
 1 file changed, 0 insertions(+), 0 deletions(-)
 rename llvm/test/tools/llvm-objcopy/ELF/{skip-symbols.test => skip-symbol.test} (100%)

diff --git a/llvm/test/tools/llvm-objcopy/ELF/skip-symbols.test b/llvm/test/tools/llvm-objcopy/ELF/skip-symbol.test
similarity index 100%
rename from llvm/test/tools/llvm-objcopy/ELF/skip-symbols.test
rename to llvm/test/tools/llvm-objcopy/ELF/skip-symbol.test

>From a470b13d7355c61a55e4fea05da56ebda3ed4dbc Mon Sep 17 00:00:00 2001
From: Ilia Kuklin <ikuklin at accesssoftek.com>
Date: Tue, 19 Mar 2024 22:04:02 +0500
Subject: [PATCH 16/20] Adjust description and formatting

---
 .../tools/llvm-objcopy/ELF/skip-symbol.test   | 21 ++++++++++---------
 1 file changed, 11 insertions(+), 10 deletions(-)

diff --git a/llvm/test/tools/llvm-objcopy/ELF/skip-symbol.test b/llvm/test/tools/llvm-objcopy/ELF/skip-symbol.test
index 1728af797be1a5..35423b3e7bb465 100644
--- a/llvm/test/tools/llvm-objcopy/ELF/skip-symbol.test
+++ b/llvm/test/tools/llvm-objcopy/ELF/skip-symbol.test
@@ -1,3 +1,4 @@
+## This test checks the functionality of options --skip-symbol and --skip-symbols.
 # RUN: yaml2obj %s -o %t.o
 # RUN: echo 'foo[2-3]' > %t.skip.regex
 
@@ -36,12 +37,12 @@
 # RUN: llvm-objcopy %t.o %t5.o --set-symbol-visibility='foo*'=internal --wildcard \
 # RUN:   --skip-symbol=foo1 --skip-symbol=foo2 --skip-symbols=%t.symbol.list
 # RUN: llvm-readelf -s %t5.o | FileCheck %s --check-prefix=BOTH
-## All the symbols are skipped
+## All the symbols are skipped.
 # BOTH-DAG: GLOBAL HIDDEN      1 foo1
 # BOTH-DAG: GLOBAL HIDDEN      1 foo2
 # BOTH-DAG: GLOBAL HIDDEN      1 foo3
 
-## Check that using an invalid symbol pattern generates an error.
+## Check that using an invalid symbol name regex generates an error.
 # RUN: echo '*.' > %t.symbols.regex
 # RUN: not llvm-objcopy %t.o --skip-symbols=%t.symbols.regex --regex 2>&1 | \
 # RUN:   FileCheck %s --check-prefix=SYMBOL
@@ -61,18 +62,18 @@ FileHeader:
   Type:    ET_REL
   Machine: EM_X86_64
 Sections:
-  - Name:  .text
-    Type:  SHT_PROGBITS
+  - Name: .text
+    Type: SHT_PROGBITS
 Symbols:
   - Name:    foo1
     Section: .text
-    Binding:  STB_GLOBAL
-    Other:    [ STV_HIDDEN ]
+    Binding: STB_GLOBAL
+    Other:   [ STV_HIDDEN ]
   - Name:    foo2
     Section: .text
-    Binding:  STB_GLOBAL
-    Other:    [ STV_HIDDEN ]
+    Binding: STB_GLOBAL
+    Other:   [ STV_HIDDEN ]
   - Name:    foo3
     Section: .text
-    Binding:  STB_GLOBAL
-    Other:    [ STV_HIDDEN ]
+    Binding: STB_GLOBAL
+    Other:   [ STV_HIDDEN ]

>From 251e820817b1db9547c0698c3ec5e9d23096a196 Mon Sep 17 00:00:00 2001
From: Ilia Kuklin <ikuklin at accesssoftek.com>
Date: Tue, 19 Mar 2024 22:24:28 +0500
Subject: [PATCH 17/20] Adjust the test to use multiple options and expand
 others to use more symbols

---
 .../tools/llvm-objcopy/ELF/skip-symbol.test   | 29 ++++++++++++++++---
 1 file changed, 25 insertions(+), 4 deletions(-)

diff --git a/llvm/test/tools/llvm-objcopy/ELF/skip-symbol.test b/llvm/test/tools/llvm-objcopy/ELF/skip-symbol.test
index 35423b3e7bb465..a1860a8cfbfa87 100644
--- a/llvm/test/tools/llvm-objcopy/ELF/skip-symbol.test
+++ b/llvm/test/tools/llvm-objcopy/ELF/skip-symbol.test
@@ -8,6 +8,8 @@
 # LH-SYMS-DAG: LOCAL  HIDDEN      1 foo1
 # LH-SYMS-DAG: GLOBAL HIDDEN      1 foo2
 # LH-SYMS-DAG: GLOBAL HIDDEN      1 foo3
+# LH-SYMS-DAG: LOCAL  HIDDEN      1 foo4
+# LH-SYMS-DAG: LOCAL  HIDDEN      1 foo5
 
 ## Check --skip-symbol functionality when changing symbol bindings.
 # RUN: llvm-objcopy %t.o %t2.o --localize-hidden --skip-symbol=foo3
@@ -15,6 +17,8 @@
 # LH-SYM-DAG: LOCAL  HIDDEN      1 foo1
 # LH-SYM-DAG: LOCAL  HIDDEN      1 foo2
 # LH-SYM-DAG: GLOBAL HIDDEN      1 foo3
+# LH-SYM-DAG: LOCAL  HIDDEN      1 foo4
+# LH-SYM-DAG: LOCAL  HIDDEN      1 foo5
 
 ## Check --skip-symbols functionality when changing symbol names.
 # RUN: echo -e "foo1 bar1\nfoo2 bar2" > %t.renames.list
@@ -24,23 +28,32 @@
 # RS-SYMS-DAG: bar1
 # RS-SYMS-DAG: foo2
 # RS-SYMS-DAG: foo3
+# RS-SYMS-DAG: foo4
+# RS-SYMS-DAG: foo5
 
 ## Check --skip-symbol functionality when changing symbol names.
-# RUN: llvm-objcopy %t.o %t4.o --redefine-sym=foo1=bar1 --skip-symbol='fo*' --wildcard
+# RUN: llvm-objcopy %t.o %t4.o --redefine-syms=%t.renames.list \
+# RUN:   --skip-symbol='fo*' --wildcard
 # RUN: llvm-readelf -s %t4.o | FileCheck %s --check-prefix=RS-SYM
 # RS-SYM-DAG: foo1
 # RS-SYM-DAG: foo2
 # RS-SYM-DAG: foo3
+# RS-SYM-DAG: foo4
+# RS-SYM-DAG: foo5
 
 ## Check the functionality when using skip options multiple times.
-# RUN: echo "foo3" > %t.symbol.list
+# RUN: echo "foo3" > %t.symbol0.list
+# RUN: echo "foo4" > %t.symbol1.list
 # RUN: llvm-objcopy %t.o %t5.o --set-symbol-visibility='foo*'=internal --wildcard \
-# RUN:   --skip-symbol=foo1 --skip-symbol=foo2 --skip-symbols=%t.symbol.list
+# RUN:   --skip-symbol=foo1 --skip-symbol=foo2 \
+# RUN:   --skip-symbols=%t.symbol0.list --skip-symbols=%t.symbol1.list
 # RUN: llvm-readelf -s %t5.o | FileCheck %s --check-prefix=BOTH
-## All the symbols are skipped.
 # BOTH-DAG: GLOBAL HIDDEN      1 foo1
 # BOTH-DAG: GLOBAL HIDDEN      1 foo2
 # BOTH-DAG: GLOBAL HIDDEN      1 foo3
+# BOTH-DAG: GLOBAL HIDDEN      1 foo4
+## Only foo5 is not skipped.
+# BOTH-DAG: GLOBAL INTERNAL    1 foo5
 
 ## Check that using an invalid symbol name regex generates an error.
 # RUN: echo '*.' > %t.symbols.regex
@@ -77,3 +90,11 @@ Symbols:
     Section: .text
     Binding: STB_GLOBAL
     Other:   [ STV_HIDDEN ]
+  - Name:    foo4
+    Section: .text
+    Binding: STB_GLOBAL
+    Other:   [ STV_HIDDEN ]
+  - Name:    foo5
+    Section: .text
+    Binding: STB_GLOBAL
+    Other:   [ STV_HIDDEN ]

>From 5d48d709bb22ce91dd51f56987fc3fa0fd98a6cd Mon Sep 17 00:00:00 2001
From: Ilia Kuklin <ikuklin at accesssoftek.com>
Date: Tue, 19 Mar 2024 22:43:38 +0500
Subject: [PATCH 18/20] Adjust the doc description, make it similar to
 --keep-symbols

---
 llvm/docs/CommandGuide/llvm-objcopy.rst | 13 +++++++------
 1 file changed, 7 insertions(+), 6 deletions(-)

diff --git a/llvm/docs/CommandGuide/llvm-objcopy.rst b/llvm/docs/CommandGuide/llvm-objcopy.rst
index e8b3c1415127f5..985d16eb11cfb6 100644
--- a/llvm/docs/CommandGuide/llvm-objcopy.rst
+++ b/llvm/docs/CommandGuide/llvm-objcopy.rst
@@ -466,15 +466,16 @@ them.
 
 .. option:: --skip-symbol <symbol>
 
- Do not change parameters of symbol <symbol> when executing other options that
- can change the symbol's name, binding or visibility.
+ Do not change the parameters of symbol ``<symbol>`` when executing other
+ options that can change the symbol's name, binding or visibility.
 
 .. option:: --skip-symbols <filename>
 
- Read a list of symbols from <filename> and run as if --skip-symbol=<symbol>
- is set for each one. <filename> contains one symbol per line and may contain
- comments beginning with '#'. Leading and trailing whitespace is stripped from
- each line. May be repeated to read symbols from many files.
+ Do not change the parameters of symbols named in the file ``<filename>`` when
+ executing other options that can change the symbol's name, binding or
+ visibility. In the file, each line represents a single symbol, with leading
+ and trailing whitespace ignored, as is anything following a '#'.
+ Can be specified multiple times to read names from multiple files.
 
 .. option:: --split-dwo <dwo-file>
 

>From f997fd9403834024a1a83439a872579ba4a5f94c Mon Sep 17 00:00:00 2001
From: Ilia Kuklin <ikuklin at accesssoftek.com>
Date: Tue, 19 Mar 2024 22:45:14 +0500
Subject: [PATCH 19/20] Change test order

---
 .../tools/llvm-objcopy/ELF/skip-symbol.test   | 36 +++++++++----------
 1 file changed, 18 insertions(+), 18 deletions(-)

diff --git a/llvm/test/tools/llvm-objcopy/ELF/skip-symbol.test b/llvm/test/tools/llvm-objcopy/ELF/skip-symbol.test
index a1860a8cfbfa87..ed9a9d484d8d3a 100644
--- a/llvm/test/tools/llvm-objcopy/ELF/skip-symbol.test
+++ b/llvm/test/tools/llvm-objcopy/ELF/skip-symbol.test
@@ -2,6 +2,15 @@
 # RUN: yaml2obj %s -o %t.o
 # RUN: echo 'foo[2-3]' > %t.skip.regex
 
+## Check --skip-symbol functionality when changing symbol bindings.
+# RUN: llvm-objcopy %t.o %t2.o --localize-hidden --skip-symbol=foo3
+# RUN: llvm-readelf -s %t2.o | FileCheck %s --check-prefix=LH-SYM
+# LH-SYM-DAG: LOCAL  HIDDEN      1 foo1
+# LH-SYM-DAG: LOCAL  HIDDEN      1 foo2
+# LH-SYM-DAG: GLOBAL HIDDEN      1 foo3
+# LH-SYM-DAG: LOCAL  HIDDEN      1 foo4
+# LH-SYM-DAG: LOCAL  HIDDEN      1 foo5
+
 ## Check --skip-symbols functionality when changing symbol bindings.
 # RUN: llvm-objcopy %t.o %t1.o --localize-hidden --skip-symbols=%t.skip.regex --regex
 # RUN: llvm-readelf -s %t1.o | FileCheck %s --check-prefix=LH-SYMS
@@ -11,14 +20,15 @@
 # LH-SYMS-DAG: LOCAL  HIDDEN      1 foo4
 # LH-SYMS-DAG: LOCAL  HIDDEN      1 foo5
 
-## Check --skip-symbol functionality when changing symbol bindings.
-# RUN: llvm-objcopy %t.o %t2.o --localize-hidden --skip-symbol=foo3
-# RUN: llvm-readelf -s %t2.o | FileCheck %s --check-prefix=LH-SYM
-# LH-SYM-DAG: LOCAL  HIDDEN      1 foo1
-# LH-SYM-DAG: LOCAL  HIDDEN      1 foo2
-# LH-SYM-DAG: GLOBAL HIDDEN      1 foo3
-# LH-SYM-DAG: LOCAL  HIDDEN      1 foo4
-# LH-SYM-DAG: LOCAL  HIDDEN      1 foo5
+## Check --skip-symbol functionality when changing symbol names.
+# RUN: llvm-objcopy %t.o %t4.o --redefine-syms=%t.renames.list \
+# RUN:   --skip-symbol='fo*' --wildcard
+# RUN: llvm-readelf -s %t4.o | FileCheck %s --check-prefix=RS-SYM
+# RS-SYM-DAG: foo1
+# RS-SYM-DAG: foo2
+# RS-SYM-DAG: foo3
+# RS-SYM-DAG: foo4
+# RS-SYM-DAG: foo5
 
 ## Check --skip-symbols functionality when changing symbol names.
 # RUN: echo -e "foo1 bar1\nfoo2 bar2" > %t.renames.list
@@ -31,16 +41,6 @@
 # RS-SYMS-DAG: foo4
 # RS-SYMS-DAG: foo5
 
-## Check --skip-symbol functionality when changing symbol names.
-# RUN: llvm-objcopy %t.o %t4.o --redefine-syms=%t.renames.list \
-# RUN:   --skip-symbol='fo*' --wildcard
-# RUN: llvm-readelf -s %t4.o | FileCheck %s --check-prefix=RS-SYM
-# RS-SYM-DAG: foo1
-# RS-SYM-DAG: foo2
-# RS-SYM-DAG: foo3
-# RS-SYM-DAG: foo4
-# RS-SYM-DAG: foo5
-
 ## Check the functionality when using skip options multiple times.
 # RUN: echo "foo3" > %t.symbol0.list
 # RUN: echo "foo4" > %t.symbol1.list

>From 41635754efaef58c3e3b7b1c4bd2500cfa6440af Mon Sep 17 00:00:00 2001
From: Ilia Kuklin <ikuklin at accesssoftek.com>
Date: Wed, 20 Mar 2024 14:29:08 +0500
Subject: [PATCH 20/20] Move creation of %t.renames.list earlier

---
 llvm/test/tools/llvm-objcopy/ELF/skip-symbol.test | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/llvm/test/tools/llvm-objcopy/ELF/skip-symbol.test b/llvm/test/tools/llvm-objcopy/ELF/skip-symbol.test
index ed9a9d484d8d3a..0f3ab808482ba5 100644
--- a/llvm/test/tools/llvm-objcopy/ELF/skip-symbol.test
+++ b/llvm/test/tools/llvm-objcopy/ELF/skip-symbol.test
@@ -21,6 +21,7 @@
 # LH-SYMS-DAG: LOCAL  HIDDEN      1 foo5
 
 ## Check --skip-symbol functionality when changing symbol names.
+# RUN: echo -e "foo1 bar1\nfoo2 bar2" > %t.renames.list
 # RUN: llvm-objcopy %t.o %t4.o --redefine-syms=%t.renames.list \
 # RUN:   --skip-symbol='fo*' --wildcard
 # RUN: llvm-readelf -s %t4.o | FileCheck %s --check-prefix=RS-SYM
@@ -31,7 +32,6 @@
 # RS-SYM-DAG: foo5
 
 ## Check --skip-symbols functionality when changing symbol names.
-# RUN: echo -e "foo1 bar1\nfoo2 bar2" > %t.renames.list
 # RUN: llvm-objcopy %t.o %t3.o --redefine-syms=%t.renames.list \
 # RUN:   --skip-symbols=%t.skip.regex --regex
 # RUN: llvm-readelf -s %t3.o | FileCheck %s --check-prefix=RS-SYMS



More information about the llvm-commits mailing list