diff --git a/llvm/lib/CodeGen/TargetLoweringObjectFileImpl.cpp b/llvm/lib/CodeGen/TargetLoweringObjectFileImpl.cpp index 6210e7fc128a3..f3ba380818901 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); diff --git a/llvm/test/CodeGen/X86/code-model-elf-sections.ll b/llvm/test/CodeGen/X86/code-model-elf-sections.ll index 716bf01bb5936..fe659fa9a46e7 100644 --- a/llvm/test/CodeGen/X86/code-model-elf-sections.ll +++ b/llvm/test/CodeGen/X86/code-model-elf-sections.ll @@ -17,6 +17,7 @@ ; RUN: llvm-readelf -S %t | FileCheck %s --check-prefix=SMALL-DS ; SMALL: .data {{.*}} WA {{.*}} +; SMALL: foo {{.*}} WA {{.*}} ; SMALL: .bss {{.*}} WA {{.*}} ; SMALL: .rodata {{.*}} A {{.*}} ; SMALL: .data.rel.ro {{.*}} WA {{.*}} @@ -24,6 +25,7 @@ ; SMALL: .tdata {{.*}} WAT {{.*}} ; SMALL-DS: .data.data {{.*}} WA {{.*}} +; SMALL-DS: foo {{.*}} WA {{.*}} ; SMALL-DS: .bss.bss {{.*}} WA {{.*}} ; SMALL-DS: .rodata.rodata {{.*}} A {{.*}} ; SMALL-DS: .data.rel.ro.relro {{.*}} WA {{.*}} @@ -31,6 +33,7 @@ ; SMALL-DS: .tdata.tdata {{.*}} WAT {{.*}} ; LARGE: .ldata {{.*}} WAl {{.*}} +; LARGE: foo {{.*}} WAl {{.*}} ; LARGE: .lbss {{.*}} WAl {{.*}} ; LARGE: .lrodata {{.*}} Al {{.*}} ; LARGE: .ldata.rel.ro {{.*}} WAl {{.*}} @@ -38,6 +41,7 @@ ; LARGE: .tdata {{.*}} WAT {{.*}} ; LARGE-DS: .ldata.data {{.*}} WAl {{.*}} +; LARGE-DS: foo {{.*}} WAl {{.*}} ; LARGE-DS: .lbss.bss {{.*}} WAl {{.*}} ; LARGE-DS: .lrodata.rodata {{.*}} Al {{.*}} ; LARGE-DS: .ldata.rel.ro.relro {{.*}} WAl {{.*}} @@ -48,6 +52,7 @@ target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" target triple = "x86_64--linux" @data = internal global [10 x i64] [i64 1, i64 2, i64 0, i64 0, i64 0, i64 0, i64 0, i64 0, i64 0, i64 0] +@data_with_explicit_section = internal global [10 x i64] [i64 1, i64 2, i64 0, i64 0, i64 0, i64 0, i64 0, i64 0, i64 0, i64 0], section "foo" @bss = internal global [10 x i64] zeroinitializer @rodata = internal constant [10 x i64] zeroinitializer @relro = internal constant [10 x ptr] [ptr @func, ptr @func, ptr @func, ptr @func, ptr @func, ptr @func, ptr @func, ptr @func, ptr @func, ptr @func]