diff lld/MachO/ObjC.cpp @ 207:2e18cbf3894f

LLVM12
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Tue, 08 Jun 2021 06:07:14 +0900
parents
children c4bab56944e8
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lld/MachO/ObjC.cpp	Tue Jun 08 06:07:14 2021 +0900
@@ -0,0 +1,54 @@
+//===- ObjC.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 "ObjC.h"
+#include "InputFiles.h"
+#include "InputSection.h"
+#include "OutputSegment.h"
+#include "Target.h"
+
+#include "llvm/BinaryFormat/MachO.h"
+
+using namespace llvm;
+using namespace llvm::MachO;
+using namespace lld;
+using namespace lld::macho;
+
+template <class LP> static bool hasObjCSection(MemoryBufferRef mb) {
+  using Section = typename LP::section;
+
+  auto *hdr =
+      reinterpret_cast<const typename LP::mach_header *>(mb.getBufferStart());
+  if (hdr->magic != LP::magic)
+    return false;
+
+  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) {
+      StringRef sectname(sec.sectname,
+                         strnlen(sec.sectname, sizeof(sec.sectname)));
+      StringRef segname(sec.segname, strnlen(sec.segname, sizeof(sec.segname)));
+      if ((segname == segment_names::data &&
+           sectname == section_names::objcCatList) ||
+          (segname == segment_names::text &&
+           sectname == section_names::swift)) {
+        return true;
+      }
+    }
+  }
+  return false;
+}
+
+bool macho::hasObjCSection(MemoryBufferRef mb) {
+  if (target->wordSize == 8)
+    return ::hasObjCSection<LP64>(mb);
+  else
+    return ::hasObjCSection<ILP32>(mb);
+}