aboutsummaryrefslogtreecommitdiff
path: root/lld/MachO/OutputSection.h
diff options
context:
space:
mode:
Diffstat (limited to 'lld/MachO/OutputSection.h')
-rw-r--r--lld/MachO/OutputSection.h22
1 files changed, 20 insertions, 2 deletions
diff --git a/lld/MachO/OutputSection.h b/lld/MachO/OutputSection.h
index c526a8343afe..eb554854cc89 100644
--- a/lld/MachO/OutputSection.h
+++ b/lld/MachO/OutputSection.h
@@ -9,15 +9,26 @@
#ifndef LLD_MACHO_OUTPUT_SECTION_H
#define LLD_MACHO_OUTPUT_SECTION_H
+#include "Symbols.h"
#include "lld/Common/LLVM.h"
#include "llvm/ADT/DenseMap.h"
+#include "llvm/ADT/TinyPtrVector.h"
+
+#include <limits>
namespace lld {
namespace macho {
+class Defined;
class InputSection;
class OutputSegment;
+// The default order value for OutputSections that are not constructed from
+// InputSections (i.e. SyntheticSections). We make it less than INT_MAX in order
+// not to conflict with the ordering of zerofill sections, which must always be
+// placed at the end of their segment.
+constexpr int UnspecifiedInputOrder = std::numeric_limits<int>::max() - 1024;
+
// Output sections represent the finalized sections present within the final
// linked executable. They can represent special sections (like the symbol
// table), or represent coalesced sections from the various inputs given to the
@@ -25,7 +36,7 @@ class OutputSegment;
class OutputSection {
public:
enum Kind {
- MergedKind,
+ ConcatKind,
SyntheticKind,
};
@@ -47,7 +58,6 @@ public:
// Unneeded sections are omitted entirely (header and body).
virtual bool isNeeded() const { return true; }
- // Specifically finalizes addresses and section size, not content.
virtual void finalize() {
// TODO investigate refactoring synthetic section finalization logic into
// overrides of this function.
@@ -55,8 +65,16 @@ public:
virtual void writeTo(uint8_t *buf) const = 0;
+ void assignAddressesToStartEndSymbols();
+
StringRef name;
+ llvm::TinyPtrVector<Defined *> sectionStartSymbols;
+ llvm::TinyPtrVector<Defined *> sectionEndSymbols;
OutputSegment *parent = nullptr;
+ // For output sections that don't have explicit ordering requirements, their
+ // output order should be based on the order of the input sections they
+ // contain.
+ int inputOrder = UnspecifiedInputOrder;
uint32_t index = 0;
uint64_t addr = 0;