From f3ea73133f91c1c23596d45680c8f2269c1dd289 Mon Sep 17 00:00:00 2001 From: Arthur Eubanks Date: Wed, 18 Oct 2023 16:24:23 -0700 Subject: [ELF] Set large section flag for globals with an explicit section (#69396) An oversight in https://reviews.llvm.org/D148836 since this is a different code path. --- llvm/lib/CodeGen/TargetLoweringObjectFileImpl.cpp | 43 ++++++++++++----------- 1 file changed, 23 insertions(+), 20 deletions(-) (limited to 'llvm/lib/CodeGen/TargetLoweringObjectFileImpl.cpp') diff --git a/llvm/lib/CodeGen/TargetLoweringObjectFileImpl.cpp b/llvm/lib/CodeGen/TargetLoweringObjectFileImpl.cpp index 6210e7fc128a..f3ba38081890 100644 --- a/llvm/lib/CodeGen/TargetLoweringObjectFileImpl.cpp +++ b/llvm/lib/CodeGen/TargetLoweringObjectFileImpl.cpp @@ -763,6 +763,25 @@ calcUniqueIDUpdateFlagsAndSize(const GlobalObject *GO, StringRef SectionName, return NextUniqueID++; } +static std::tuple +getGlobalObjectInfo(const GlobalObject *GO, const TargetMachine &TM) { + StringRef Group = ""; + bool IsComdat = false; + unsigned Flags = 0; + if (const Comdat *C = getELFComdat(GO)) { + Flags |= ELF::SHF_GROUP; + Group = C->getName(); + IsComdat = C->getSelectionKind() == Comdat::Any; + } + if (auto *GV = dyn_cast(GO)) { + if (TM.isLargeData(GV)) { + assert(TM.getTargetTriple().getArch() == Triple::x86_64); + Flags |= ELF::SHF_X86_64_LARGE; + } + } + return {Group, IsComdat, Flags}; +} + static MCSection *selectExplicitSectionGlobal( const GlobalObject *GO, SectionKind Kind, const TargetMachine &TM, MCContext &Ctx, Mangler &Mang, unsigned &NextUniqueID, @@ -793,14 +812,9 @@ static MCSection *selectExplicitSectionGlobal( // Infer section flags from the section name if we can. Kind = getELFKindForNamedSection(SectionName, Kind); - StringRef Group = ""; - bool IsComdat = false; unsigned Flags = getELFSectionFlags(Kind); - if (const Comdat *C = getELFComdat(GO)) { - Group = C->getName(); - IsComdat = C->getSelectionKind() == Comdat::Any; - Flags |= ELF::SHF_GROUP; - } + auto [Group, IsComdat, ExtraFlags] = getGlobalObjectInfo(GO, TM); + Flags |= ExtraFlags; unsigned EntrySize = getEntrySizeForKind(Kind); const unsigned UniqueID = calcUniqueIDUpdateFlagsAndSize( @@ -848,19 +862,8 @@ static MCSectionELF *selectELFSectionForGlobal( const TargetMachine &TM, bool EmitUniqueSection, unsigned Flags, unsigned *NextUniqueID, const MCSymbolELF *AssociatedSymbol) { - StringRef Group = ""; - bool IsComdat = false; - if (const Comdat *C = getELFComdat(GO)) { - Flags |= ELF::SHF_GROUP; - Group = C->getName(); - IsComdat = C->getSelectionKind() == Comdat::Any; - } - if (auto *GV = dyn_cast(GO)) { - if (TM.isLargeData(GV)) { - assert(TM.getTargetTriple().getArch() == Triple::x86_64); - Flags |= ELF::SHF_X86_64_LARGE; - } - } + auto [Group, IsComdat, ExtraFlags] = getGlobalObjectInfo(GO, TM); + Flags |= ExtraFlags; // Get the section entry size based on the kind. unsigned EntrySize = getEntrySizeForKind(Kind); -- cgit v1.2.3