blob: 89db09cbdbdc175aec55a89d47308228f96dcdfe [file] [log] [blame]
Andrew Scull5e1ddfa2018-08-14 10:06:54 +01001//===- MCSectionMachO.h - MachO Machine Code Sections -----------*- C++ -*-===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This file declares the MCSectionMachO class.
11//
12//===----------------------------------------------------------------------===//
13
14#ifndef LLVM_MC_MCSECTIONMACHO_H
15#define LLVM_MC_MCSECTIONMACHO_H
16
17#include "llvm/ADT/StringRef.h"
18#include "llvm/BinaryFormat/MachO.h"
19#include "llvm/MC/MCSection.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 MCSectionMachO final : public MCSection {
26 char SegmentName[16]; // Not necessarily null terminated!
27 char SectionName[16]; // Not necessarily null terminated!
28
29 /// This is the SECTION_TYPE and SECTION_ATTRIBUTES field of a section, drawn
30 /// from the enums below.
31 unsigned TypeAndAttributes;
32
33 /// The 'reserved2' field of a section, used to represent the size of stubs,
34 /// for example.
35 unsigned Reserved2;
36
37 MCSectionMachO(StringRef Segment, StringRef Section, unsigned TAA,
38 unsigned reserved2, SectionKind K, MCSymbol *Begin);
39 friend class MCContext;
40public:
41
42 StringRef getSegmentName() const {
43 // SegmentName is not necessarily null terminated!
44 if (SegmentName[15])
45 return StringRef(SegmentName, 16);
46 return StringRef(SegmentName);
47 }
48 StringRef getSectionName() const {
49 // SectionName is not necessarily null terminated!
50 if (SectionName[15])
51 return StringRef(SectionName, 16);
52 return StringRef(SectionName);
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 /// a string indicating the problem. If no TAA was parsed, TAA is not altered,
71 /// and TAAWasSet becomes false.
72 static std::string 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 const MCExpr *Subsection) const override;
82 bool UseCodeAlign() const override;
83 bool isVirtualSection() const override;
84
85 static bool classof(const MCSection *S) {
86 return S->getVariant() == SV_MachO;
87 }
88};
89
90} // end namespace llvm
91
92#endif