blob: 2c73661fb1fd65cb0614797e8d72c883920bba96 [file] [log] [blame]
Andrew Scull5e1ddfa2018-08-14 10:06:54 +01001//===- MCSectionMachO.h - MachO Machine Code Sections -----------*- C++ -*-===//
2//
Andrew Walbran16937d02019-10-22 13:54:20 +01003// 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
Andrew Scull5e1ddfa2018-08-14 10:06:54 +01006//
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
20namespace llvm {
21
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.
24class MCSectionMachO final : public MCSection {
25 char SegmentName[16]; // Not necessarily null terminated!
26 char SectionName[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 MCSectionMachO(StringRef Segment, StringRef Section, unsigned TAA,
37 unsigned reserved2, SectionKind K, MCSymbol *Begin);
38 friend class MCContext;
39public:
40
41 StringRef getSegmentName() const {
42 // SegmentName is not necessarily null terminated!
43 if (SegmentName[15])
44 return StringRef(SegmentName, 16);
45 return StringRef(SegmentName);
46 }
47 StringRef getSectionName() const {
48 // SectionName is not necessarily null terminated!
49 if (SectionName[15])
50 return StringRef(SectionName, 16);
51 return StringRef(SectionName);
52 }
53
54 unsigned getTypeAndAttributes() const { return TypeAndAttributes; }
55 unsigned getStubSize() const { return Reserved2; }
56
57 MachO::SectionType getType() const {
58 return static_cast<MachO::SectionType>(TypeAndAttributes &
59 MachO::SECTION_TYPE);
60 }
61 bool hasAttribute(unsigned Value) const {
62 return (TypeAndAttributes & Value) != 0;
63 }
64
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.
77
78 void PrintSwitchToSection(const MCAsmInfo &MAI, const Triple &T,
79 raw_ostream &OS,
80 const MCExpr *Subsection) const override;
81 bool UseCodeAlign() const override;
82 bool isVirtualSection() const override;
83
84 static bool classof(const MCSection *S) {
85 return S->getVariant() == SV_MachO;
86 }
87};
88
89} // end namespace llvm
90
91#endif