xref: /freebsd/contrib/llvm-project/lld/MachO/InputSection.h (revision e8d8bef961a50d4dc22501cde4fb9fb0be1b2532)
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