================
@@ -2857,3 +2861,45 @@ MCSection
*TargetLoweringObjectFileGOFF::SelectSectionForGlobal(
}
return TextSection;
}
+
+static MCSectionGOFF *getStaticStructorSectionGOFF(MCContext &Ctx,
+ const MCSection
*TextSection,
+ unsigned Priority) {
+ // xl compilers on z/OS support priorities from min-int to max-int, with
+ // sinit as source priority 0. For clang, sinit has source priority 65535.
+ // For GOFF, the priority sortkey field is an unsigned value. So, we
+ // add min-int to get sorting to work properly but also subtract the
+ // clang sinit (65535) value so internally xl sinit and clang sinit have
+ // the same unsigned GOFF priority sortkey field value (i.e. 0x80000000).
+ static constexpr const uint32_t ClangDefaultSinitPriority = 65535;
+ uint32_t Prio = Priority + (0x80000000 - ClangDefaultSinitPriority);
+
+ std::string Name(".xtor");
+ if (Priority != ClangDefaultSinitPriority)
+ Name = llvm::Twine(Name).concat(".").concat(llvm::utostr(Priority)).str();
+
+ MCSectionGOFF *SInit = Ctx.getGOFFSection(
+ SectionKind::getMetadata(), GOFF::CLASS_SINIT,
+ GOFF::EDAttr{false, GOFF::ESD_RMODE_64, GOFF::ESD_NS_Parts,
+ GOFF::ESD_TS_ByteOriented, GOFF::ESD_BA_Merge,
+ GOFF::ESD_LB_Initial, GOFF::ESD_RQ_0,
+ GOFF::ESD_ALIGN_Doubleword},
+ static_cast<const MCSectionGOFF *>(TextSection)->getParent());
+
+ MCSectionGOFF *Xtor = Ctx.getGOFFSection(
+ SectionKind::getData(), Name,
+ GOFF::PRAttr{true, GOFF::ESD_EXE_DATA, GOFF::ESD_LT_XPLink,
+ GOFF::ESD_BSC_Section, Prio},
+ SInit);
+ return Xtor;
+}
+
+MCSection *TargetLoweringObjectFileGOFF::getStaticCtorSection(
+ unsigned Priority, const MCSymbol *KeySym) const {
+ return getStaticStructorSectionGOFF(getContext(), TextSection, Priority);
+}
+
+MCSection *TargetLoweringObjectFileGOFF::getStaticDtorSection(
+ unsigned Priority, const MCSymbol *KeySym) const {
+ return getStaticStructorSectionGOFF(getContext(), TextSection, Priority);
+}
----------------
uweigand wrote:
It's still a bit weird to have these two functions that do the same thing. I
understand this is to mirror what other platforms do, but on those the sections
are in fact different ... Maybe it would be better to just have a single
`getStaticXtorSection` on GOFF instead, if that matches more directly what GOFF
actually does ...
https://github.com/llvm/llvm-project/pull/171476
_______________________________________________
llvm-branch-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits