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 20 namespace 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. 24 class MCSectionMachO final : public MCSection { 25 char SegmentName[16]; // Not necessarily null terminated! 26 27 /// This is the SECTION_TYPE and SECTION_ATTRIBUTES field of a section, drawn 28 /// from the enums below. 29 unsigned TypeAndAttributes; 30 31 /// The 'reserved2' field of a section, used to represent the size of stubs, 32 /// for example. 33 unsigned Reserved2; 34 35 MCSectionMachO(StringRef Segment, StringRef Section, unsigned TAA, 36 unsigned reserved2, SectionKind K, MCSymbol *Begin); 37 friend class MCContext; 38 public: 39 getSegmentName()40 StringRef getSegmentName() const { 41 // SegmentName is not necessarily null terminated! 42 if (SegmentName[15]) 43 return StringRef(SegmentName, 16); 44 return StringRef(SegmentName); 45 } 46 getTypeAndAttributes()47 unsigned getTypeAndAttributes() const { return TypeAndAttributes; } getStubSize()48 unsigned getStubSize() const { return Reserved2; } 49 getType()50 MachO::SectionType getType() const { 51 return static_cast<MachO::SectionType>(TypeAndAttributes & 52 MachO::SECTION_TYPE); 53 } hasAttribute(unsigned Value)54 bool hasAttribute(unsigned Value) const { 55 return (TypeAndAttributes & Value) != 0; 56 } 57 58 /// Parse the section specifier indicated by "Spec". This is a string that can 59 /// appear after a .section directive in a mach-o flavored .s file. If 60 /// successful, this fills in the specified Out parameters and returns an 61 /// empty string. When an invalid section specifier is present, this returns 62 /// an Error indicating the problem. If no TAA was parsed, TAA is not altered, 63 /// and TAAWasSet becomes false. 64 static Error ParseSectionSpecifier(StringRef Spec, // In. 65 StringRef &Segment, // Out. 66 StringRef &Section, // Out. 67 unsigned &TAA, // Out. 68 bool &TAAParsed, // Out. 69 unsigned &StubSize); // Out. 70 71 void printSwitchToSection(const MCAsmInfo &MAI, const Triple &T, 72 raw_ostream &OS, 73 const MCExpr *Subsection) const override; 74 bool useCodeAlign() const override; 75 bool isVirtualSection() const override; 76 classof(const MCSection * S)77 static bool classof(const MCSection *S) { 78 return S->getVariant() == SV_MachO; 79 } 80 }; 81 82 } // end namespace llvm 83 84 #endif 85