1//===- MCSectionMachO.h - MachO Machine Code Sections -----------*- C++ -*-===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This file declares the MCSectionMachO class.
10//
11//===----------------------------------------------------------------------===//
12
13#ifndef LLVM_MC_MCSECTIONMACHO_H
14#define LLVM_MC_MCSECTIONMACHO_H
15
16#include "llvm/ADT/StringRef.h"
17#include "llvm/BinaryFormat/MachO.h"
18#include "llvm/MC/MCSection.h"
19#include "llvm/Support/Compiler.h"
20
21namespace llvm {
22
23/// This represents a section on a Mach-O system (used by Mac OS X). On a Mac
24/// system, these are also described in /usr/include/mach-o/loader.h.
25class LLVM_ABI MCSectionMachO final : public MCSection {
26 char SegmentName[16]; // Not necessarily null terminated!
27
28 /// This is the SECTION_TYPE and SECTION_ATTRIBUTES field of a section, drawn
29 /// from the enums below.
30 unsigned TypeAndAttributes;
31
32 /// The 'reserved2' field of a section, used to represent the size of stubs,
33 /// for example.
34 unsigned Reserved2;
35
36 // The index of this section in MachObjectWriter::SectionOrder, which is
37 // different from MCSection::Ordinal.
38 unsigned LayoutOrder = 0;
39
40 // The defining non-temporary symbol for each fragment.
41 SmallVector<const MCSymbol *, 0> Atoms;
42
43 MCSectionMachO(StringRef Segment, StringRef Section, unsigned TAA,
44 unsigned reserved2, SectionKind K, MCSymbol *Begin);
45 friend class MCContext;
46public:
47
48 StringRef getSegmentName() const {
49 // SegmentName is not necessarily null terminated!
50 if (SegmentName[15])
51 return StringRef(SegmentName, 16);
52 return StringRef(SegmentName);
53 }
54
55 unsigned getTypeAndAttributes() const { return TypeAndAttributes; }
56 unsigned getStubSize() const { return Reserved2; }
57
58 MachO::SectionType getType() const {
59 return static_cast<MachO::SectionType>(TypeAndAttributes &
60 MachO::SECTION_TYPE);
61 }
62 bool hasAttribute(unsigned Value) const {
63 return (TypeAndAttributes & Value) != 0;
64 }
65
66 /// Parse the section specifier indicated by "Spec". This is a string that can
67 /// appear after a .section directive in a mach-o flavored .s file. If
68 /// successful, this fills in the specified Out parameters and returns an
69 /// empty string. When an invalid section specifier is present, this returns
70 /// an Error indicating the problem. If no TAA was parsed, TAA is not altered,
71 /// and TAAWasSet becomes false.
72 static Error ParseSectionSpecifier(StringRef Spec, // In.
73 StringRef &Segment, // Out.
74 StringRef &Section, // Out.
75 unsigned &TAA, // Out.
76 bool &TAAParsed, // Out.
77 unsigned &StubSize); // Out.
78
79 void printSwitchToSection(const MCAsmInfo &MAI, const Triple &T,
80 raw_ostream &OS,
81 uint32_t Subsection) const override;
82 bool useCodeAlign() const override;
83
84 void allocAtoms();
85 const MCSymbol *getAtom(size_t I) const;
86 void setAtom(size_t I, const MCSymbol *Sym);
87
88 unsigned getLayoutOrder() const { return LayoutOrder; }
89 void setLayoutOrder(unsigned Value) { LayoutOrder = Value; }
90
91 static bool classof(const MCSection *S) {
92 return S->getVariant() == SV_MachO;
93 }
94};
95
96} // end namespace llvm
97
98#endif
99