[llvm] 2dc4a80 - [objcopy][NFC] Move NameOrPattern::create() into CommonConfig.h

Alexey Lapshin via llvm-commits llvm-commits at lists.llvm.org
Wed Mar 9 02:04:51 PST 2022


Author: Alexey Lapshin
Date: 2022-03-09T13:03:28+03:00
New Revision: 2dc4a80ec026e0870106bcfa6def90a64c8d7d90

URL: https://github.com/llvm/llvm-project/commit/2dc4a80ec026e0870106bcfa6def90a64c8d7d90
DIFF: https://github.com/llvm/llvm-project/commit/2dc4a80ec026e0870106bcfa6def90a64c8d7d90.diff

LOG: [objcopy][NFC] Move NameOrPattern::create() into CommonConfig.h

While moving objcopy into separate library(D88827), NameOrPattern::create()
was mistakenly placed into ObjcopyOptions.cpp. This patch moves
the NameOrPattern::create() into CommonConfig.h. Additionally it adds
test for using NameOrPattern.

Differential Revision: https://reviews.llvm.org/D121005

Added: 
    llvm/lib/ObjCopy/CommonConfig.cpp

Modified: 
    llvm/lib/ObjCopy/CMakeLists.txt
    llvm/tools/llvm-objcopy/ObjcopyOptions.cpp
    llvm/unittests/ObjCopy/ObjCopyTest.cpp

Removed: 
    


