MCSectionMachO.h revision f0559e4b242e85d4b9d1dd08758814c599bdce13
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/MC/MCSection.h" 18 19namespace llvm { 20 21/// MCSectionMachO - This represents a section on a Mach-O system (used by 22/// Mac OS X). On a Mac system, these are also described in 23/// /usr/include/mach-o/loader.h. 24class MCSectionMachO : public MCSection { 25 char SegmentName[16]; // Not necessarily null terminated! 26 char SectionName[16]; // Not necessarily null terminated! 27 28 /// TypeAndAttributes - This is the SECTION_TYPE and SECTION_ATTRIBUTES 29 /// field of a section, drawn from the enums below. 30 unsigned TypeAndAttributes; 31 32 /// Reserved2 - The 'reserved2' field of a section, used to represent the 33 /// size of stubs, for example. 34 unsigned Reserved2; 35 36 MCSectionMachO(StringRef Segment, StringRef Section, 37 unsigned TAA, unsigned reserved2, SectionKind K) 38 : MCSection(K), TypeAndAttributes(TAA), Reserved2(reserved2) { 39 assert(Segment.size() <= 16 && Section.size() <= 16 && 40 "Segment or section string too long"); 41 for (unsigned i = 0; i != 16; ++i) { 42 if (i < Segment.size()) 43 SegmentName[i] = Segment[i]; 44 else 45 SegmentName[i] = 0; 46 47 if (i < Section.size()) 48 SectionName[i] = Section[i]; 49 else 50 SectionName[i] = 0; 51 } 52 } 53 54 static MCSectionMachO *Create(StringRef Segment, 55 StringRef Section, 56 unsigned TypeAndAttributes, 57 unsigned Reserved2, 58 SectionKind K, MCContext &Ctx); 59 60 friend class MCContext; 61public: 62 63 /// These are the section type and attributes fields. A MachO section can 64 /// have only one Type, but can have any of the attributes specified. 65 enum { 66 // TypeAndAttributes bitmasks. 67 SECTION_TYPE = 0x000000FFU, 68 SECTION_ATTRIBUTES = 0xFFFFFF00U, 69 70 // Valid section types. 71 72 /// S_REGULAR - Regular section. 73 S_REGULAR = 0x00U, 74 /// S_ZEROFILL - Zero fill on demand section. 75 S_ZEROFILL = 0x01U, 76 /// S_CSTRING_LITERALS - Section with literal C strings. 77 S_CSTRING_LITERALS = 0x02U, 78 /// S_4BYTE_LITERALS - Section with 4 byte literals. 79 S_4BYTE_LITERALS = 0x03U, 80 /// S_8BYTE_LITERALS - Section with 8 byte literals. 81 S_8BYTE_LITERALS = 0x04U, 82 /// S_LITERAL_POINTERS - Section with pointers to literals. 83 S_LITERAL_POINTERS = 0x05U, 84 /// S_NON_LAZY_SYMBOL_POINTERS - Section with non-lazy symbol pointers. 85 S_NON_LAZY_SYMBOL_POINTERS = 0x06U, 86 /// S_LAZY_SYMBOL_POINTERS - Section with lazy symbol pointers. 87 S_LAZY_SYMBOL_POINTERS = 0x07U, 88 /// S_SYMBOL_STUBS - Section with symbol stubs, byte size of stub in 89 /// the Reserved2 field. 90 S_SYMBOL_STUBS = 0x08U, 91 /// S_SYMBOL_STUBS - Section with only function pointers for 92 /// initialization. 93 S_MOD_INIT_FUNC_POINTERS = 0x09U, 94 /// S_MOD_INIT_FUNC_POINTERS - Section with only function pointers for 95 /// termination. 96 S_MOD_TERM_FUNC_POINTERS = 0x0AU, 97 /// S_COALESCED - Section contains symbols that are to be coalesced. 98 S_COALESCED = 0x0BU, 99 /// S_GB_ZEROFILL - Zero fill on demand section (that can be larger than 4 100 /// gigabytes). 101 S_GB_ZEROFILL = 0x0CU, 102 /// S_INTERPOSING - Section with only pairs of function pointers for 103 /// interposing. 104 S_INTERPOSING = 0x0DU, 105 /// S_16BYTE_LITERALS - Section with only 16 byte literals. 106 S_16BYTE_LITERALS = 0x0EU, 107 /// S_DTRACE_DOF - Section contains DTrace Object Format. 108 S_DTRACE_DOF = 0x0FU, 109 /// S_LAZY_DYLIB_SYMBOL_POINTERS - Section with lazy symbol pointers to 110 /// lazy loaded dylibs. 111 S_LAZY_DYLIB_SYMBOL_POINTERS = 0x10U, 112 113 LAST_KNOWN_SECTION_TYPE = S_LAZY_DYLIB_SYMBOL_POINTERS, 114 115 116 // Valid section attributes. 117 118 /// S_ATTR_PURE_INSTRUCTIONS - Section contains only true machine 119 /// instructions. 120 S_ATTR_PURE_INSTRUCTIONS = 1U << 31, 121 /// S_ATTR_NO_TOC - Section contains coalesced symbols that are not to be 122 /// in a ranlib table of contents. 123 S_ATTR_NO_TOC = 1U << 30, 124 /// S_ATTR_STRIP_STATIC_SYMS - Ok to strip static symbols in this section 125 /// in files with the MY_DYLDLINK flag. 126 S_ATTR_STRIP_STATIC_SYMS = 1U << 29, 127 /// S_ATTR_NO_DEAD_STRIP - No dead stripping. 128 S_ATTR_NO_DEAD_STRIP = 1U << 28, 129 /// S_ATTR_LIVE_SUPPORT - Blocks are live if they reference live blocks. 130 S_ATTR_LIVE_SUPPORT = 1U << 27, 131 /// S_ATTR_SELF_MODIFYING_CODE - Used with i386 code stubs written on by 132 /// dyld. 133 S_ATTR_SELF_MODIFYING_CODE = 1U << 26, 134 /// S_ATTR_DEBUG - A debug section. 135 S_ATTR_DEBUG = 1U << 25, 136 /// S_ATTR_SOME_INSTRUCTIONS - Section contains some machine instructions. 137 S_ATTR_SOME_INSTRUCTIONS = 1U << 10, 138 /// S_ATTR_EXT_RELOC - Section has external relocation entries. 139 S_ATTR_EXT_RELOC = 1U << 9, 140 /// S_ATTR_LOC_RELOC - Section has local relocation entries. 141 S_ATTR_LOC_RELOC = 1U << 8 142 }; 143 144 StringRef getSegmentName() const { 145 // SegmentName is not necessarily null terminated! 146 if (SegmentName[15]) 147 return StringRef(SegmentName, 16); 148 return StringRef(SegmentName); 149 } 150 StringRef getSectionName() const { 151 // SectionName is not necessarily null terminated! 152 if (SectionName[15]) 153 return StringRef(SectionName, 16); 154 return StringRef(SectionName); 155 } 156 157 unsigned getTypeAndAttributes() const { return TypeAndAttributes; } 158 unsigned getStubSize() const { return Reserved2; } 159 160 unsigned getType() const { return TypeAndAttributes & SECTION_TYPE; } 161 162 /// ParseSectionSpecifier - Parse the section specifier indicated by "Spec". 163 /// This is a string that can appear after a .section directive in a mach-o 164 /// flavored .s file. If successful, this fills in the specified Out 165 /// parameters and returns an empty string. When an invalid section 166 /// specifier is present, this returns a string indicating the problem. 167 static std::string ParseSectionSpecifier(StringRef Spec, // In. 168 StringRef &Segment, // Out. 169 StringRef &Section, // Out. 170 unsigned &TAA, // Out. 171 unsigned &StubSize); // Out. 172 173 virtual void PrintSwitchToSection(const MCAsmInfo &MAI, 174 raw_ostream &OS) const; 175}; 176 177} // end namespace llvm 178 179#endif 180