Home | History | Annotate | Line # | Download | only in MC
      1 //===- MCSectionXCOFF.h - XCOFF 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 MCSectionXCOFF class.
     10 //
     11 //===----------------------------------------------------------------------===//
     12 
     13 #ifndef LLVM_MC_MCSECTIONXCOFF_H
     14 #define LLVM_MC_MCSECTIONXCOFF_H
     15 
     16 #include "llvm/BinaryFormat/XCOFF.h"
     17 #include "llvm/MC/MCSection.h"
     18 #include "llvm/MC/MCSymbolXCOFF.h"
     19 
     20 namespace llvm {
     21 
     22 // This class represents an XCOFF `Control Section`, more commonly referred to
     23 // as a csect. A csect represents the smallest possible unit of data/code which
     24 // will be relocated as a single block. A csect can either be:
     25 // 1) Initialized: The Type will be XTY_SD, and the symbols inside the csect
     26 //    will have a label definition representing their offset within the csect.
     27 // 2) Uninitialized: The Type will be XTY_CM, it will contain a single symbol,
     28 //    and may not contain label definitions.
     29 // 3) An external reference providing a symbol table entry for a symbol
     30 //    contained in another XCOFF object file. External reference csects are not
     31 //    implemented yet.
     32 class MCSectionXCOFF final : public MCSection {
     33   friend class MCContext;
     34 
     35   Optional<XCOFF::CsectProperties> CsectProp;
     36   MCSymbolXCOFF *const QualName;
     37   StringRef SymbolTableName;
     38   Optional<XCOFF::DwarfSectionSubtypeFlags> DwarfSubtypeFlags;
     39   bool MultiSymbolsAllowed;
     40   static constexpr unsigned DefaultAlignVal = 4;
     41 
     42   MCSectionXCOFF(StringRef Name, XCOFF::StorageMappingClass SMC,
     43                  XCOFF::SymbolType ST, SectionKind K, MCSymbolXCOFF *QualName,
     44                  MCSymbol *Begin, StringRef SymbolTableName,
     45                  bool MultiSymbolsAllowed)
     46       : MCSection(SV_XCOFF, Name, K, Begin),
     47         CsectProp(XCOFF::CsectProperties(SMC, ST)), QualName(QualName),
     48         SymbolTableName(SymbolTableName), DwarfSubtypeFlags(None),
     49         MultiSymbolsAllowed(MultiSymbolsAllowed) {
     50     assert(
     51         (ST == XCOFF::XTY_SD || ST == XCOFF::XTY_CM || ST == XCOFF::XTY_ER) &&
     52         "Invalid or unhandled type for csect.");
     53     assert(QualName != nullptr && "QualName is needed.");
     54     if (SMC == XCOFF::XMC_UL)
     55       assert((ST == XCOFF::XTY_CM || ST == XCOFF::XTY_ER) &&
     56              "Invalid csect type for storage mapping class XCOFF::XMC_UL");
     57 
     58     QualName->setRepresentedCsect(this);
     59     QualName->setStorageClass(XCOFF::C_HIDEXT);
     60     // A csect is 4 byte aligned by default, except for undefined symbol csects.
     61     if (ST != XCOFF::XTY_ER)
     62       setAlignment(Align(DefaultAlignVal));
     63   }
     64 
     65   MCSectionXCOFF(StringRef Name, SectionKind K, MCSymbolXCOFF *QualName,
     66                  XCOFF::DwarfSectionSubtypeFlags DwarfSubtypeFlags,
     67                  MCSymbol *Begin, StringRef SymbolTableName,
     68                  bool MultiSymbolsAllowed)
     69       : MCSection(SV_XCOFF, Name, K, Begin), QualName(QualName),
     70         SymbolTableName(SymbolTableName), DwarfSubtypeFlags(DwarfSubtypeFlags),
     71         MultiSymbolsAllowed(MultiSymbolsAllowed) {
     72     assert(QualName != nullptr && "QualName is needed.");
     73 
     74     // FIXME: use a more meaningful name for non csect sections.
     75     QualName->setRepresentedCsect(this);
     76 
     77     // Set default alignment 4 for all non csect sections for now.
     78     // FIXME: set different alignments according to section types.
     79     setAlignment(Align(DefaultAlignVal));
     80   }
     81 
     82   void printCsectDirective(raw_ostream &OS) const;
     83 
     84 public:
     85   ~MCSectionXCOFF();
     86 
     87   static bool classof(const MCSection *S) {
     88     return S->getVariant() == SV_XCOFF;
     89   }
     90 
     91   XCOFF::StorageMappingClass getMappingClass() const {
     92     assert(isCsect() && "Only csect section has mapping class property!");
     93     return CsectProp->MappingClass;
     94   }
     95   XCOFF::StorageClass getStorageClass() const {
     96     return QualName->getStorageClass();
     97   }
     98   XCOFF::SymbolType getCSectType() const {
     99     assert(isCsect() && "Only csect section has symbol type property!");
    100     return CsectProp->Type;
    101   }
    102   MCSymbolXCOFF *getQualNameSymbol() const { return QualName; }
    103 
    104   void PrintSwitchToSection(const MCAsmInfo &MAI, const Triple &T,
    105                             raw_ostream &OS,
    106                             const MCExpr *Subsection) const override;
    107   bool UseCodeAlign() const override;
    108   bool isVirtualSection() const override;
    109   StringRef getSymbolTableName() const { return SymbolTableName; }
    110   bool isMultiSymbolsAllowed() const { return MultiSymbolsAllowed; }
    111   bool isCsect() const { return CsectProp.hasValue(); }
    112   bool isDwarfSect() const { return DwarfSubtypeFlags.hasValue(); }
    113   Optional<XCOFF::DwarfSectionSubtypeFlags> getDwarfSubtypeFlags() const {
    114     return DwarfSubtypeFlags;
    115   }
    116 };
    117 
    118 } // end namespace llvm
    119 
    120 #endif
    121