[lld] b572035 - [lld][MachO] Refactor findCommand

Alexander Shaposhnikov via llvm-commits llvm-commits at lists.llvm.org
Wed Apr 21 08:38:31 PDT 2021


Author: Alexander Shaposhnikov
Date: 2021-04-21T08:38:17-07:00
New Revision: b5720354efb61f1ee8784fa6809427b8a68cffa7

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

LOG: [lld][MachO] Refactor findCommand

Refactor findCommand to allow passing multiple types. NFC.

Test plan: make check-lld-macho

Differential revision: https://reviews.llvm.org/D100954

Added: 
    

Modified: 
    lld/MachO/InputFiles.cpp
    lld/MachO/InputFiles.h
    lld/MachO/ObjC.cpp

Removed: 
    


################################################################################
diff  --git a/lld/MachO/InputFiles.cpp b/lld/MachO/InputFiles.cpp
index 6edeb2ccc284..61f2840b2f83 100644
--- a/lld/MachO/InputFiles.cpp
+++ b/lld/MachO/InputFiles.cpp
@@ -109,29 +109,31 @@ static Optional<PlatformInfo> getPlatformInfo(const InputFile *input) {
 
   using Header = typename LP::mach_header;
   auto *hdr = reinterpret_cast<const Header *>(input->mb.getBufferStart());
+
   PlatformInfo platformInfo;
   if (const auto *cmd =
           findCommand<build_version_command>(hdr, LC_BUILD_VERSION)) {
     platformInfo.target.Platform = static_cast<PlatformKind>(cmd->platform);
     platformInfo.minimum = decodeVersion(cmd->minos);
     return platformInfo;
-  } else if (const auto *cmd =
-                 findCommand<version_min_command>(hdr, LC_VERSION_MIN_MACOSX)) {
-    platformInfo.target.Platform = PlatformKind::macOS;
-    platformInfo.minimum = decodeVersion(cmd->version);
-    return platformInfo;
-  } else if (const auto *cmd = findCommand<version_min_command>(
-                 hdr, LC_VERSION_MIN_IPHONEOS)) {
-    platformInfo.target.Platform = PlatformKind::iOS;
-    platformInfo.minimum = decodeVersion(cmd->version);
-    return platformInfo;
-  } else if (const auto *cmd =
-                 findCommand<version_min_command>(hdr, LC_VERSION_MIN_TVOS)) {
-    platformInfo.target.Platform = PlatformKind::tvOS;
-    platformInfo.minimum = decodeVersion(cmd->version);
-  } else if (const auto *cmd = findCommand<version_min_command>(
-                 hdr, LC_VERSION_MIN_WATCHOS)) {
-    platformInfo.target.Platform = PlatformKind::watchOS;
+  }
+  if (const auto *cmd = findCommand<version_min_command>(
+          hdr, LC_VERSION_MIN_MACOSX, LC_VERSION_MIN_IPHONEOS,
+          LC_VERSION_MIN_TVOS, LC_VERSION_MIN_WATCHOS)) {
+    switch (cmd->cmd) {
+    case LC_VERSION_MIN_MACOSX:
+      platformInfo.target.Platform = PlatformKind::macOS;
+      break;
+    case LC_VERSION_MIN_IPHONEOS:
+      platformInfo.target.Platform = PlatformKind::iOS;
+      break;
+    case LC_VERSION_MIN_TVOS:
+      platformInfo.target.Platform = PlatformKind::tvOS;
+      break;
+    case LC_VERSION_MIN_WATCHOS:
+      platformInfo.target.Platform = PlatformKind::watchOS;
+      break;
+    }
     platformInfo.minimum = decodeVersion(cmd->version);
     return platformInfo;
   }

diff  --git a/lld/MachO/InputFiles.h b/lld/MachO/InputFiles.h
index 6ead6900e19c..4db93bec8611 100644
--- a/lld/MachO/InputFiles.h
+++ b/lld/MachO/InputFiles.h
@@ -189,13 +189,15 @@ extern llvm::SetVector<InputFile *> inputFiles;
 
 llvm::Optional<MemoryBufferRef> readFile(StringRef path);
 
-template <class CommandType = llvm::MachO::load_command, class Header>
-const CommandType *findCommand(const Header *hdr, uint32_t type) {
+template <class CommandType = llvm::MachO::load_command, class Header,
+          class... Types>
+const CommandType *findCommand(const Header *hdr, Types... types) {
+  std::initializer_list<uint32_t> typesList{types...};
   const uint8_t *p = reinterpret_cast<const uint8_t *>(hdr) + sizeof(Header);
 
   for (uint32_t i = 0, n = hdr->ncmds; i < n; ++i) {
     auto *cmd = reinterpret_cast<const CommandType *>(p);
-    if (cmd->cmd == type)
+    if (llvm::is_contained(typesList, cmd->cmd))
       return cmd;
     p += cmd->cmdsize;
   }

diff  --git a/lld/MachO/ObjC.cpp b/lld/MachO/ObjC.cpp
index 6a341b280576..8fd1628435c4 100644
--- a/lld/MachO/ObjC.cpp
+++ b/lld/MachO/ObjC.cpp
@@ -23,8 +23,8 @@ template <class LP> static bool hasObjCSection(MemoryBufferRef mb) {
 
   auto *hdr =
       reinterpret_cast<const typename LP::mach_header *>(mb.getBufferStart());
-  if (const load_command *cmd = findCommand(hdr, LP::segmentLCType)) {
-    auto *c = reinterpret_cast<const typename LP::segment_command *>(cmd);
+  if (const auto *c =
+          findCommand<typename LP::segment_command>(hdr, LP::segmentLCType)) {
     auto sectionHeaders =
         ArrayRef<Section>{reinterpret_cast<const Section *>(c + 1), c->nsects};
     for (const Section &sec : sectionHeaders) {


        


More information about the llvm-commits mailing list