| //===- MCSectionMachO.h - MachO Machine Code Sections -----------*- C++ -*-===// | |
| // | |
| // The LLVM Compiler Infrastructure | |
| // | |
| // This file is distributed under the University of Illinois Open Source | |
| // License. See LICENSE.TXT for details. | |
| // | |
| //===----------------------------------------------------------------------===// | |
| // | |
| // This file declares the MCSectionMachO class. | |
| // | |
| //===----------------------------------------------------------------------===// | |
| #ifndef LLVM_MC_MCSECTIONMACHO_H | |
| #define LLVM_MC_MCSECTIONMACHO_H | |
| #include "llvm/MC/MCSection.h" | |
| namespace llvm { | |
| /// MCSectionMachO - This represents a section on a Mach-O system (used by | |
| /// Mac OS X). On a Mac system, these are also described in | |
| /// /usr/include/mach-o/loader.h. | |
| class MCSectionMachO : public MCSection { | |
| char SegmentName[16]; // Not necessarily null terminated! | |
| char SectionName[16]; // Not necessarily null terminated! | |
| /// TypeAndAttributes - This is the SECTION_TYPE and SECTION_ATTRIBUTES | |
| /// field of a section, drawn from the enums below. | |
| unsigned TypeAndAttributes; | |
| /// Reserved2 - The 'reserved2' field of a section, used to represent the | |
| /// size of stubs, for example. | |
| unsigned Reserved2; | |
| MCSectionMachO(StringRef Segment, StringRef Section, | |
| unsigned TAA, unsigned reserved2, SectionKind K); | |
| friend class MCContext; | |
| public: | |
| /// These are the section type and attributes fields. A MachO section can | |
| /// have only one Type, but can have any of the attributes specified. | |
| enum { | |
| // TypeAndAttributes bitmasks. | |
| SECTION_TYPE = 0x000000FFU, | |
| SECTION_ATTRIBUTES = 0xFFFFFF00U, | |
| // Valid section types. | |
| /// S_REGULAR - Regular section. | |
| S_REGULAR = 0x00U, | |
| /// S_ZEROFILL - Zero fill on demand section. | |
| S_ZEROFILL = 0x01U, | |
| /// S_CSTRING_LITERALS - Section with literal C strings. | |
| S_CSTRING_LITERALS = 0x02U, | |
| /// S_4BYTE_LITERALS - Section with 4 byte literals. | |
| S_4BYTE_LITERALS = 0x03U, | |
| /// S_8BYTE_LITERALS - Section with 8 byte literals. | |
| S_8BYTE_LITERALS = 0x04U, | |
| /// S_LITERAL_POINTERS - Section with pointers to literals. | |
| S_LITERAL_POINTERS = 0x05U, | |
| /// S_NON_LAZY_SYMBOL_POINTERS - Section with non-lazy symbol pointers. | |
| S_NON_LAZY_SYMBOL_POINTERS = 0x06U, | |
| /// S_LAZY_SYMBOL_POINTERS - Section with lazy symbol pointers. | |
| S_LAZY_SYMBOL_POINTERS = 0x07U, | |
| /// S_SYMBOL_STUBS - Section with symbol stubs, byte size of stub in | |
| /// the Reserved2 field. | |
| S_SYMBOL_STUBS = 0x08U, | |
| /// S_MOD_INIT_FUNC_POINTERS - Section with only function pointers for | |
| /// initialization. | |
| S_MOD_INIT_FUNC_POINTERS = 0x09U, | |
| /// S_MOD_TERM_FUNC_POINTERS - Section with only function pointers for | |
| /// termination. | |
| S_MOD_TERM_FUNC_POINTERS = 0x0AU, | |
| /// S_COALESCED - Section contains symbols that are to be coalesced. | |
| S_COALESCED = 0x0BU, | |
| /// S_GB_ZEROFILL - Zero fill on demand section (that can be larger than 4 | |
| /// gigabytes). | |
| S_GB_ZEROFILL = 0x0CU, | |
| /// S_INTERPOSING - Section with only pairs of function pointers for | |
| /// interposing. | |
| S_INTERPOSING = 0x0DU, | |
| /// S_16BYTE_LITERALS - Section with only 16 byte literals. | |
| S_16BYTE_LITERALS = 0x0EU, | |
| /// S_DTRACE_DOF - Section contains DTrace Object Format. | |
| S_DTRACE_DOF = 0x0FU, | |
| /// S_LAZY_DYLIB_SYMBOL_POINTERS - Section with lazy symbol pointers to | |
| /// lazy loaded dylibs. | |
| S_LAZY_DYLIB_SYMBOL_POINTERS = 0x10U, | |
| /// S_THREAD_LOCAL_REGULAR - Section with .... | |
| S_THREAD_LOCAL_REGULAR = 0x11U, | |
| /// S_THREAD_LOCAL_ZEROFILL - Thread local zerofill section. | |
| S_THREAD_LOCAL_ZEROFILL = 0x12U, | |
| /// S_THREAD_LOCAL_VARIABLES - Section with thread local variable structure | |
| /// data. | |
| S_THREAD_LOCAL_VARIABLES = 0x13U, | |
| /// S_THREAD_LOCAL_VARIABLE_POINTERS - Section with .... | |
| S_THREAD_LOCAL_VARIABLE_POINTERS = 0x14U, | |
| /// S_THREAD_LOCAL_INIT_FUNCTION_POINTERS - Section with thread local | |
| /// variable initialization pointers to functions. | |
| S_THREAD_LOCAL_INIT_FUNCTION_POINTERS = 0x15U, | |
| LAST_KNOWN_SECTION_TYPE = S_THREAD_LOCAL_INIT_FUNCTION_POINTERS, | |
| // Valid section attributes. | |
| /// S_ATTR_PURE_INSTRUCTIONS - Section contains only true machine | |
| /// instructions. | |
| S_ATTR_PURE_INSTRUCTIONS = 1U << 31, | |
| /// S_ATTR_NO_TOC - Section contains coalesced symbols that are not to be | |
| /// in a ranlib table of contents. | |
| S_ATTR_NO_TOC = 1U << 30, | |
| /// S_ATTR_STRIP_STATIC_SYMS - Ok to strip static symbols in this section | |
| /// in files with the MY_DYLDLINK flag. | |
| S_ATTR_STRIP_STATIC_SYMS = 1U << 29, | |
| /// S_ATTR_NO_DEAD_STRIP - No dead stripping. | |
| S_ATTR_NO_DEAD_STRIP = 1U << 28, | |
| /// S_ATTR_LIVE_SUPPORT - Blocks are live if they reference live blocks. | |
| S_ATTR_LIVE_SUPPORT = 1U << 27, | |
| /// S_ATTR_SELF_MODIFYING_CODE - Used with i386 code stubs written on by | |
| /// dyld. | |
| S_ATTR_SELF_MODIFYING_CODE = 1U << 26, | |
| /// S_ATTR_DEBUG - A debug section. | |
| S_ATTR_DEBUG = 1U << 25, | |
| /// S_ATTR_SOME_INSTRUCTIONS - Section contains some machine instructions. | |
| S_ATTR_SOME_INSTRUCTIONS = 1U << 10, | |
| /// S_ATTR_EXT_RELOC - Section has external relocation entries. | |
| S_ATTR_EXT_RELOC = 1U << 9, | |
| /// S_ATTR_LOC_RELOC - Section has local relocation entries. | |
| S_ATTR_LOC_RELOC = 1U << 8 | |
| }; | |
| StringRef getSegmentName() const { | |
| // SegmentName is not necessarily null terminated! | |
| if (SegmentName[15]) | |
| return StringRef(SegmentName, 16); | |
| return StringRef(SegmentName); | |
| } | |
| StringRef getSectionName() const { | |
| // SectionName is not necessarily null terminated! | |
| if (SectionName[15]) | |
| return StringRef(SectionName, 16); | |
| return StringRef(SectionName); | |
| } | |
| unsigned getTypeAndAttributes() const { return TypeAndAttributes; } | |
| unsigned getStubSize() const { return Reserved2; } | |
| unsigned getType() const { return TypeAndAttributes & SECTION_TYPE; } | |
| bool hasAttribute(unsigned Value) const { | |
| return (TypeAndAttributes & Value) != 0; | |
| } | |
| /// ParseSectionSpecifier - Parse the section specifier indicated by "Spec". | |
| /// This is a string that can appear after a .section directive in a mach-o | |
| /// flavored .s file. If successful, this fills in the specified Out | |
| /// parameters and returns an empty string. When an invalid section | |
| /// specifier is present, this returns a string indicating the problem. | |
| /// If no TAA was parsed, TAA is not altered, and TAAWasSet becomes false. | |
| static std::string ParseSectionSpecifier(StringRef Spec, // In. | |
| StringRef &Segment, // Out. | |
| StringRef &Section, // Out. | |
| unsigned &TAA, // Out. | |
| bool &TAAParsed, // Out. | |
| unsigned &StubSize); // Out. | |
| virtual void PrintSwitchToSection(const MCAsmInfo &MAI, | |
| raw_ostream &OS) const; | |
| virtual bool UseCodeAlign() const; | |
| virtual bool isVirtualSection() const; | |
| static bool classof(const MCSection *S) { | |
| return S->getVariant() == SV_MachO; | |
| } | |
| static bool classof(const MCSectionMachO *) { return true; } | |
| }; | |
| } // end namespace llvm | |
| #endif |