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