| //===- 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 |