diff options
| author | Dimitry Andric <dim@FreeBSD.org> | 2020-07-26 19:36:28 +0000 | 
|---|---|---|
| committer | Dimitry Andric <dim@FreeBSD.org> | 2020-07-26 19:36:28 +0000 | 
| commit | cfca06d7963fa0909f90483b42a6d7d194d01e08 (patch) | |
| tree | 209fb2a2d68f8f277793fc8df46c753d31bc853b /lld/MachO/OutputSegment.cpp | |
| parent | 706b4fc47bbc608932d3b491ae19a3b9cde9497b (diff) | |
Notes
Diffstat (limited to 'lld/MachO/OutputSegment.cpp')
| -rw-r--r-- | lld/MachO/OutputSegment.cpp | 67 | 
1 files changed, 67 insertions, 0 deletions
| diff --git a/lld/MachO/OutputSegment.cpp b/lld/MachO/OutputSegment.cpp new file mode 100644 index 000000000000..5e57c49f5c0a --- /dev/null +++ b/lld/MachO/OutputSegment.cpp @@ -0,0 +1,67 @@ +//===- OutputSegment.cpp --------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include "OutputSegment.h" +#include "InputSection.h" +#include "MergedOutputSection.h" +#include "SyntheticSections.h" + +#include "lld/Common/ErrorHandler.h" +#include "lld/Common/Memory.h" +#include "llvm/BinaryFormat/MachO.h" + +using namespace llvm; +using namespace llvm::MachO; +using namespace lld; +using namespace lld::macho; + +static uint32_t initProt(StringRef name) { +  if (name == segment_names::text) +    return VM_PROT_READ | VM_PROT_EXECUTE; +  if (name == segment_names::pageZero) +    return 0; +  if (name == segment_names::linkEdit) +    return VM_PROT_READ; +  return VM_PROT_READ | VM_PROT_WRITE; +} + +static uint32_t maxProt(StringRef name) { +  if (name == segment_names::pageZero) +    return 0; +  return VM_PROT_READ | VM_PROT_WRITE | VM_PROT_EXECUTE; +} + +size_t OutputSegment::numNonHiddenSections() const { +  size_t count = 0; +  for (const OutputSection *osec : sections) { +    count += (!osec->isHidden() ? 1 : 0); +  } +  return count; +} + +void OutputSegment::addOutputSection(OutputSection *osec) { +  osec->parent = this; +  sections.push_back(osec); +} + +static llvm::DenseMap<StringRef, OutputSegment *> nameToOutputSegment; +std::vector<OutputSegment *> macho::outputSegments; + +OutputSegment *macho::getOrCreateOutputSegment(StringRef name) { +  OutputSegment *&segRef = nameToOutputSegment[name]; +  if (segRef != nullptr) +    return segRef; + +  segRef = make<OutputSegment>(); +  segRef->name = name; +  segRef->maxProt = maxProt(name); +  segRef->initProt = initProt(name); + +  outputSegments.push_back(segRef); +  return segRef; +} | 
