1 //===- 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/MC/MCSection.h" 19 #include "llvm/Support/MachO.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 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; 40 public: 41 getSegmentName()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 } getSectionName()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 getTypeAndAttributes()55 unsigned getTypeAndAttributes() const { return TypeAndAttributes; } getStubSize()56 unsigned getStubSize() const { return Reserved2; } 57 getType()58 MachO::SectionType getType() const { 59 return static_cast<MachO::SectionType>(TypeAndAttributes & 60 MachO::SECTION_TYPE); 61 } hasAttribute(unsigned Value)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, raw_ostream &OS, 80 const MCExpr *Subsection) const override; 81 bool UseCodeAlign() const override; 82 bool isVirtualSection() const override; 83 classof(const MCSection * S)84 static bool classof(const MCSection *S) { 85 return S->getVariant() == SV_MachO; 86 } 87 }; 88 89 } // end namespace llvm 90 91 #endif 92