[InstCombine] Signed saturation patterns
[llvm-core.git] / include / llvm / MC / MCSectionMachO.h
blob2c73661fb1fd65cb0614797e8d72c883920bba96
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.
11 //===----------------------------------------------------------------------===//
13 #ifndef LLVM_MC_MCSECTIONMACHO_H
14 #define LLVM_MC_MCSECTIONMACHO_H
16 #include "llvm/ADT/StringRef.h"
17 #include "llvm/BinaryFormat/MachO.h"
18 #include "llvm/MC/MCSection.h"
20 namespace llvm {
22 /// This represents a section on a Mach-O system (used by Mac OS X). On a Mac
23 /// system, these are also described in /usr/include/mach-o/loader.h.
24 class MCSectionMachO final : public MCSection {
25 char SegmentName[16]; // Not necessarily null terminated!
26 char SectionName[16]; // Not necessarily null terminated!
28 /// This is the SECTION_TYPE and SECTION_ATTRIBUTES field of a section, drawn
29 /// from the enums below.
30 unsigned TypeAndAttributes;
32 /// The 'reserved2' field of a section, used to represent the size of stubs,
33 /// for example.
34 unsigned Reserved2;
36 MCSectionMachO(StringRef Segment, StringRef Section, unsigned TAA,
37 unsigned reserved2, SectionKind K, MCSymbol *Begin);
38 friend class MCContext;
39 public:
41 StringRef getSegmentName() const {
42 // SegmentName is not necessarily null terminated!
43 if (SegmentName[15])
44 return StringRef(SegmentName, 16);
45 return StringRef(SegmentName);
47 StringRef getSectionName() const {
48 // SectionName is not necessarily null terminated!
49 if (SectionName[15])
50 return StringRef(SectionName, 16);
51 return StringRef(SectionName);
54 unsigned getTypeAndAttributes() const { return TypeAndAttributes; }
55 unsigned getStubSize() const { return Reserved2; }
57 MachO::SectionType getType() const {
58 return static_cast<MachO::SectionType>(TypeAndAttributes &
59 MachO::SECTION_TYPE);
61 bool hasAttribute(unsigned Value) const {
62 return (TypeAndAttributes & Value) != 0;
65 /// Parse the section specifier indicated by "Spec". This is a string that can
66 /// appear after a .section directive in a mach-o flavored .s file. If
67 /// successful, this fills in the specified Out parameters and returns an
68 /// empty string. When an invalid section specifier is present, this returns
69 /// a string indicating the problem. If no TAA was parsed, TAA is not altered,
70 /// and TAAWasSet becomes false.
71 static std::string ParseSectionSpecifier(StringRef Spec, // In.
72 StringRef &Segment, // Out.
73 StringRef &Section, // Out.
74 unsigned &TAA, // Out.
75 bool &TAAParsed, // Out.
76 unsigned &StubSize); // Out.
78 void PrintSwitchToSection(const MCAsmInfo &MAI, const Triple &T,
79 raw_ostream &OS,
80 const MCExpr *Subsection) const override;
81 bool UseCodeAlign() const override;
82 bool isVirtualSection() const override;
84 static bool classof(const MCSection *S) {
85 return S->getVariant() == SV_MachO;
89 } // end namespace llvm
91 #endif