Subversion Repositories QNX 8.QNX8 LLVM/Clang compiler suite

Rev

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

  1. //===- MCSectionCOFF.h - COFF 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 MCSectionCOFF class.
  10. //
  11. //===----------------------------------------------------------------------===//
  12.  
  13. #ifndef LLVM_MC_MCSECTIONCOFF_H
  14. #define LLVM_MC_MCSECTIONCOFF_H
  15.  
  16. #include "llvm/ADT/StringRef.h"
  17. #include "llvm/MC/MCSection.h"
  18. #include "llvm/MC/SectionKind.h"
  19. #include <cassert>
  20.  
  21. namespace llvm {
  22.  
  23. class MCSymbol;
  24.  
  25. /// This represents a section on Windows
  26. class MCSectionCOFF final : public MCSection {
  27.   // FIXME: The following fields should not be mutable, but are for now so the
  28.   // asm parser can honor the .linkonce directive.
  29.  
  30.   /// This is the Characteristics field of a section, drawn from the enums
  31.   /// below.
  32.   mutable unsigned Characteristics;
  33.  
  34.   /// The unique IDs used with the .pdata and .xdata sections created internally
  35.   /// by the assembler. This ID is used to ensure that for every .text section,
  36.   /// there is exactly one .pdata and one .xdata section, which is required by
  37.   /// the Microsoft incremental linker. This data is mutable because this ID is
  38.   /// not notionally part of the section.
  39.   mutable unsigned WinCFISectionID = ~0U;
  40.  
  41.   /// The COMDAT symbol of this section. Only valid if this is a COMDAT section.
  42.   /// Two COMDAT sections are merged if they have the same COMDAT symbol.
  43.   MCSymbol *COMDATSymbol;
  44.  
  45.   /// This is the Selection field for the section symbol, if it is a COMDAT
  46.   /// section (Characteristics & IMAGE_SCN_LNK_COMDAT) != 0
  47.   mutable int Selection;
  48.  
  49. private:
  50.   friend class MCContext;
  51.   // The storage of Name is owned by MCContext's COFFUniquingMap.
  52.   MCSectionCOFF(StringRef Name, unsigned Characteristics,
  53.                 MCSymbol *COMDATSymbol, int Selection, SectionKind K,
  54.                 MCSymbol *Begin)
  55.       : MCSection(SV_COFF, Name, K, Begin), Characteristics(Characteristics),
  56.         COMDATSymbol(COMDATSymbol), Selection(Selection) {
  57.     assert((Characteristics & 0x00F00000) == 0 &&
  58.            "alignment must not be set upon section creation");
  59.   }
  60.  
  61. public:
  62.   /// Decides whether a '.section' directive should be printed before the
  63.   /// section name
  64.   bool shouldOmitSectionDirective(StringRef Name, const MCAsmInfo &MAI) const;
  65.  
  66.   unsigned getCharacteristics() const { return Characteristics; }
  67.   MCSymbol *getCOMDATSymbol() const { return COMDATSymbol; }
  68.   int getSelection() const { return Selection; }
  69.  
  70.   void setSelection(int Selection) const;
  71.  
  72.   void printSwitchToSection(const MCAsmInfo &MAI, const Triple &T,
  73.                             raw_ostream &OS,
  74.                             const MCExpr *Subsection) const override;
  75.   bool useCodeAlign() const override;
  76.   bool isVirtualSection() const override;
  77.   StringRef getVirtualSectionKind() const override;
  78.  
  79.   unsigned getOrAssignWinCFISectionID(unsigned *NextID) const {
  80.     if (WinCFISectionID == ~0U)
  81.       WinCFISectionID = (*NextID)++;
  82.     return WinCFISectionID;
  83.   }
  84.  
  85.   static bool isImplicitlyDiscardable(StringRef Name) {
  86.     return Name.startswith(".debug");
  87.   }
  88.  
  89.   static bool classof(const MCSection *S) { return S->getVariant() == SV_COFF; }
  90. };
  91.  
  92. } // end namespace llvm
  93.  
  94. #endif // LLVM_MC_MCSECTIONCOFF_H
  95.