Home | History | Annotate | Line # | Download | only in MC
      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.
     10 //
     11 //===----------------------------------------------------------------------===//
     12 
     13 #ifndef LLVM_MC_MCSECTIONMACHO_H
     14 #define LLVM_MC_MCSECTIONMACHO_H
     15 
     16 #include "llvm/ADT/StringRef.h"
     17 #include "llvm/BinaryFormat/MachO.h"
     18 #include "llvm/MC/MCSection.h"
     19 
     20 namespace llvm {
     21 
     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 
     27   /// This is the SECTION_TYPE and SECTION_ATTRIBUTES field of a section, drawn
     28   /// from the enums below.
     29   unsigned TypeAndAttributes;
     30 
     31   /// The 'reserved2' field of a section, used to represent the size of stubs,
     32   /// for example.
     33   unsigned Reserved2;
     34 
     35   MCSectionMachO(StringRef Segment, StringRef Section, unsigned TAA,
     36                  unsigned reserved2, SectionKind K, MCSymbol *Begin);
     37   friend class MCContext;
     38 public:
     39 
     40   StringRef getSegmentName() const {
     41     // SegmentName is not necessarily null terminated!
     42     if (SegmentName[15])
     43       return StringRef(SegmentName, 16);
     44     return StringRef(SegmentName);
     45   }
     46 
     47   unsigned getTypeAndAttributes() const { return TypeAndAttributes; }
     48   unsigned getStubSize() const { return Reserved2; }
     49 
     50   MachO::SectionType getType() const {
     51     return static_cast<MachO::SectionType>(TypeAndAttributes &
     52                                            MachO::SECTION_TYPE);
     53   }
     54   bool hasAttribute(unsigned Value) const {
     55     return (TypeAndAttributes & Value) != 0;
     56   }
     57 
     58   /// Parse the section specifier indicated by "Spec". This is a string that can
     59   /// appear after a .section directive in a mach-o flavored .s file.  If
     60   /// successful, this fills in the specified Out parameters and returns an
     61   /// empty string.  When an invalid section specifier is present, this returns
     62   /// an Error indicating the problem. If no TAA was parsed, TAA is not altered,
     63   /// and TAAWasSet becomes false.
     64   static Error ParseSectionSpecifier(StringRef Spec,      // In.
     65                                      StringRef &Segment,  // Out.
     66                                      StringRef &Section,  // Out.
     67                                      unsigned &TAA,       // Out.
     68                                      bool &TAAParsed,     // Out.
     69                                      unsigned &StubSize); // Out.
     70 
     71   void PrintSwitchToSection(const MCAsmInfo &MAI, const Triple &T,
     72                             raw_ostream &OS,
     73                             const MCExpr *Subsection) const override;
     74   bool UseCodeAlign() const override;
     75   bool isVirtualSection() const override;
     76 
     77   static bool classof(const MCSection *S) {
     78     return S->getVariant() == SV_MachO;
     79   }
     80 };
     81 
     82 } // end namespace llvm
     83 
     84 #endif
     85