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