1 //===- MCSectionMachO.h - MachO Machine Code Sections -----------*- C++ -*-===//
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
7 //===----------------------------------------------------------------------===//
9 // This file declares the MCSectionMachO class.
11 //===----------------------------------------------------------------------===//
13 #ifndef LLVM_MC_MCSECTIONMACHO_H
14 #define LLVM_MC_MCSECTIONMACHO_H
16 #include "llvm/ADT/StringRef.h"
17 #include "llvm/BinaryFormat/MachO.h"
18 #include "llvm/MC/MCSection.h"
22 /// This represents a section on a Mach-O system (used by Mac OS X). On a Mac
23 /// system, these are also described in /usr/include/mach-o/loader.h.
24 class MCSectionMachO final
: public MCSection
{
25 char SegmentName
[16]; // Not necessarily null terminated!
26 char SectionName
[16]; // Not necessarily null terminated!
28 /// This is the SECTION_TYPE and SECTION_ATTRIBUTES field of a section, drawn
29 /// from the enums below.
30 unsigned TypeAndAttributes
;
32 /// The 'reserved2' field of a section, used to represent the size of stubs,
36 MCSectionMachO(StringRef Segment
, StringRef Section
, unsigned TAA
,
37 unsigned reserved2
, SectionKind K
, MCSymbol
*Begin
);
38 friend class MCContext
;
41 StringRef
getSegmentName() const {
42 // SegmentName is not necessarily null terminated!
44 return StringRef(SegmentName
, 16);
45 return StringRef(SegmentName
);
47 StringRef
getSectionName() const {
48 // SectionName is not necessarily null terminated!
50 return StringRef(SectionName
, 16);
51 return StringRef(SectionName
);
54 unsigned getTypeAndAttributes() const { return TypeAndAttributes
; }
55 unsigned getStubSize() const { return Reserved2
; }
57 MachO::SectionType
getType() const {
58 return static_cast<MachO::SectionType
>(TypeAndAttributes
&
61 bool hasAttribute(unsigned Value
) const {
62 return (TypeAndAttributes
& Value
) != 0;
65 /// Parse the section specifier indicated by "Spec". This is a string that can
66 /// appear after a .section directive in a mach-o flavored .s file. If
67 /// successful, this fills in the specified Out parameters and returns an
68 /// empty string. When an invalid section specifier is present, this returns
69 /// a string indicating the problem. If no TAA was parsed, TAA is not altered,
70 /// and TAAWasSet becomes false.
71 static std::string
ParseSectionSpecifier(StringRef Spec
, // In.
72 StringRef
&Segment
, // Out.
73 StringRef
&Section
, // Out.
74 unsigned &TAA
, // Out.
75 bool &TAAParsed
, // Out.
76 unsigned &StubSize
); // Out.
78 void PrintSwitchToSection(const MCAsmInfo
&MAI
, const Triple
&T
,
80 const MCExpr
*Subsection
) const override
;
81 bool UseCodeAlign() const override
;
82 bool isVirtualSection() const override
;
84 static bool classof(const MCSection
*S
) {
85 return S
->getVariant() == SV_MachO
;
89 } // end namespace llvm