xref: /freebsd-src/contrib/llvm-project/llvm/lib/ExecutionEngine/Orc/Shared/ObjectFormats.cpp (revision 0fca6ea1d4eea4c934cfff25ac9ee8ad6fe95583)
106c3fb27SDimitry Andric //===---------- ObjectFormats.cpp - Object format details for ORC ---------===//
206c3fb27SDimitry Andric //
306c3fb27SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
406c3fb27SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
506c3fb27SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
606c3fb27SDimitry Andric //
706c3fb27SDimitry Andric //===----------------------------------------------------------------------===//
806c3fb27SDimitry Andric //
906c3fb27SDimitry Andric // ORC-specific object format details.
1006c3fb27SDimitry Andric //
1106c3fb27SDimitry Andric //===----------------------------------------------------------------------===//
1206c3fb27SDimitry Andric 
1306c3fb27SDimitry Andric #include "llvm/ExecutionEngine/Orc/Shared/ObjectFormats.h"
1406c3fb27SDimitry Andric 
1506c3fb27SDimitry Andric namespace llvm {
1606c3fb27SDimitry Andric namespace orc {
1706c3fb27SDimitry Andric 
1806c3fb27SDimitry Andric StringRef MachODataCommonSectionName = "__DATA,__common";
1906c3fb27SDimitry Andric StringRef MachODataDataSectionName = "__DATA,__data";
2006c3fb27SDimitry Andric StringRef MachOEHFrameSectionName = "__TEXT,__eh_frame";
2106c3fb27SDimitry Andric StringRef MachOCompactUnwindInfoSectionName = "__TEXT,__unwind_info";
225f757f3fSDimitry Andric StringRef MachOCStringSectionName = "__TEXT,__cstring";
2306c3fb27SDimitry Andric StringRef MachOModInitFuncSectionName = "__DATA,__mod_init_func";
2406c3fb27SDimitry Andric StringRef MachOObjCCatListSectionName = "__DATA,__objc_catlist";
2506c3fb27SDimitry Andric StringRef MachOObjCCatList2SectionName = "__DATA,__objc_catlist2";
2606c3fb27SDimitry Andric StringRef MachOObjCClassListSectionName = "__DATA,__objc_classlist";
2706c3fb27SDimitry Andric StringRef MachOObjCClassNameSectionName = "__TEXT,__objc_classname";
2806c3fb27SDimitry Andric StringRef MachOObjCClassRefsSectionName = "__DATA,__objc_classrefs";
2906c3fb27SDimitry Andric StringRef MachOObjCConstSectionName = "__DATA,__objc_const";
3006c3fb27SDimitry Andric StringRef MachOObjCDataSectionName = "__DATA,__objc_data";
3106c3fb27SDimitry Andric StringRef MachOObjCImageInfoSectionName = "__DATA,__objc_imageinfo";
3206c3fb27SDimitry Andric StringRef MachOObjCMethNameSectionName = "__TEXT,__objc_methname";
3306c3fb27SDimitry Andric StringRef MachOObjCMethTypeSectionName = "__TEXT,__objc_methtype";
3406c3fb27SDimitry Andric StringRef MachOObjCNLCatListSectionName = "__DATA,__objc_nlcatlist";
35*0fca6ea1SDimitry Andric StringRef MachOObjCNLClassListSectionName = "__DATA,__objc_nlclslist";
36*0fca6ea1SDimitry Andric StringRef MachOObjCProtoListSectionName = "__DATA,__objc_protolist";
37*0fca6ea1SDimitry Andric StringRef MachOObjCProtoRefsSectionName = "__DATA,__objc_protorefs";
3806c3fb27SDimitry Andric StringRef MachOObjCSelRefsSectionName = "__DATA,__objc_selrefs";
3906c3fb27SDimitry Andric StringRef MachOSwift5ProtoSectionName = "__TEXT,__swift5_proto";
4006c3fb27SDimitry Andric StringRef MachOSwift5ProtosSectionName = "__TEXT,__swift5_protos";
4106c3fb27SDimitry Andric StringRef MachOSwift5TypesSectionName = "__TEXT,__swift5_types";
4206c3fb27SDimitry Andric StringRef MachOSwift5TypeRefSectionName = "__TEXT,__swift5_typeref";
4306c3fb27SDimitry Andric StringRef MachOSwift5FieldMetadataSectionName = "__TEXT,__swift5_fieldmd";
4406c3fb27SDimitry Andric StringRef MachOSwift5EntrySectionName = "__TEXT,__swift5_entry";
4506c3fb27SDimitry Andric StringRef MachOThreadBSSSectionName = "__DATA,__thread_bss";
4606c3fb27SDimitry Andric StringRef MachOThreadDataSectionName = "__DATA,__thread_data";
4706c3fb27SDimitry Andric StringRef MachOThreadVarsSectionName = "__DATA,__thread_vars";
4806c3fb27SDimitry Andric 
49*0fca6ea1SDimitry Andric StringRef MachOInitSectionNames[22] = {
5006c3fb27SDimitry Andric     MachOModInitFuncSectionName,         MachOObjCCatListSectionName,
5106c3fb27SDimitry Andric     MachOObjCCatList2SectionName,        MachOObjCClassListSectionName,
5206c3fb27SDimitry Andric     MachOObjCClassNameSectionName,       MachOObjCClassRefsSectionName,
5306c3fb27SDimitry Andric     MachOObjCConstSectionName,           MachOObjCDataSectionName,
5406c3fb27SDimitry Andric     MachOObjCImageInfoSectionName,       MachOObjCMethNameSectionName,
5506c3fb27SDimitry Andric     MachOObjCMethTypeSectionName,        MachOObjCNLCatListSectionName,
56*0fca6ea1SDimitry Andric     MachOObjCNLClassListSectionName,     MachOObjCProtoListSectionName,
57*0fca6ea1SDimitry Andric     MachOObjCProtoRefsSectionName,       MachOObjCSelRefsSectionName,
58*0fca6ea1SDimitry Andric     MachOSwift5ProtoSectionName,         MachOSwift5ProtosSectionName,
59*0fca6ea1SDimitry Andric     MachOSwift5TypesSectionName,         MachOSwift5TypeRefSectionName,
60*0fca6ea1SDimitry Andric     MachOSwift5FieldMetadataSectionName, MachOSwift5EntrySectionName,
6106c3fb27SDimitry Andric };
6206c3fb27SDimitry Andric 
6306c3fb27SDimitry Andric StringRef ELFEHFrameSectionName = ".eh_frame";
645f757f3fSDimitry Andric 
6506c3fb27SDimitry Andric StringRef ELFInitArrayFuncSectionName = ".init_array";
665f757f3fSDimitry Andric StringRef ELFInitFuncSectionName = ".init";
675f757f3fSDimitry Andric StringRef ELFFiniArrayFuncSectionName = ".fini_array";
685f757f3fSDimitry Andric StringRef ELFFiniFuncSectionName = ".fini";
695f757f3fSDimitry Andric StringRef ELFCtorArrayFuncSectionName = ".ctors";
705f757f3fSDimitry Andric StringRef ELFDtorArrayFuncSectionName = ".dtors";
715f757f3fSDimitry Andric 
725f757f3fSDimitry Andric StringRef ELFInitSectionNames[3]{
735f757f3fSDimitry Andric     ELFInitArrayFuncSectionName,
745f757f3fSDimitry Andric     ELFInitFuncSectionName,
755f757f3fSDimitry Andric     ELFCtorArrayFuncSectionName,
765f757f3fSDimitry Andric };
7706c3fb27SDimitry Andric 
7806c3fb27SDimitry Andric StringRef ELFThreadBSSSectionName = ".tbss";
7906c3fb27SDimitry Andric StringRef ELFThreadDataSectionName = ".tdata";
8006c3fb27SDimitry Andric 
8106c3fb27SDimitry Andric bool isMachOInitializerSection(StringRef SegName, StringRef SecName) {
8206c3fb27SDimitry Andric   for (auto &InitSection : MachOInitSectionNames) {
8306c3fb27SDimitry Andric     // Loop below assumes all MachO init sectios have a length-6
8406c3fb27SDimitry Andric     // segment name.
8506c3fb27SDimitry Andric     assert(InitSection[6] == ',' && "Init section seg name has length != 6");
8606c3fb27SDimitry Andric     if (InitSection.starts_with(SegName) && InitSection.substr(7) == SecName)
8706c3fb27SDimitry Andric       return true;
8806c3fb27SDimitry Andric   }
8906c3fb27SDimitry Andric   return false;
9006c3fb27SDimitry Andric }
9106c3fb27SDimitry Andric 
9206c3fb27SDimitry Andric bool isMachOInitializerSection(StringRef QualifiedName) {
9306c3fb27SDimitry Andric   for (auto &InitSection : MachOInitSectionNames)
9406c3fb27SDimitry Andric     if (InitSection == QualifiedName)
9506c3fb27SDimitry Andric       return true;
9606c3fb27SDimitry Andric   return false;
9706c3fb27SDimitry Andric }
9806c3fb27SDimitry Andric 
9906c3fb27SDimitry Andric bool isELFInitializerSection(StringRef SecName) {
1005f757f3fSDimitry Andric   for (StringRef InitSection : ELFInitSectionNames) {
1015f757f3fSDimitry Andric     StringRef Name = SecName;
1025f757f3fSDimitry Andric     if (Name.consume_front(InitSection) && (Name.empty() || Name[0] == '.'))
10306c3fb27SDimitry Andric       return true;
1045f757f3fSDimitry Andric   }
10506c3fb27SDimitry Andric   return false;
10606c3fb27SDimitry Andric }
10706c3fb27SDimitry Andric 
10806c3fb27SDimitry Andric bool isCOFFInitializerSection(StringRef SecName) {
1095f757f3fSDimitry Andric   return SecName.starts_with(".CRT");
11006c3fb27SDimitry Andric }
11106c3fb27SDimitry Andric 
11206c3fb27SDimitry Andric } // namespace orc
11306c3fb27SDimitry Andric } // namespace llvm
114