xref: /freebsd-src/contrib/llvm-project/lld/MachO/OutputSegment.h (revision e8d8bef961a50d4dc22501cde4fb9fb0be1b2532)
15ffd83dbSDimitry Andric //===- OutputSegment.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_OUTPUT_SEGMENT_H
105ffd83dbSDimitry Andric #define LLD_MACHO_OUTPUT_SEGMENT_H
115ffd83dbSDimitry Andric 
125ffd83dbSDimitry Andric #include "OutputSection.h"
135ffd83dbSDimitry Andric #include "lld/Common/LLVM.h"
145ffd83dbSDimitry Andric 
155ffd83dbSDimitry Andric namespace lld {
165ffd83dbSDimitry Andric namespace macho {
175ffd83dbSDimitry Andric 
185ffd83dbSDimitry Andric namespace segment_names {
195ffd83dbSDimitry Andric 
205ffd83dbSDimitry Andric constexpr const char pageZero[] = "__PAGEZERO";
215ffd83dbSDimitry Andric constexpr const char text[] = "__TEXT";
225ffd83dbSDimitry Andric constexpr const char data[] = "__DATA";
235ffd83dbSDimitry Andric constexpr const char linkEdit[] = "__LINKEDIT";
245ffd83dbSDimitry Andric constexpr const char dataConst[] = "__DATA_CONST";
25*e8d8bef9SDimitry Andric constexpr const char ld[] = "__LD"; // output only with -r
26*e8d8bef9SDimitry Andric constexpr const char dwarf[] = "__DWARF";
275ffd83dbSDimitry Andric 
285ffd83dbSDimitry Andric } // namespace segment_names
295ffd83dbSDimitry Andric 
305ffd83dbSDimitry Andric class OutputSection;
315ffd83dbSDimitry Andric class InputSection;
325ffd83dbSDimitry Andric 
335ffd83dbSDimitry Andric class OutputSegment {
345ffd83dbSDimitry Andric public:
355ffd83dbSDimitry Andric   const OutputSection *firstSection() const { return sections.front(); }
365ffd83dbSDimitry Andric   const OutputSection *lastSection() const { return sections.back(); }
375ffd83dbSDimitry Andric 
385ffd83dbSDimitry Andric   void addOutputSection(OutputSection *os);
395ffd83dbSDimitry Andric   void sortOutputSections(
405ffd83dbSDimitry Andric       llvm::function_ref<bool(OutputSection *, OutputSection *)> comparator) {
415ffd83dbSDimitry Andric     llvm::stable_sort(sections, comparator);
425ffd83dbSDimitry Andric   }
435ffd83dbSDimitry Andric 
445ffd83dbSDimitry Andric   const std::vector<OutputSection *> &getSections() const { return sections; }
455ffd83dbSDimitry Andric   size_t numNonHiddenSections() const;
465ffd83dbSDimitry Andric 
475ffd83dbSDimitry Andric   uint64_t fileOff = 0;
485ffd83dbSDimitry Andric   StringRef name;
495ffd83dbSDimitry Andric   uint32_t maxProt = 0;
505ffd83dbSDimitry Andric   uint32_t initProt = 0;
515ffd83dbSDimitry Andric   uint8_t index;
525ffd83dbSDimitry Andric 
535ffd83dbSDimitry Andric private:
545ffd83dbSDimitry Andric   std::vector<OutputSection *> sections;
555ffd83dbSDimitry Andric };
565ffd83dbSDimitry Andric 
575ffd83dbSDimitry Andric extern std::vector<OutputSegment *> outputSegments;
585ffd83dbSDimitry Andric 
595ffd83dbSDimitry Andric OutputSegment *getOrCreateOutputSegment(StringRef name);
605ffd83dbSDimitry Andric 
615ffd83dbSDimitry Andric } // namespace macho
625ffd83dbSDimitry Andric } // namespace lld
635ffd83dbSDimitry Andric 
645ffd83dbSDimitry Andric #endif
65