207
|
1 //===- ObjC.cpp -----------------------------------------------------------===//
|
|
2 //
|
|
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
4 // See https://llvm.org/LICENSE.txt for license information.
|
|
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
6 //
|
|
7 //===----------------------------------------------------------------------===//
|
|
8
|
|
9 #include "ObjC.h"
|
|
10 #include "InputFiles.h"
|
|
11 #include "InputSection.h"
|
|
12 #include "OutputSegment.h"
|
|
13 #include "Target.h"
|
|
14
|
|
15 #include "llvm/BinaryFormat/MachO.h"
|
|
16
|
|
17 using namespace llvm;
|
|
18 using namespace llvm::MachO;
|
|
19 using namespace lld;
|
|
20 using namespace lld::macho;
|
|
21
|
|
22 template <class LP> static bool hasObjCSection(MemoryBufferRef mb) {
|
|
23 using Section = typename LP::section;
|
|
24
|
|
25 auto *hdr =
|
|
26 reinterpret_cast<const typename LP::mach_header *>(mb.getBufferStart());
|
|
27 if (hdr->magic != LP::magic)
|
|
28 return false;
|
|
29
|
|
30 if (const auto *c =
|
|
31 findCommand<typename LP::segment_command>(hdr, LP::segmentLCType)) {
|
|
32 auto sectionHeaders =
|
|
33 ArrayRef<Section>{reinterpret_cast<const Section *>(c + 1), c->nsects};
|
|
34 for (const Section &sec : sectionHeaders) {
|
|
35 StringRef sectname(sec.sectname,
|
|
36 strnlen(sec.sectname, sizeof(sec.sectname)));
|
|
37 StringRef segname(sec.segname, strnlen(sec.segname, sizeof(sec.segname)));
|
|
38 if ((segname == segment_names::data &&
|
|
39 sectname == section_names::objcCatList) ||
|
|
40 (segname == segment_names::text &&
|
|
41 sectname == section_names::swift)) {
|
|
42 return true;
|
|
43 }
|
|
44 }
|
|
45 }
|
|
46 return false;
|
|
47 }
|
|
48
|
|
49 bool macho::hasObjCSection(MemoryBufferRef mb) {
|
|
50 if (target->wordSize == 8)
|
|
51 return ::hasObjCSection<LP64>(mb);
|
|
52 else
|
|
53 return ::hasObjCSection<ILP32>(mb);
|
|
54 }
|