Files
clang-p2996/lld/MachO/OutputSegment.h
Shoaib Meenai 0f6d720f1f [MachO] Properly reset global state
We need to reset global state between runs, similar to the other ports.
There's some file-static state which needs to be reset as well and we
need to add some new helpers for that.

With this change, most LLD Mach-O tests pass with `LLD_IN_TEST=2` (which
runs the linker twice on each test). Some tests will be fixed by the
remainder of this stack, and the rest are fundamentally incompatible
with that mode (e.g. they intentionally throw fatal errors).

Fixes PR52070.

Reviewed By: #lld-macho, int3

Differential Revision: https://reviews.llvm.org/D112878
2021-10-31 16:14:29 -07:00

79 lines
2.1 KiB
C++

//===- OutputSegment.h ------------------------------------------*- C++ -*-===//
//
// 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
//
//===----------------------------------------------------------------------===//
#ifndef LLD_MACHO_OUTPUT_SEGMENT_H
#define LLD_MACHO_OUTPUT_SEGMENT_H
#include "OutputSection.h"
#include "Symbols.h"
#include "lld/Common/LLVM.h"
#include "llvm/ADT/TinyPtrVector.h"
#include <limits>
#include <vector>
namespace lld {
namespace macho {
namespace segment_names {
constexpr const char dataConst[] = "__DATA_CONST";
constexpr const char dataDirty[] = "__DATA_DIRTY";
constexpr const char data[] = "__DATA";
constexpr const char dwarf[] = "__DWARF";
constexpr const char import[] = "__IMPORT";
constexpr const char ld[] = "__LD"; // output only with -r
constexpr const char linkEdit[] = "__LINKEDIT";
constexpr const char llvm[] = "__LLVM";
constexpr const char pageZero[] = "__PAGEZERO";
constexpr const char textExec[] = "__TEXT_EXEC";
constexpr const char text[] = "__TEXT";
} // namespace segment_names
class OutputSection;
class InputSection;
class OutputSegment {
public:
void addOutputSection(OutputSection *os);
void sortOutputSections();
void assignAddressesToStartEndSymbols();
const std::vector<OutputSection *> &getSections() const { return sections; }
size_t numNonHiddenSections() const;
uint64_t fileOff = 0;
uint64_t fileSize = 0;
uint64_t addr = 0;
uint64_t vmSize = 0;
int inputOrder = UnspecifiedInputOrder;
StringRef name;
uint32_t maxProt = 0;
uint32_t initProt = 0;
uint8_t index;
llvm::TinyPtrVector<Defined *> segmentStartSymbols;
llvm::TinyPtrVector<Defined *> segmentEndSymbols;
private:
std::vector<OutputSection *> sections;
};
extern std::vector<OutputSegment *> outputSegments;
void sortOutputSegments();
void resetOutputSegments();
OutputSegment *getOrCreateOutputSegment(StringRef name);
} // namespace macho
} // namespace lld
#endif