xref: /freebsd-src/contrib/llvm-project/lld/MachO/OutputSegment.cpp (revision e8d8bef961a50d4dc22501cde4fb9fb0be1b2532)
15ffd83dbSDimitry Andric //===- OutputSegment.cpp --------------------------------------------------===//
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 #include "OutputSegment.h"
105ffd83dbSDimitry Andric #include "InputSection.h"
115ffd83dbSDimitry Andric #include "MergedOutputSection.h"
125ffd83dbSDimitry Andric #include "SyntheticSections.h"
135ffd83dbSDimitry Andric 
145ffd83dbSDimitry Andric #include "lld/Common/ErrorHandler.h"
155ffd83dbSDimitry Andric #include "lld/Common/Memory.h"
165ffd83dbSDimitry Andric #include "llvm/BinaryFormat/MachO.h"
175ffd83dbSDimitry Andric 
185ffd83dbSDimitry Andric using namespace llvm;
195ffd83dbSDimitry Andric using namespace llvm::MachO;
205ffd83dbSDimitry Andric using namespace lld;
215ffd83dbSDimitry Andric using namespace lld::macho;
225ffd83dbSDimitry Andric 
235ffd83dbSDimitry Andric static uint32_t initProt(StringRef name) {
245ffd83dbSDimitry Andric   if (name == segment_names::text)
255ffd83dbSDimitry Andric     return VM_PROT_READ | VM_PROT_EXECUTE;
265ffd83dbSDimitry Andric   if (name == segment_names::pageZero)
275ffd83dbSDimitry Andric     return 0;
285ffd83dbSDimitry Andric   if (name == segment_names::linkEdit)
295ffd83dbSDimitry Andric     return VM_PROT_READ;
305ffd83dbSDimitry Andric   return VM_PROT_READ | VM_PROT_WRITE;
315ffd83dbSDimitry Andric }
325ffd83dbSDimitry Andric 
335ffd83dbSDimitry Andric static uint32_t maxProt(StringRef name) {
34*e8d8bef9SDimitry Andric   assert(config->arch != AK_i386 &&
35*e8d8bef9SDimitry Andric          "TODO: i386 has different maxProt requirements");
36*e8d8bef9SDimitry Andric   return initProt(name);
375ffd83dbSDimitry Andric }
385ffd83dbSDimitry Andric 
395ffd83dbSDimitry Andric size_t OutputSegment::numNonHiddenSections() const {
405ffd83dbSDimitry Andric   size_t count = 0;
415ffd83dbSDimitry Andric   for (const OutputSection *osec : sections) {
425ffd83dbSDimitry Andric     count += (!osec->isHidden() ? 1 : 0);
435ffd83dbSDimitry Andric   }
445ffd83dbSDimitry Andric   return count;
455ffd83dbSDimitry Andric }
465ffd83dbSDimitry Andric 
475ffd83dbSDimitry Andric void OutputSegment::addOutputSection(OutputSection *osec) {
485ffd83dbSDimitry Andric   osec->parent = this;
495ffd83dbSDimitry Andric   sections.push_back(osec);
505ffd83dbSDimitry Andric }
515ffd83dbSDimitry Andric 
52*e8d8bef9SDimitry Andric static DenseMap<StringRef, OutputSegment *> nameToOutputSegment;
535ffd83dbSDimitry Andric std::vector<OutputSegment *> macho::outputSegments;
545ffd83dbSDimitry Andric 
555ffd83dbSDimitry Andric OutputSegment *macho::getOrCreateOutputSegment(StringRef name) {
565ffd83dbSDimitry Andric   OutputSegment *&segRef = nameToOutputSegment[name];
57*e8d8bef9SDimitry Andric   if (segRef)
585ffd83dbSDimitry Andric     return segRef;
595ffd83dbSDimitry Andric 
605ffd83dbSDimitry Andric   segRef = make<OutputSegment>();
615ffd83dbSDimitry Andric   segRef->name = name;
625ffd83dbSDimitry Andric   segRef->maxProt = maxProt(name);
635ffd83dbSDimitry Andric   segRef->initProt = initProt(name);
645ffd83dbSDimitry Andric 
655ffd83dbSDimitry Andric   outputSegments.push_back(segRef);
665ffd83dbSDimitry Andric   return segRef;
675ffd83dbSDimitry Andric }
68