diff --git a/llvm/include/llvm/MC/MCSectionXCOFF.h b/llvm/include/llvm/MC/MCSectionXCOFF.h --- a/llvm/include/llvm/MC/MCSectionXCOFF.h +++ b/llvm/include/llvm/MC/MCSectionXCOFF.h @@ -32,8 +32,7 @@ class MCSectionXCOFF final : public MCSection { friend class MCContext; - XCOFF::StorageMappingClass MappingClass; - XCOFF::SymbolType Type; + Optional CsectProp; MCSymbolXCOFF *const QualName; StringRef SymbolTableName; bool MultiSymbolsAllowed; @@ -43,19 +42,35 @@ XCOFF::SymbolType ST, SectionKind K, MCSymbolXCOFF *QualName, MCSymbol *Begin, StringRef SymbolTableName, bool MultiSymbolsAllowed) - : MCSection(SV_XCOFF, Name, K, Begin), MappingClass(SMC), Type(ST), - QualName(QualName), SymbolTableName(SymbolTableName), + : MCSection(SV_XCOFF, Name, K, Begin), + CsectProp(XCOFF::CsectProperties(SMC, ST)), QualName(QualName), + SymbolTableName(SymbolTableName), MultiSymbolsAllowed(MultiSymbolsAllowed) { - assert((ST == XCOFF::XTY_SD || ST == XCOFF::XTY_CM || ST == XCOFF::XTY_ER) && - "Invalid or unhandled type for csect."); + assert( + (ST == XCOFF::XTY_SD || ST == XCOFF::XTY_CM || ST == XCOFF::XTY_ER) && + "Invalid or unhandled type for csect."); assert(QualName != nullptr && "QualName is needed."); QualName->setRepresentedCsect(this); QualName->setStorageClass(XCOFF::C_HIDEXT); // A csect is 4 byte aligned by default, except for undefined symbol csects. - if (Type != XCOFF::XTY_ER) + if (CsectProp->Type != XCOFF::XTY_ER) setAlignment(Align(DefaultAlignVal)); } + MCSectionXCOFF(StringRef Name, SectionKind K, MCSymbolXCOFF *QualName, + MCSymbol *Begin, StringRef SymbolTableName, + bool MultiSymbolsAllowed) + : MCSection(SV_XCOFF, Name, K, Begin), QualName(QualName), + SymbolTableName(SymbolTableName), + MultiSymbolsAllowed(MultiSymbolsAllowed) { + assert(QualName != nullptr && "QualName is needed."); + // FIXME: use a more meaningful name for non csect sections. + QualName->setRepresentedCsect(this); + // Set default alignment 4 for all non csect sections for now. + // FIXME: set different alignments according to section types. + setAlignment(Align(DefaultAlignVal)); + } + void printCsectDirective(raw_ostream &OS) const; public: @@ -65,11 +80,19 @@ return S->getVariant() == SV_XCOFF; } - XCOFF::StorageMappingClass getMappingClass() const { return MappingClass; } + XCOFF::StorageMappingClass getMappingClass() const { + assert(CsectProp.hasValue() && + "Only csect section has mapping class property!"); + return CsectProp->MappingClass; + } XCOFF::StorageClass getStorageClass() const { return QualName->getStorageClass(); } - XCOFF::SymbolType getCSectType() const { return Type; } + XCOFF::SymbolType getCSectType() const { + assert(CsectProp.hasValue() && + "Only csect section has symbol type property!"); + return CsectProp->Type; + } MCSymbolXCOFF *getQualNameSymbol() const { return QualName; } void PrintSwitchToSection(const MCAsmInfo &MAI, const Triple &T, @@ -79,6 +102,7 @@ bool isVirtualSection() const override; StringRef getSymbolTableName() const { return SymbolTableName; } bool isMultiSymbolsAllowed() const { return MultiSymbolsAllowed; } + bool isCsect() const { return CsectProp.hasValue(); } }; } // end namespace llvm diff --git a/llvm/lib/MC/MCSectionXCOFF.cpp b/llvm/lib/MC/MCSectionXCOFF.cpp --- a/llvm/lib/MC/MCSectionXCOFF.cpp +++ b/llvm/lib/MC/MCSectionXCOFF.cpp @@ -75,4 +75,7 @@ bool MCSectionXCOFF::UseCodeAlign() const { return getKind().isText(); } -bool MCSectionXCOFF::isVirtualSection() const { return XCOFF::XTY_CM == Type; } +bool MCSectionXCOFF::isVirtualSection() const { + assert(CsectProp.hasValue() && "Only csect section can be virtual!"); + return XCOFF::XTY_CM == CsectProp->Type; +}