LLVM API Documentation

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