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 | |
21 | namespace 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. |
25 | class 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; |
46 | public: |
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 | |