15ffd83dbSDimitry Andric //===- InputSection.h -------------------------------------------*- C++ -*-===// 25ffd83dbSDimitry Andric // 35ffd83dbSDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 45ffd83dbSDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 55ffd83dbSDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 65ffd83dbSDimitry Andric // 75ffd83dbSDimitry Andric //===----------------------------------------------------------------------===// 85ffd83dbSDimitry Andric 95ffd83dbSDimitry Andric #ifndef LLD_MACHO_INPUT_SECTION_H 105ffd83dbSDimitry Andric #define LLD_MACHO_INPUT_SECTION_H 115ffd83dbSDimitry Andric 125ffd83dbSDimitry Andric #include "lld/Common/LLVM.h" 135ffd83dbSDimitry Andric #include "llvm/ADT/ArrayRef.h" 145ffd83dbSDimitry Andric #include "llvm/ADT/PointerUnion.h" 155ffd83dbSDimitry Andric #include "llvm/BinaryFormat/MachO.h" 165ffd83dbSDimitry Andric 175ffd83dbSDimitry Andric namespace lld { 185ffd83dbSDimitry Andric namespace macho { 195ffd83dbSDimitry Andric 205ffd83dbSDimitry Andric class InputFile; 215ffd83dbSDimitry Andric class InputSection; 225ffd83dbSDimitry Andric class OutputSection; 235ffd83dbSDimitry Andric class Symbol; 245ffd83dbSDimitry Andric 255ffd83dbSDimitry Andric struct Reloc { 265ffd83dbSDimitry Andric uint8_t type; 275ffd83dbSDimitry Andric bool pcrel; 285ffd83dbSDimitry Andric uint8_t length; 295ffd83dbSDimitry Andric // The offset from the start of the subsection that this relocation belongs 305ffd83dbSDimitry Andric // to. 315ffd83dbSDimitry Andric uint32_t offset; 32*e8d8bef9SDimitry Andric // Adding this offset to the address of the referent symbol or subsection 33*e8d8bef9SDimitry Andric // gives the destination that this relocation refers to. 345ffd83dbSDimitry Andric uint64_t addend; 35*e8d8bef9SDimitry Andric llvm::PointerUnion<Symbol *, InputSection *> referent; 365ffd83dbSDimitry Andric }; 375ffd83dbSDimitry Andric 385ffd83dbSDimitry Andric class InputSection { 395ffd83dbSDimitry Andric public: 405ffd83dbSDimitry Andric virtual ~InputSection() = default; 415ffd83dbSDimitry Andric virtual uint64_t getSize() const { return data.size(); } 42*e8d8bef9SDimitry Andric virtual uint64_t getFileSize() const; 435ffd83dbSDimitry Andric uint64_t getFileOffset() const; 445ffd83dbSDimitry Andric uint64_t getVA() const; 455ffd83dbSDimitry Andric 465ffd83dbSDimitry Andric virtual void writeTo(uint8_t *buf); 475ffd83dbSDimitry Andric 485ffd83dbSDimitry Andric InputFile *file = nullptr; 495ffd83dbSDimitry Andric StringRef name; 505ffd83dbSDimitry Andric StringRef segname; 515ffd83dbSDimitry Andric 525ffd83dbSDimitry Andric OutputSection *parent = nullptr; 535ffd83dbSDimitry Andric uint64_t outSecOff = 0; 545ffd83dbSDimitry Andric uint64_t outSecFileOff = 0; 555ffd83dbSDimitry Andric 565ffd83dbSDimitry Andric uint32_t align = 1; 575ffd83dbSDimitry Andric uint32_t flags = 0; 585ffd83dbSDimitry Andric 595ffd83dbSDimitry Andric ArrayRef<uint8_t> data; 605ffd83dbSDimitry Andric std::vector<Reloc> relocs; 615ffd83dbSDimitry Andric }; 625ffd83dbSDimitry Andric 63*e8d8bef9SDimitry Andric inline uint8_t sectionType(uint32_t flags) { 64*e8d8bef9SDimitry Andric return flags & llvm::MachO::SECTION_TYPE; 65*e8d8bef9SDimitry Andric } 66*e8d8bef9SDimitry Andric 67*e8d8bef9SDimitry Andric inline bool isZeroFill(uint32_t flags) { 68*e8d8bef9SDimitry Andric return llvm::MachO::isVirtualSection(sectionType(flags)); 69*e8d8bef9SDimitry Andric } 70*e8d8bef9SDimitry Andric 71*e8d8bef9SDimitry Andric inline bool isThreadLocalVariables(uint32_t flags) { 72*e8d8bef9SDimitry Andric return sectionType(flags) == llvm::MachO::S_THREAD_LOCAL_VARIABLES; 73*e8d8bef9SDimitry Andric } 74*e8d8bef9SDimitry Andric 75*e8d8bef9SDimitry Andric // These sections contain the data for initializing thread-local variables. 76*e8d8bef9SDimitry Andric inline bool isThreadLocalData(uint32_t flags) { 77*e8d8bef9SDimitry Andric return sectionType(flags) == llvm::MachO::S_THREAD_LOCAL_REGULAR || 78*e8d8bef9SDimitry Andric sectionType(flags) == llvm::MachO::S_THREAD_LOCAL_ZEROFILL; 79*e8d8bef9SDimitry Andric } 80*e8d8bef9SDimitry Andric 81*e8d8bef9SDimitry Andric inline bool isDebugSection(uint32_t flags) { 82*e8d8bef9SDimitry Andric return (flags & llvm::MachO::SECTION_ATTRIBUTES_USR) == 83*e8d8bef9SDimitry Andric llvm::MachO::S_ATTR_DEBUG; 84*e8d8bef9SDimitry Andric } 85*e8d8bef9SDimitry Andric 86*e8d8bef9SDimitry Andric bool isCodeSection(InputSection *); 87*e8d8bef9SDimitry Andric 885ffd83dbSDimitry Andric extern std::vector<InputSection *> inputSections; 895ffd83dbSDimitry Andric 905ffd83dbSDimitry Andric } // namespace macho 91*e8d8bef9SDimitry Andric 92*e8d8bef9SDimitry Andric std::string toString(const macho::InputSection *); 93*e8d8bef9SDimitry Andric 945ffd83dbSDimitry Andric } // namespace lld 955ffd83dbSDimitry Andric 965ffd83dbSDimitry Andric #endif 97