forked from OSchip/llvm-project
37 lines
1.3 KiB
C++
37 lines
1.3 KiB
C++
//===- 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 "OutputSegment.h"
|
|
|
|
#include "llvm/BinaryFormat/MachO.h"
|
|
|
|
using namespace llvm;
|
|
using namespace llvm::MachO;
|
|
using namespace lld;
|
|
|
|
bool macho::hasObjCSection(MemoryBufferRef mb) {
|
|
auto *hdr = reinterpret_cast<const mach_header_64 *>(mb.getBufferStart());
|
|
if (const load_command *cmd = findCommand(hdr, LC_SEGMENT_64)) {
|
|
auto *c = reinterpret_cast<const segment_command_64 *>(cmd);
|
|
auto sectionHeaders = ArrayRef<section_64>{
|
|
reinterpret_cast<const section_64 *>(c + 1), c->nsects};
|
|
for (const section_64 &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 == "__objc_catlist") ||
|
|
(segname == segment_names::text && sectname == "__swift")) {
|
|
return true;
|
|
}
|
|
}
|
|
}
|
|
return false;
|
|
}
|