Mercurial > hg > CbC > CbC_llvm
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); +}