diff --git a/llvm/include/llvm/MC/MCContext.h b/llvm/include/llvm/MC/MCContext.h --- a/llvm/include/llvm/MC/MCContext.h +++ b/llvm/include/llvm/MC/MCContext.h @@ -559,7 +559,6 @@ MCSectionXCOFF *getXCOFFSection(StringRef Section, XCOFF::StorageMappingClass MappingClass, XCOFF::SymbolType CSectType, - XCOFF::StorageClass StorageClass, SectionKind K, const char *BeginSymName = nullptr); 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 @@ -34,21 +34,19 @@ XCOFF::StorageMappingClass MappingClass; XCOFF::SymbolType Type; - XCOFF::StorageClass StorageClass; + XCOFF::StorageClass StorageClass = XCOFF::C_HIDEXT; MCSymbolXCOFF *const QualName; StringRef SymbolTableName; static constexpr unsigned DefaultAlignVal = 4; MCSectionXCOFF(StringRef Name, XCOFF::StorageMappingClass SMC, - XCOFF::SymbolType ST, XCOFF::StorageClass SC, SectionKind K, - MCSymbolXCOFF *QualName, MCSymbol *Begin, - StringRef SymbolTableName) + XCOFF::SymbolType ST, SectionKind K, MCSymbolXCOFF *QualName, + MCSymbol *Begin, StringRef SymbolTableName) : MCSection(SV_XCOFF, Name, K, Begin), MappingClass(SMC), Type(ST), - StorageClass(SC), QualName(QualName), SymbolTableName(SymbolTableName) { + QualName(QualName), SymbolTableName(SymbolTableName) { 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->setStorageClass(SC); QualName->setRepresentedCsect(this); // A csect is 4 byte aligned by default, except for undefined symbol csects. if (Type != XCOFF::XTY_ER) @@ -64,6 +62,7 @@ return S->getVariant() == SV_XCOFF; } + void setStorageClass(XCOFF::StorageClass SC) { StorageClass = SC; } XCOFF::StorageMappingClass getMappingClass() const { return MappingClass; } XCOFF::StorageClass getStorageClass() const { return StorageClass; } XCOFF::SymbolType getCSectType() const { return Type; } diff --git a/llvm/lib/CodeGen/TargetLoweringObjectFileImpl.cpp b/llvm/lib/CodeGen/TargetLoweringObjectFileImpl.cpp --- a/llvm/lib/CodeGen/TargetLoweringObjectFileImpl.cpp +++ b/llvm/lib/CodeGen/TargetLoweringObjectFileImpl.cpp @@ -2016,13 +2016,11 @@ SmallString<128> Name; getNameWithPrefix(Name, GO, TM); - XCOFF::StorageClass SC = - TargetLoweringObjectFileXCOFF::getStorageClassForGlobal(GO); // Externals go into a csect of type ER. return getContext().getXCOFFSection( Name, isa(GO) ? XCOFF::XMC_DS : XCOFF::XMC_UA, XCOFF::XTY_ER, - SC, SectionKind::getMetadata()); + SectionKind::getMetadata()); } MCSection *TargetLoweringObjectFileXCOFF::SelectSectionForGlobal( @@ -2035,11 +2033,9 @@ if (Kind.isBSSLocal() || Kind.isCommon()) { SmallString<128> Name; getNameWithPrefix(Name, GO, TM); - XCOFF::StorageClass SC = - TargetLoweringObjectFileXCOFF::getStorageClassForGlobal(GO); return getContext().getXCOFFSection( Name, Kind.isBSSLocal() ? XCOFF::XMC_BS : XCOFF::XMC_RW, XCOFF::XTY_CM, - SC, Kind, /* BeginSymbolName */ nullptr); + Kind, /* BeginSymbolName */ nullptr); } if (Kind.isMergeableCString()) { @@ -2053,7 +2049,6 @@ return getContext().getXCOFFSection( Name, XCOFF::XMC_RO, XCOFF::XTY_SD, - TargetLoweringObjectFileXCOFF::getStorageClassForGlobal(GO), Kind, /* BeginSymbolName */ nullptr); } @@ -2169,7 +2164,6 @@ SmallString<128> NameStr; getNameWithPrefix(NameStr, F, TM); return getContext().getXCOFFSection(NameStr, XCOFF::XMC_DS, XCOFF::XTY_SD, - getStorageClassForGlobal(F), SectionKind::getData()); } @@ -2177,5 +2171,5 @@ const MCSymbol *Sym) const { return getContext().getXCOFFSection( cast(Sym)->getSymbolTableName(), XCOFF::XMC_TC, - XCOFF::XTY_SD, XCOFF::C_HIDEXT, SectionKind::getData()); + XCOFF::XTY_SD, SectionKind::getData()); } diff --git a/llvm/lib/MC/MCContext.cpp b/llvm/lib/MC/MCContext.cpp --- a/llvm/lib/MC/MCContext.cpp +++ b/llvm/lib/MC/MCContext.cpp @@ -653,7 +653,6 @@ MCSectionXCOFF *MCContext::getXCOFFSection(StringRef Section, XCOFF::StorageMappingClass SMC, XCOFF::SymbolType Type, - XCOFF::StorageClass SC, SectionKind Kind, const char *BeginSymName) { // Do the lookup. If we have a hit, return it. @@ -675,8 +674,8 @@ // QualName->getUnqualifiedName() and CachedName are the same except when // CachedName contains invalid character(s) such as '$' for an XCOFF symbol. MCSectionXCOFF *Result = new (XCOFFAllocator.Allocate()) - MCSectionXCOFF(QualName->getUnqualifiedName(), SMC, Type, SC, Kind, - QualName, Begin, CachedName); + MCSectionXCOFF(QualName->getUnqualifiedName(), SMC, Type, Kind, QualName, + Begin, CachedName); Entry.second = Result; auto *F = new MCDataFragment(); diff --git a/llvm/lib/MC/MCObjectFileInfo.cpp b/llvm/lib/MC/MCObjectFileInfo.cpp --- a/llvm/lib/MC/MCObjectFileInfo.cpp +++ b/llvm/lib/MC/MCObjectFileInfo.cpp @@ -822,21 +822,21 @@ // get placed into this csect. The choice of csect name is not a property of // the ABI or object file format. For example, the XL compiler uses an unnamed // csect for program code. - TextSection = Ctx->getXCOFFSection( - ".text", XCOFF::StorageMappingClass::XMC_PR, XCOFF::XTY_SD, - XCOFF::C_HIDEXT, SectionKind::getText()); + TextSection = + Ctx->getXCOFFSection(".text", XCOFF::StorageMappingClass::XMC_PR, + XCOFF::XTY_SD, SectionKind::getText()); - DataSection = Ctx->getXCOFFSection( - ".data", XCOFF::StorageMappingClass::XMC_RW, XCOFF::XTY_SD, - XCOFF::C_HIDEXT, SectionKind::getData()); + DataSection = + Ctx->getXCOFFSection(".data", XCOFF::StorageMappingClass::XMC_RW, + XCOFF::XTY_SD, SectionKind::getData()); - ReadOnlySection = Ctx->getXCOFFSection( - ".rodata", XCOFF::StorageMappingClass::XMC_RO, XCOFF::XTY_SD, - XCOFF::C_HIDEXT, SectionKind::getReadOnly()); + ReadOnlySection = + Ctx->getXCOFFSection(".rodata", XCOFF::StorageMappingClass::XMC_RO, + XCOFF::XTY_SD, SectionKind::getReadOnly()); - TOCBaseSection = Ctx->getXCOFFSection( - "TOC", XCOFF::StorageMappingClass::XMC_TC0, XCOFF::XTY_SD, - XCOFF::C_HIDEXT, SectionKind::getData()); + TOCBaseSection = + Ctx->getXCOFFSection("TOC", XCOFF::StorageMappingClass::XMC_TC0, + XCOFF::XTY_SD, SectionKind::getData()); // The TOC-base always has 0 size, but 4 byte alignment. TOCBaseSection->setAlignment(Align(4)); diff --git a/llvm/lib/MC/MCXCOFFStreamer.cpp b/llvm/lib/MC/MCXCOFFStreamer.cpp --- a/llvm/lib/MC/MCXCOFFStreamer.cpp +++ b/llvm/lib/MC/MCXCOFFStreamer.cpp @@ -29,6 +29,16 @@ : MCObjectStreamer(Context, std::move(MAB), std::move(OW), std::move(Emitter)) {} +void setXCOFFMCSectionStorageClass(const MCSymbol *Sym) { + auto *Symbol = cast(Sym); + if (Symbol->hasRepresentedCsectSet()) { + MCSectionXCOFF *MCSect = Symbol->getRepresentedCsect(); + if (MCSect->getCSectType() == XCOFF::XTY_ER || + MCSect->getQualNameSymbol() == Symbol) + MCSect->setStorageClass(Symbol->getStorageClass()); + } +} + bool MCXCOFFStreamer::emitSymbolAttribute(MCSymbol *Sym, MCSymbolAttr Attribute) { auto *Symbol = cast(Sym); @@ -39,14 +49,17 @@ case MCSA_Extern: Symbol->setStorageClass(XCOFF::C_EXT); Symbol->setExternal(true); + setXCOFFMCSectionStorageClass(Symbol); break; case MCSA_LGlobal: Symbol->setStorageClass(XCOFF::C_HIDEXT); Symbol->setExternal(true); + setXCOFFMCSectionStorageClass(Symbol); break; case llvm::MCSA_Weak: Symbol->setStorageClass(XCOFF::C_WEAKEXT); Symbol->setExternal(true); + setXCOFFMCSectionStorageClass(Symbol); break; case llvm::MCSA_Hidden: Symbol->setVisibilityType(XCOFF::SYM_V_HIDDEN); @@ -77,6 +90,7 @@ getAssembler().registerSymbol(*Symbol); Symbol->setExternal(cast(Symbol)->getStorageClass() != XCOFF::C_HIDEXT); + setXCOFFMCSectionStorageClass(Symbol); Symbol->setCommon(Size, ByteAlignment); // Default csect align is 4, but common symbols have explicit alignment values diff --git a/llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp b/llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp --- a/llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp +++ b/llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp @@ -1705,8 +1705,6 @@ // Create the symbol, set its storage class. MCSymbolXCOFF *GVSym = cast(getSymbol(GV)); - GVSym->setStorageClass( - TargetLoweringObjectFileXCOFF::getStorageClassForGlobal(GV)); if (GV->isDeclarationForLinker()) { emitLinkage(GV, GVSym); @@ -1730,6 +1728,8 @@ if (GVKind.isCommon() || GVKind.isBSSLocal()) { Align Alignment = GV->getAlign().getValueOr(DL.getPreferredAlign(GV)); uint64_t Size = DL.getTypeAllocSize(GV->getType()->getElementType()); + GVSym->setStorageClass( + TargetLoweringObjectFileXCOFF::getStorageClassForGlobal(GV)); if (GVKind.isBSSLocal()) OutStreamer->emitXCOFFLocalCommonSymbol( @@ -1883,7 +1883,7 @@ // MCSectionXCOFF to get the correct storage mapping class. // In this case, XCOFF::XMC_PR. MCSectionXCOFF *Sec = OutContext.getXCOFFSection( - S->getName(), XCOFF::XMC_PR, XCOFF::XTY_ER, XCOFF::C_EXT, + S->getName(), XCOFF::XMC_PR, XCOFF::XTY_ER, SectionKind::getMetadata()); S->setRepresentedCsect(Sec); } @@ -1909,10 +1909,9 @@ } bool PPCAIXAsmPrinter::doFinalization(Module &M) { - bool Ret = PPCAsmPrinter::doFinalization(M); for (MCSymbol *Sym : ExtSymSDNodeSymbols) OutStreamer->emitSymbolAttribute(Sym, MCSA_Extern); - return Ret; + return PPCAsmPrinter::doFinalization(M); } /// createPPCAsmPrinterPass - Returns a pass that prints the PPC assembly code diff --git a/llvm/lib/Target/PowerPC/PPCISelLowering.cpp b/llvm/lib/Target/PowerPC/PPCISelLowering.cpp --- a/llvm/lib/Target/PowerPC/PPCISelLowering.cpp +++ b/llvm/lib/Target/PowerPC/PPCISelLowering.cpp @@ -5357,27 +5357,25 @@ Context.getOrCreateSymbol(Twine(".") + Twine(SymName))); }; - const auto getAIXFuncEntryPointSymbolSDNode = - [&](StringRef FuncName, bool IsDeclaration, - const XCOFF::StorageClass &SC) { - MCSymbolXCOFF *S = getFunctionEntryPointSymbol(FuncName); - - auto &Context = DAG.getMachineFunction().getMMI().getContext(); - - if (IsDeclaration && !S->hasRepresentedCsectSet()) { - // On AIX, an undefined symbol needs to be associated with a - // MCSectionXCOFF to get the correct storage mapping class. - // In this case, XCOFF::XMC_PR. - MCSectionXCOFF *Sec = Context.getXCOFFSection( - S->getSymbolTableName(), XCOFF::XMC_PR, XCOFF::XTY_ER, SC, - SectionKind::getMetadata()); - S->setRepresentedCsect(Sec); - } + const auto getAIXFuncEntryPointSymbolSDNode = [&](StringRef FuncName, + bool IsDeclaration) { + MCSymbolXCOFF *S = getFunctionEntryPointSymbol(FuncName); - MVT PtrVT = - DAG.getTargetLoweringInfo().getPointerTy(DAG.getDataLayout()); - return DAG.getMCSymbol(S, PtrVT); - }; + auto &Context = DAG.getMachineFunction().getMMI().getContext(); + + if (IsDeclaration && !S->hasRepresentedCsectSet()) { + // On AIX, an undefined symbol needs to be associated with a + // MCSectionXCOFF to get the correct storage mapping class. + // In this case, XCOFF::XMC_PR. + MCSectionXCOFF *Sec = + Context.getXCOFFSection(S->getSymbolTableName(), XCOFF::XMC_PR, + XCOFF::XTY_ER, SectionKind::getMetadata()); + S->setRepresentedCsect(Sec); + } + + MVT PtrVT = DAG.getTargetLoweringInfo().getPointerTy(DAG.getDataLayout()); + return DAG.getMCSymbol(S, PtrVT); + }; if (isFunctionGlobalAddress(Callee)) { const GlobalAddressSDNode *G = cast(Callee); @@ -5388,10 +5386,7 @@ UsePlt ? PPCII::MO_PLT : 0); assert(!isa(GV) && "IFunc is not supported on AIX."); - const XCOFF::StorageClass SC = - TargetLoweringObjectFileXCOFF::getStorageClassForGlobal(GV); - return getAIXFuncEntryPointSymbolSDNode(GV->getName(), GV->isDeclaration(), - SC); + return getAIXFuncEntryPointSymbolSDNode(GV->getName(), GV->isDeclaration()); } if (ExternalSymbolSDNode *S = dyn_cast(Callee)) { @@ -5402,10 +5397,8 @@ const Module *Mod = DAG.getMachineFunction().getFunction().getParent(); if (const Function *F = dyn_cast_or_null(Mod->getNamedValue(SymName))) { - const XCOFF::StorageClass SC = - TargetLoweringObjectFileXCOFF::getStorageClassForGlobal(F); return getAIXFuncEntryPointSymbolSDNode(F->getName(), - F->isDeclaration(), SC); + F->isDeclaration()); } SymName = getFunctionEntryPointSymbol(SymName)->getName().data(); }