################################################################################
diff  --git a/llvm/lib/ObjCopy/CMakeLists.txt b/llvm/lib/ObjCopy/CMakeLists.txt
index 54557f260f8d0..2d6bee94875f0 100644
--- a/llvm/lib/ObjCopy/CMakeLists.txt
+++ b/llvm/lib/ObjCopy/CMakeLists.txt
@@ -37,6 +37,7 @@ source_group("Source Files\\XCOFF" REGULAR_EXPRESSION
 
 add_llvm_component_library(LLVMObjCopy
   Archive.cpp
+  CommonConfig.cpp
   ObjCopy.cpp
   ConfigManager.cpp
   COFF/COFFObjcopy.cpp

diff  --git a/llvm/lib/ObjCopy/CommonConfig.cpp b/llvm/lib/ObjCopy/CommonConfig.cpp
new file mode 100644
index 0000000000000..e85715d0c44cb
--- /dev/null
+++ b/llvm/lib/ObjCopy/CommonConfig.cpp
@@ -0,0 +1,50 @@
+//===- CommonConfig.cpp ---------------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include "llvm/ObjCopy/CommonConfig.h"
+
+namespace llvm {
+namespace objcopy {
+
+Expected<NameOrPattern>
+NameOrPattern::create(StringRef Pattern, MatchStyle MS,
+                      function_ref<Error(Error)> ErrorCallback) {
+  switch (MS) {
+  case MatchStyle::Literal:
+    return NameOrPattern(Pattern);
+  case MatchStyle::Wildcard: {
+    SmallVector<char, 32> Data;
+    bool IsPositiveMatch = true;
+    if (Pattern[0] == '!') {
+      IsPositiveMatch = false;
+      Pattern = Pattern.drop_front();
+    }
+    Expected<GlobPattern> GlobOrErr = GlobPattern::create(Pattern);
+
+    // If we couldn't create it as a glob, report the error, but try again
+    // with a literal if the error reporting is non-fatal.
+    if (!GlobOrErr) {
+      if (Error E = ErrorCallback(GlobOrErr.takeError()))
+        return std::move(E);
+      return create(Pattern, MatchStyle::Literal, ErrorCallback);
+    }
+
+    return NameOrPattern(std::make_shared<GlobPattern>(*GlobOrErr),
+                         IsPositiveMatch);
+  }
+  case MatchStyle::Regex: {
+    SmallVector<char, 32> Data;
+    return NameOrPattern(std::make_shared<Regex>(
+        ("^" + Pattern.ltrim('^').rtrim('$') + "$").toStringRef(Data)));
+  }
+  }
+  llvm_unreachable("Unhandled llvm.objcopy.MatchStyle enum");
+}
+
+} // end namespace objcopy
+} // end namespace llvm

diff  --git a/llvm/tools/llvm-objcopy/ObjcopyOptions.cpp b/llvm/tools/llvm-objcopy/ObjcopyOptions.cpp
index 1281af3b62379..29ed65be23a09 100644
--- a/llvm/tools/llvm-objcopy/ObjcopyOptions.cpp
+++ b/llvm/tools/llvm-objcopy/ObjcopyOptions.cpp
@@ -367,41 +367,6 @@ static Error addSymbolsFromFile(NameMatcher &Symbols, BumpPtrAllocator &Alloc,
   return Error::success();
 }
 
-Expected<NameOrPattern>
-NameOrPattern::create(StringRef Pattern, MatchStyle MS,
-                      function_ref<Error(Error)> ErrorCallback) {
-  switch (MS) {
-  case MatchStyle::Literal:
-    return NameOrPattern(Pattern);
-  case MatchStyle::Wildcard: {
-    SmallVector<char, 32> Data;
-    bool IsPositiveMatch = true;
-    if (Pattern[0] == '!') {
-      IsPositiveMatch = false;
-      Pattern = Pattern.drop_front();
-    }
-    Expected<GlobPattern> GlobOrErr = GlobPattern::create(Pattern);
-
-    // If we couldn't create it as a glob, report the error, but try again with
-    // a literal if the error reporting is non-fatal.
-    if (!GlobOrErr) {
-      if (Error E = ErrorCallback(GlobOrErr.takeError()))
-        return std::move(E);
-      return create(Pattern, MatchStyle::Literal, ErrorCallback);
-    }
-
-    return NameOrPattern(std::make_shared<GlobPattern>(*GlobOrErr),
-                         IsPositiveMatch);
-  }
-  case MatchStyle::Regex: {
-    SmallVector<char, 32> Data;
-    return NameOrPattern(std::make_shared<Regex>(
-        ("^" + Pattern.ltrim('^').rtrim('$') + "$").toStringRef(Data)));
-  }
-  }
-  llvm_unreachable("Unhandled llvm.objcopy.MatchStyle enum");
-}
-
 static Error addSymbolsToRenameFromFile(StringMap<StringRef> &SymbolsToRename,
                                         BumpPtrAllocator &Alloc,
                                         StringRef Filename) {

diff  --git a/llvm/unittests/ObjCopy/ObjCopyTest.cpp b/llvm/unittests/ObjCopy/ObjCopyTest.cpp
index bc16e954ca560..867742aa9799b 100644
--- a/llvm/unittests/ObjCopy/ObjCopyTest.cpp
+++ b/llvm/unittests/ObjCopy/ObjCopyTest.cpp
@@ -21,121 +21,237 @@ using namespace object;
 using namespace objcopy;
 using namespace yaml;
 
-void copySimpleInMemoryFileImpl(
-    const char *YamlCreationString,
-    std::function<bool(const Binary &File)> IsValidFormat) {
+const char *SimpleFileCOFFYAML = R"(
+--- !COFF
+header:
+  Machine:         IMAGE_FILE_MACHINE_AMD64
+  Characteristics: [  ]
+sections:
+  - Name:            .text
+    Characteristics: [  ]
+    Alignment:       4
+    SectionData:     E800000000C3C3C3
+symbols:
+...
+)";
+
+const char *SimpleFileELFYAML = R"(
+--- !ELF
+FileHeader:
+  Class:    ELFCLASS64
+  Data:     ELFDATA2LSB
+  Type:     ET_REL
+Sections:
+  - Name:            .text
+    Type:            SHT_PROGBITS
+    Flags:           [ SHF_ALLOC ]
+    Content:        "12345678"
+)";
+
+const char *SimpleFileMachOYAML = R"(
+--- !mach-o
+FileHeader:
+  magic:           0xFEEDFACF
+  cputype:         0x01000007
+  cpusubtype:      0x80000003
+  filetype:        0x00000001
+  ncmds:           1
+  sizeofcmds:      152
+  flags:           0x00002000
+  reserved:        0x00000000
+LoadCommands:
+  - cmd:             LC_SEGMENT_64
+    cmdsize:         152
+    segname:         __TEXT
+    vmaddr:          0
+    vmsize:          4
+    fileoff:         184
+    filesize:        4
+    maxprot:         7
+    initprot:        7
+    nsects:          1
+    flags:           0
+    Sections:
+      - sectname:        __text
+        segname:         __TEXT
+        addr:            0x0000000000000000
+        content:         'AABBCCDD'
+        size:            4
+        offset:          184
+        align:           0
+        reloff:          0x00000000
+        nreloc:          0
+        flags:           0x80000400
+        reserved1:       0x00000000
+        reserved2:       0x00000000
+        reserved3:       0x00000000
+...
+)";
+
+const char *SimpleFileWasmYAML = R"(
+--- !WASM
+FileHeader:
+  Version:         0x00000001
+Sections:
+  - Type: CUSTOM
+    Name: text
+    Payload: ABC123
+...
+)";
+
+// Create ObjectFile from \p YamlCreationString and do validation using \p
+// IsValidFormat checker. \p Storage is a storage for data. \returns created
+// ObjectFile.
+Expected<std::unique_ptr<ObjectFile>> createObjectFileFromYamlDescription(
+    const char *YamlCreationString, SmallVector<char> &Storage,
+    function_ref<bool(const Binary &File)> IsValidFormat) {
   auto ErrHandler = [&](const Twine &Msg) { FAIL() << "Error: " << Msg; };
 
-  // Create Object file from YAML description.
-  SmallVector<char> Storage;
   std::unique_ptr<ObjectFile> Obj =
       yaml2ObjectFile(Storage, YamlCreationString, ErrHandler);
-  ASSERT_TRUE(Obj);
-  ASSERT_TRUE(IsValidFormat(*Obj));
+  if (!Obj)
+    return createError("could not create ObjectFile from yaml description");
 
-  ConfigManager Config;
-  Config.Common.OutputFilename = "a.out";
+  if (!IsValidFormat(*Obj))
+    return createError("wrong file format");
 
-  // Call executeObjcopyOnBinary()
-  SmallVector<char> DataVector;
+  return Obj;
+}
+
+// Call objcopy::executeObjcopyOnBinary for \p Config and \p In. \p DataVector
+// is a holder for data. \returns Binary for copied data.
+Expected<std::unique_ptr<Binary>>
+callObjCopy(ConfigManager &Config, object::Binary &In,
+            SmallVector<char> &DataVector,
+            function_ref<bool(const Binary &File)> IsValidFormat) {
   raw_svector_ostream OutStream(DataVector);
-  Error Err = objcopy::executeObjcopyOnBinary(Config, *Obj.get(), OutStream);
-  ASSERT_FALSE(std::move(Err));
+
+  if (Error Err = objcopy::executeObjcopyOnBinary(Config, In, OutStream))
+    return std::move(Err);
 
   MemoryBufferRef Buffer(StringRef(DataVector.data(), DataVector.size()),
                          Config.Common.OutputFilename);
 
-  // Check copied file.
   Expected<std::unique_ptr<Binary>> Result = createBinary(Buffer);
+
+  // Check copied file.
+  if (!Result)
+    return Result;
+
+  if (!IsValidFormat(**Result))
+    return createError("wrong file format");
+
+  if (!(*Result)->isObject())
+    return createError("binary is not object file");
+
+  return Result;
+}
+
+// \returns true if specified \p File has a section named \p SectionName.
+bool hasSection(ObjectFile &File, StringRef SectionName) {
+  for (const object::SectionRef &Sec : File.sections()) {
+    Expected<StringRef> CurSecNameOrErr = Sec.getName();
+    if (!CurSecNameOrErr)
+      continue;
+
+    if (*CurSecNameOrErr == SectionName)
+      return true;
+  }
+
+  return false;
+}
+
+// Check that specified \p File has a section \p SectionName and its data
+// matches \p SectionData.
+void checkSectionData(ObjectFile &File, StringRef SectionName,
+                      StringRef SectionData) {
+  for (const object::SectionRef &Sec : File.sections()) {
+    Expected<StringRef> CurSecNameOrErr = Sec.getName();
+    ASSERT_THAT_EXPECTED(CurSecNameOrErr, Succeeded());
+
+    if (*CurSecNameOrErr == SectionName) {
+      Expected<StringRef> CurSectionData = Sec.getContents();
+      ASSERT_THAT_EXPECTED(CurSectionData, Succeeded());
+      EXPECT_TRUE(Sec.getSize() == SectionData.size());
+      EXPECT_TRUE(memcmp(CurSectionData->data(), SectionData.data(),
+                         SectionData.size()) == 0);
+      return;
+    }
+  }
+
+  // Section SectionName must be presented.
+  EXPECT_TRUE(false);
+}
+
+void copySimpleInMemoryFileImpl(
+    const char *YamlCreationString,
+    function_ref<bool(const Binary &File)> IsValidFormat) {
+  SCOPED_TRACE("copySimpleInMemoryFileImpl");
+
+  // Create Object file from YAML description.
+  SmallVector<char> Storage;
+  Expected<std::unique_ptr<ObjectFile>> Obj =
+      createObjectFileFromYamlDescription(YamlCreationString, Storage,
+                                          IsValidFormat);
+  ASSERT_THAT_EXPECTED(Obj, Succeeded());
+
+  ConfigManager Config;
+  Config.Common.OutputFilename = "a.out";
+
+  // Call executeObjcopyOnBinary()
+  SmallVector<char> DataVector;
+  Expected<std::unique_ptr<Binary>> Result =
+      callObjCopy(Config, *Obj.get(), DataVector, IsValidFormat);
   ASSERT_THAT_EXPECTED(Result, Succeeded());
-  ASSERT_TRUE(IsValidFormat(**Result));
 }
 
 TEST(CopySimpleInMemoryFile, COFF) {
   SCOPED_TRACE("CopySimpleInMemoryFileCOFF");
 
-  copySimpleInMemoryFileImpl(
-      R"(
---- !COFF
-header:
-  Machine:         IMAGE_FILE_MACHINE_AMD64
-  Characteristics: [  ]
-sections:
-  - Name:            .text
-    Characteristics: [  ]
-    Alignment:       4
-    SectionData:     E800000000C3C3C3
-symbols:
-...
-)",
-      [](const Binary &File) { return File.isCOFF(); });
+  copySimpleInMemoryFileImpl(SimpleFileCOFFYAML,
+                             [](const Binary &File) { return File.isCOFF(); });
 }
 
 TEST(CopySimpleInMemoryFile, ELF) {
   SCOPED_TRACE("CopySimpleInMemoryFileELF");
 
-  copySimpleInMemoryFileImpl(
-      R"(
---- !ELF
-FileHeader:
-   Class:    ELFCLASS64
-   Data:     ELFDATA2LSB
-   Type:     ET_REL)",
-      [](const Binary &File) { return File.isELF(); });
+  copySimpleInMemoryFileImpl(SimpleFileELFYAML,
+                             [](const Binary &File) { return File.isELF(); });
 }
 
 TEST(CopySimpleInMemoryFile, MachO) {
   SCOPED_TRACE("CopySimpleInMemoryFileMachO");
 
-  copySimpleInMemoryFileImpl(
-      R"(
---- !mach-o
-FileHeader:
-  magic:           0xFEEDFACF
-  cputype:         0x01000007
-  cpusubtype:      0x80000003
-  filetype:        0x00000002
-  ncmds:           0
-  sizeofcmds:      0
-  flags:           0x00218085
-  reserved:        0x00000000
-...
-)",
-      [](const Binary &File) { return File.isMachO(); });
+  copySimpleInMemoryFileImpl(SimpleFileMachOYAML,
+                             [](const Binary &File) { return File.isMachO(); });
 }
 
 TEST(CopySimpleInMemoryFile, Wasm) {
   SCOPED_TRACE("CopySimpleInMemoryFileWasm");
 
-  copySimpleInMemoryFileImpl(
-      R"(
---- !WASM
-FileHeader:
-  Version:         0x00000001
-...
-)",
-      [](const Binary &File) { return File.isWasm(); });
+  copySimpleInMemoryFileImpl(SimpleFileWasmYAML,
+                             [](const Binary &File) { return File.isWasm(); });
 }
 
 enum Action : uint8_t { AddSection, UpdateSection };
 
 void addOrUpdateSectionToFileImpl(
     const char *YamlCreationString,
-    std::function<bool(const Binary &File)> IsValidFormat,
+    function_ref<bool(const Binary &File)> IsValidFormat,
     StringRef NewSectionName, StringRef NewSectionData, Action SectionAction) {
-  auto ErrHandler = [&](const Twine &Msg) { FAIL() << "Error: " << Msg; };
+  SCOPED_TRACE("addOrUpdateSectionToFileImpl");
 
   // Create Object file from YAML description.
   SmallVector<char> Storage;
-  std::unique_ptr<ObjectFile> Obj =
-      yaml2ObjectFile(Storage, YamlCreationString, ErrHandler);
-  ASSERT_TRUE(Obj);
-  ASSERT_TRUE(IsValidFormat(*Obj));
+  Expected<std::unique_ptr<ObjectFile>> Obj =
+      createObjectFileFromYamlDescription(YamlCreationString, Storage,
+                                          IsValidFormat);
+  ASSERT_THAT_EXPECTED(Obj, Succeeded());
 
   std::unique_ptr<MemoryBuffer> NewSectionBuffer =
       MemoryBuffer::getMemBuffer(NewSectionData, NewSectionName, false);
   std::string Name;
-  if (Obj->isMachO())
+  if ((*Obj)->isMachO())
     Name = "__TEXT," + NewSectionName.str();
   else
     Name = NewSectionName.str();
@@ -149,219 +265,134 @@ void addOrUpdateSectionToFileImpl(
 
   // Call executeObjcopyOnBinary()
   SmallVector<char> DataVector;
-  raw_svector_ostream OutStream(DataVector);
-  Error Err = objcopy::executeObjcopyOnBinary(Config, *Obj.get(), OutStream);
-  ASSERT_FALSE(std::move(Err));
-
-  MemoryBufferRef Buffer(StringRef(DataVector.data(), DataVector.size()),
-                         Config.Common.OutputFilename);
-
-  // Check copied file.
-  Expected<std::unique_ptr<Binary>> Result = createBinary(Buffer);
+  Expected<std::unique_ptr<Binary>> Result =
+      callObjCopy(Config, *Obj.get(), DataVector, IsValidFormat);
   ASSERT_THAT_EXPECTED(Result, Succeeded());
-  ASSERT_TRUE(IsValidFormat(**Result));
-  ASSERT_TRUE((*Result)->isObject());
 
   // Check that copied file has the new section.
-  bool HasNewSection = false;
-  for (const object::SectionRef &Sect :
-       static_cast<ObjectFile *>((*Result).get())->sections()) {
-    Expected<StringRef> SectNameOrErr = Sect.getName();
-    ASSERT_THAT_EXPECTED(SectNameOrErr, Succeeded());
-
-    if (*SectNameOrErr == NewSectionName) {
-      HasNewSection = true;
-      Expected<StringRef> SectionData = Sect.getContents();
-      ASSERT_THAT_EXPECTED(SectionData, Succeeded());
-      EXPECT_TRUE(Sect.getSize() == NewSectionData.size());
-      EXPECT_TRUE(memcmp(SectionData->data(), NewSectionData.data(),
-                         NewSectionData.size()) == 0);
-      break;
-    }
-  }
-  EXPECT_TRUE(HasNewSection);
+  checkSectionData(*static_cast<ObjectFile *>((*Result).get()), NewSectionName,
+                   NewSectionData);
 }
 
 TEST(AddSection, COFF) {
   SCOPED_TRACE("addSectionToFileCOFF");
 
   addOrUpdateSectionToFileImpl(
-      R"(
---- !COFF
-header:
-  Machine:         IMAGE_FILE_MACHINE_AMD64
-  Characteristics: [  ]
-sections:
-  - Name:            .text
-    Characteristics: [  ]
-    Alignment:       4
-    SectionData:     E800000000C3C3C3
-symbols:
-...
-)",
-      [](const Binary &File) { return File.isCOFF(); }, ".foo", "1234",
-      AddSection);
+      SimpleFileCOFFYAML, [](const Binary &File) { return File.isCOFF(); },
+      ".foo", "1234", AddSection);
 }
 
 TEST(AddSection, ELF) {
   SCOPED_TRACE("addSectionToFileELF");
 
   addOrUpdateSectionToFileImpl(
-      R"(
---- !ELF
-FileHeader:
-   Class:    ELFCLASS64
-   Data:     ELFDATA2LSB
-   Type:     ET_REL)",
-      [](const Binary &File) { return File.isELF(); }, ".foo", "1234",
-      AddSection);
+      SimpleFileELFYAML, [](const Binary &File) { return File.isELF(); },
+      ".foo", "1234", AddSection);
 }
 
 TEST(AddSection, MachO) {
   SCOPED_TRACE("addSectionToFileMachO");
 
   addOrUpdateSectionToFileImpl(
-      R"(
---- !mach-o
-FileHeader:
-  magic:           0xFEEDFACF
-  cputype:         0x01000007
-  cpusubtype:      0x80000003
-  filetype:        0x00000001
-  ncmds:           1
-  sizeofcmds:      152
-  flags:           0x00002000
-  reserved:        0x00000000
-LoadCommands:
-  - cmd:             LC_SEGMENT_64
-    cmdsize:         152
-    segname:         __TEXT
-    vmaddr:          0
-    vmsize:          4
-    fileoff:         184
-    filesize:        4
-    maxprot:         7
-    initprot:        7
-    nsects:          1
-    flags:           0
-    Sections:
-      - sectname:        __text
-        segname:         __TEXT
-        addr:            0x0000000000000000
-        content:         'AABBCCDD'
-        size:            4
-        offset:          184
-        align:           0
-        reloff:          0x00000000
-        nreloc:          0
-        flags:           0x80000400
-        reserved1:       0x00000000
-        reserved2:       0x00000000
-        reserved3:       0x00000000
-...
-)",
-      [](const Binary &File) { return File.isMachO(); }, "__foo", "1234",
-      AddSection);
+      SimpleFileMachOYAML, [](const Binary &File) { return File.isMachO(); },
+      "__foo", "1234", AddSection);
 }
 
 TEST(AddSection, Wasm) {
   SCOPED_TRACE("addSectionToFileWasm");
 
   addOrUpdateSectionToFileImpl(
-      R"(
---- !WASM
-FileHeader:
-  Version:         0x00000001
-...
-)",
-      [](const Binary &File) { return File.isWasm(); }, ".foo", "1234",
-      AddSection);
+      SimpleFileWasmYAML, [](const Binary &File) { return File.isWasm(); },
+      ".foo", "1234", AddSection);
 }
 
 TEST(UpdateSection, COFF) {
   SCOPED_TRACE("updateSectionToFileCOFF");
 
   addOrUpdateSectionToFileImpl(
-      R"(
---- !COFF
-header:
-  Machine:         IMAGE_FILE_MACHINE_AMD64
-  Characteristics: [  ]
-sections:
-  - Name:            .foo
-    Characteristics: [  ]
-    Alignment:       4
-    SectionData:     E800000000C3C3C3
-symbols:
-...
-)",
-      [](const Binary &File) { return File.isCOFF(); }, ".foo", "1234",
-      UpdateSection);
+      SimpleFileCOFFYAML, [](const Binary &File) { return File.isCOFF(); },
+      ".text", "1234", UpdateSection);
 }
 
 TEST(UpdateSection, ELF) {
   SCOPED_TRACE("updateSectionToFileELF");
 
   addOrUpdateSectionToFileImpl(
-      R"(
---- !ELF
-FileHeader:
-  Class:    ELFCLASS64
-  Data:     ELFDATA2LSB
-  Type:     ET_REL
-Sections:
-  - Name:            .foo
-    Type:            SHT_PROGBITS
-    Flags:           [ SHF_ALLOC ]
-    Content:        "12345678"
-)",
-      [](const Binary &File) { return File.isELF(); }, ".foo", "1234",
-      UpdateSection);
+      SimpleFileELFYAML, [](const Binary &File) { return File.isELF(); },
+      ".text", "1234", UpdateSection);
 }
 
 TEST(UpdateSection, MachO) {
   SCOPED_TRACE("updateSectionToFileMachO");
 
   addOrUpdateSectionToFileImpl(
-      R"(
---- !mach-o
-FileHeader:
-  magic:           0xFEEDFACF
-  cputype:         0x01000007
-  cpusubtype:      0x80000003
-  filetype:        0x00000001
-  ncmds:           1
-  sizeofcmds:      152
-  flags:           0x00002000
-  reserved:        0x00000000
-LoadCommands:
-  - cmd:             LC_SEGMENT_64
-    cmdsize:         152
-    segname:         __TEXT
-    vmaddr:          0
-    vmsize:          4
-    fileoff:         184
-    filesize:        4
-    maxprot:         7
-    initprot:        7
-    nsects:          1
-    flags:           0
-    Sections:
-      - sectname:        __foo
-        segname:         __TEXT
-        addr:            0x0000000000000000
-        content:         'AABBCCDD'
-        size:            4
-        offset:          184
-        align:           0
-        reloff:          0x00000000
-        nreloc:          0
-        flags:           0x80000400
-        reserved1:       0x00000000
-        reserved2:       0x00000000
-        reserved3:       0x00000000
-...
-)",
-      [](const Binary &File) { return File.isMachO(); }, "__foo", "1234",
-      UpdateSection);
+      SimpleFileMachOYAML, [](const Binary &File) { return File.isMachO(); },
+      "__text", "1234", UpdateSection);
+}
+
+void removeSectionByPatternImpl(
+    const char *YamlCreationString,
+    function_ref<bool(const Binary &File)> IsValidFormat,
+    StringRef SectionWildcard, StringRef SectionName) {
+  SCOPED_TRACE("removeSectionByPatternImpl");
+
+  // Create Object file from YAML description.
+  SmallVector<char> Storage;
+  Expected<std::unique_ptr<ObjectFile>> Obj =
+      createObjectFileFromYamlDescription(YamlCreationString, Storage,
+                                          IsValidFormat);
+  ASSERT_THAT_EXPECTED(Obj, Succeeded());
+
+  // Check that section is present.
+  EXPECT_TRUE(hasSection(**Obj, SectionName));
+
+  Expected<NameOrPattern> Pattern = objcopy::NameOrPattern::create(
+      SectionWildcard, objcopy::MatchStyle::Wildcard,
+      [](Error Err) { return Err; });
+
+  ConfigManager Config;
+  Config.Common.OutputFilename = "a.out";
+  EXPECT_THAT_ERROR(Config.Common.ToRemove.addMatcher(std::move(Pattern)),
+                    Succeeded());
+
+  SmallVector<char> DataVector;
+  Expected<std::unique_ptr<Binary>> Result =
+      callObjCopy(Config, *Obj.get(), DataVector, IsValidFormat);
+  ASSERT_THAT_EXPECTED(Result, Succeeded());
+
+  // Check that section was removed.
+  EXPECT_FALSE(
+      hasSection(*static_cast<ObjectFile *>((*Result).get()), SectionName));
+}
+
+TEST(RemoveSectionByPattern, COFF) {
+  SCOPED_TRACE("removeSectionByPatternCOFF");
+
+  removeSectionByPatternImpl(
+      SimpleFileCOFFYAML, [](const Binary &File) { return File.isCOFF(); },
+      "\\.text*", ".text");
+}
+
+TEST(RemoveSectionByPattern, ELF) {
+  SCOPED_TRACE("removeSectionByPatternELF");
+
+  removeSectionByPatternImpl(
+      SimpleFileELFYAML, [](const Binary &File) { return File.isELF(); },
+      "\\.text*", ".text");
+}
+
+TEST(RemoveSectionByPattern, MachO) {
+  SCOPED_TRACE("removeSectionByPatternMachO");
+
+  removeSectionByPatternImpl(
+      SimpleFileMachOYAML, [](const Binary &File) { return File.isMachO(); },
+      "__TEXT,__text*", "__text");
+}
+
+TEST(RemoveSectionByPattern, Wasm) {
+  SCOPED_TRACE("removeSectionByPatternWasm");
+
+  removeSectionByPatternImpl(
+      SimpleFileWasmYAML, [](const Binary &File) { return File.isWasm(); },
+      "text*", "text");
 }


        


More information about the llvm-commits mailing list