Subversion Repositories QNX 8.QNX8 LLVM/Clang compiler suite

Rev

Blame | Last modification | View Log | Download | RSS feed

  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.