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 #include "llvm/Support/Compiler.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 LLVM_ABI MCSectionMachO final : public MCSection { 26 char SegmentName[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 // The index of this section in MachObjectWriter::SectionOrder, which is 37 // different from MCSection::Ordinal. 38 unsigned LayoutOrder = 0; 39 40 // The defining non-temporary symbol for each fragment. 41 SmallVector<const MCSymbol *, 0> Atoms; 42 43 MCSectionMachO(StringRef Segment, StringRef Section, unsigned TAA, 44 unsigned reserved2, SectionKind K, MCSymbol *Begin); 45 friend class MCContext; 46 public: 47 getSegmentName()48 StringRef getSegmentName() const { 49 // SegmentName is not necessarily null terminated! 50 if (SegmentName[15]) 51 return StringRef(SegmentName, 16); 52 return StringRef(SegmentName); 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 /// an Error indicating the problem. If no TAA was parsed, TAA is not altered, 71 /// and TAAWasSet becomes false. 72 static Error 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 uint32_t Subsection) const override; 82 bool useCodeAlign() const override; 83 84 void allocAtoms(); 85 const MCSymbol *getAtom(size_t I) const; 86 void setAtom(size_t I, const MCSymbol *Sym); 87 getLayoutOrder()88 unsigned getLayoutOrder() const { return LayoutOrder; } setLayoutOrder(unsigned Value)89 void setLayoutOrder(unsigned Value) { LayoutOrder = Value; } 90 classof(const MCSection * S)91 static bool classof(const MCSection *S) { 92 return S->getVariant() == SV_MachO; 93 } 94 }; 95 96 } // end namespace llvm 97 98 #endif 99