1*700637cbSDimitry Andric //===-------- MachOObjectFormat.cpp -- MachO format details for ORC -------===//
2*700637cbSDimitry Andric //
3*700637cbSDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*700637cbSDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
5*700637cbSDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*700637cbSDimitry Andric //
7*700637cbSDimitry Andric //===----------------------------------------------------------------------===//
8*700637cbSDimitry Andric //
9*700637cbSDimitry Andric // ORC-specific MachO object format details.
10*700637cbSDimitry Andric //
11*700637cbSDimitry Andric //===----------------------------------------------------------------------===//
12*700637cbSDimitry Andric
13*700637cbSDimitry Andric #include "llvm/ExecutionEngine/Orc/Shared/MachOObjectFormat.h"
14*700637cbSDimitry Andric
15*700637cbSDimitry Andric namespace llvm {
16*700637cbSDimitry Andric namespace orc {
17*700637cbSDimitry Andric
18*700637cbSDimitry Andric StringRef MachODataCommonSectionName = "__DATA,__common";
19*700637cbSDimitry Andric StringRef MachODataDataSectionName = "__DATA,__data";
20*700637cbSDimitry Andric StringRef MachOEHFrameSectionName = "__TEXT,__eh_frame";
21*700637cbSDimitry Andric StringRef MachOCompactUnwindSectionName = "__LD,__compact_unwind";
22*700637cbSDimitry Andric StringRef MachOCStringSectionName = "__TEXT,__cstring";
23*700637cbSDimitry Andric StringRef MachOModInitFuncSectionName = "__DATA,__mod_init_func";
24*700637cbSDimitry Andric StringRef MachOObjCCatListSectionName = "__DATA,__objc_catlist";
25*700637cbSDimitry Andric StringRef MachOObjCCatList2SectionName = "__DATA,__objc_catlist2";
26*700637cbSDimitry Andric StringRef MachOObjCClassListSectionName = "__DATA,__objc_classlist";
27*700637cbSDimitry Andric StringRef MachOObjCClassNameSectionName = "__TEXT,__objc_classname";
28*700637cbSDimitry Andric StringRef MachOObjCClassRefsSectionName = "__DATA,__objc_classrefs";
29*700637cbSDimitry Andric StringRef MachOObjCConstSectionName = "__DATA,__objc_const";
30*700637cbSDimitry Andric StringRef MachOObjCDataSectionName = "__DATA,__objc_data";
31*700637cbSDimitry Andric StringRef MachOObjCImageInfoSectionName = "__DATA,__objc_imageinfo";
32*700637cbSDimitry Andric StringRef MachOObjCMethNameSectionName = "__TEXT,__objc_methname";
33*700637cbSDimitry Andric StringRef MachOObjCMethTypeSectionName = "__TEXT,__objc_methtype";
34*700637cbSDimitry Andric StringRef MachOObjCNLCatListSectionName = "__DATA,__objc_nlcatlist";
35*700637cbSDimitry Andric StringRef MachOObjCNLClassListSectionName = "__DATA,__objc_nlclslist";
36*700637cbSDimitry Andric StringRef MachOObjCProtoListSectionName = "__DATA,__objc_protolist";
37*700637cbSDimitry Andric StringRef MachOObjCProtoRefsSectionName = "__DATA,__objc_protorefs";
38*700637cbSDimitry Andric StringRef MachOObjCSelRefsSectionName = "__DATA,__objc_selrefs";
39*700637cbSDimitry Andric StringRef MachOSwift5ProtoSectionName = "__TEXT,__swift5_proto";
40*700637cbSDimitry Andric StringRef MachOSwift5ProtosSectionName = "__TEXT,__swift5_protos";
41*700637cbSDimitry Andric StringRef MachOSwift5TypesSectionName = "__TEXT,__swift5_types";
42*700637cbSDimitry Andric StringRef MachOSwift5TypeRefSectionName = "__TEXT,__swift5_typeref";
43*700637cbSDimitry Andric StringRef MachOSwift5FieldMetadataSectionName = "__TEXT,__swift5_fieldmd";
44*700637cbSDimitry Andric StringRef MachOSwift5EntrySectionName = "__TEXT,__swift5_entry";
45*700637cbSDimitry Andric StringRef MachOTextTextSectionName = "__TEXT,__text";
46*700637cbSDimitry Andric StringRef MachOThreadBSSSectionName = "__DATA,__thread_bss";
47*700637cbSDimitry Andric StringRef MachOThreadDataSectionName = "__DATA,__thread_data";
48*700637cbSDimitry Andric StringRef MachOThreadVarsSectionName = "__DATA,__thread_vars";
49*700637cbSDimitry Andric StringRef MachOUnwindInfoSectionName = "__TEXT,__unwind_info";
50*700637cbSDimitry Andric
51*700637cbSDimitry Andric StringRef MachOInitSectionNames[22] = {
52*700637cbSDimitry Andric MachOModInitFuncSectionName, MachOObjCCatListSectionName,
53*700637cbSDimitry Andric MachOObjCCatList2SectionName, MachOObjCClassListSectionName,
54*700637cbSDimitry Andric MachOObjCClassNameSectionName, MachOObjCClassRefsSectionName,
55*700637cbSDimitry Andric MachOObjCConstSectionName, MachOObjCDataSectionName,
56*700637cbSDimitry Andric MachOObjCImageInfoSectionName, MachOObjCMethNameSectionName,
57*700637cbSDimitry Andric MachOObjCMethTypeSectionName, MachOObjCNLCatListSectionName,
58*700637cbSDimitry Andric MachOObjCNLClassListSectionName, MachOObjCProtoListSectionName,
59*700637cbSDimitry Andric MachOObjCProtoRefsSectionName, MachOObjCSelRefsSectionName,
60*700637cbSDimitry Andric MachOSwift5ProtoSectionName, MachOSwift5ProtosSectionName,
61*700637cbSDimitry Andric MachOSwift5TypesSectionName, MachOSwift5TypeRefSectionName,
62*700637cbSDimitry Andric MachOSwift5FieldMetadataSectionName, MachOSwift5EntrySectionName,
63*700637cbSDimitry Andric };
64*700637cbSDimitry Andric
isMachOInitializerSection(StringRef SegName,StringRef SecName)65*700637cbSDimitry Andric bool isMachOInitializerSection(StringRef SegName, StringRef SecName) {
66*700637cbSDimitry Andric for (auto &InitSection : MachOInitSectionNames) {
67*700637cbSDimitry Andric // Loop below assumes all MachO init sectios have a length-6
68*700637cbSDimitry Andric // segment name.
69*700637cbSDimitry Andric assert(InitSection[6] == ',' && "Init section seg name has length != 6");
70*700637cbSDimitry Andric if (InitSection.starts_with(SegName) && InitSection.substr(7) == SecName)
71*700637cbSDimitry Andric return true;
72*700637cbSDimitry Andric }
73*700637cbSDimitry Andric return false;
74*700637cbSDimitry Andric }
75*700637cbSDimitry Andric
76*700637cbSDimitry Andric } // namespace orc
77*700637cbSDimitry Andric } // namespace llvm
78