From 0cc063a8ffc896aa82ebe4b11003f0bbd78d6d5b Mon Sep 17 00:00:00 2001 From: Snehasish Kumar Date: Fri, 24 Apr 2020 14:35:19 -0700 Subject: [PATCH] Use .text.unlikely and .text.eh prefixes for MachineBasicBlock sections. Summary: Instead of adding a ".unlikely" or ".eh" suffix for machine basic blocks, this change updates the behaviour to use an appropriate prefix instead. This allows lld to group basic block sections together when -z,keep-text-section-prefix is specified and matches the behaviour observed in gcc. Reviewers: tmsriram, mtrofin, efriedma Reviewed By: tmsriram, efriedma Subscribers: eli.friedman, hiraditya, llvm-commits Tags: #llvm Differential Revision: https://reviews.llvm.org/D78742 --- llvm/lib/CodeGen/TargetLoweringObjectFileImpl.cpp | 32 +++++++++++----------- .../X86/basicblock-sections-clusters-branches.ll | 2 +- .../CodeGen/X86/basicblock-sections-clusters-eh.ll | 2 +- .../CodeGen/X86/basicblock-sections-clusters.ll | 2 +- llvm/test/CodeGen/X86/basicblock-sections-cold.ll | 2 +- 5 files changed, 20 insertions(+), 20 deletions(-) diff --git a/llvm/lib/CodeGen/TargetLoweringObjectFileImpl.cpp b/llvm/lib/CodeGen/TargetLoweringObjectFileImpl.cpp index 8ed3e86..a2dfa0a 100644 --- a/llvm/lib/CodeGen/TargetLoweringObjectFileImpl.cpp +++ b/llvm/lib/CodeGen/TargetLoweringObjectFileImpl.cpp @@ -859,28 +859,28 @@ MCSection *TargetLoweringObjectFileELF::getSectionForMachineBasicBlock( const Function &F, const MachineBasicBlock &MBB, const TargetMachine &TM) const { assert(MBB.isBeginSection() && "Basic block does not start a section!"); - SmallString<128> Name; - Name = - (static_cast(MBB.getParent()->getSection()))->getName(); unsigned UniqueID = MCContext::GenericSectionID; - switch (MBB.getSectionID().Type) { - // Append suffixes to represent special cold and exception sections. - case MBBSectionID::SectionType::Exception: - Name += ".eh"; - break; - case MBBSectionID::SectionType::Cold: - Name += ".unlikely"; - break; - // For regular sections, either use a unique name, or a unique ID for the - // section. - default: + // For cold sections use the .text.unlikely prefix along with the parent + // function name. All cold blocks for the same function go to the same + // section. Similarly all exception blocks are grouped by symbol name + // under the .text.eh prefix. For regular sections, we either use a unique + // name, or a unique ID for the section. + SmallString<128> Name; + if (MBB.getSectionID() == MBBSectionID::ColdSectionID) { + Name += ".text.unlikely."; + Name += MBB.getParent()->getName(); + } else if (MBB.getSectionID() == MBBSectionID::ExceptionSectionID) { + Name += ".text.eh."; + Name += MBB.getParent()->getName(); + } else { + Name += MBB.getParent()->getSection()->getName(); if (TM.getUniqueBBSectionNames()) { Name += "."; Name += MBB.getSymbol()->getName(); - } else + } else { UniqueID = NextUniqueID++; - break; + } } unsigned Flags = ELF::SHF_ALLOC | ELF::SHF_EXECINSTR; diff --git a/llvm/test/CodeGen/X86/basicblock-sections-clusters-branches.ll b/llvm/test/CodeGen/X86/basicblock-sections-clusters-branches.ll index 9baea85..c85f01b 100644 --- a/llvm/test/CodeGen/X86/basicblock-sections-clusters-branches.ll +++ b/llvm/test/CodeGen/X86/basicblock-sections-clusters-branches.ll @@ -50,7 +50,7 @@ declare i32 @baz() #1 ; LINUX-SECTIONS1: .section .text.foo,"ax",@progbits,unique,1 ; LINUX-SECTIONS1-LABEL: a.BB.foo: ; LINUX-SECTIONS1: jmp raa.BB.foo -; LINUX-SECTIONS1: .section .text.foo.unlikely,"ax",@progbits +; LINUX-SECTIONS1: .section .text.unlikely.foo,"ax",@progbits ; LINUX-SECTIONS1-LABEL: raa.BB.foo: ; LINUX-SECTIONS2: .section .text.foo,"ax",@progbits diff --git a/llvm/test/CodeGen/X86/basicblock-sections-clusters-eh.ll b/llvm/test/CodeGen/X86/basicblock-sections-clusters-eh.ll index f4e6ef3..cadbdd3 100644 --- a/llvm/test/CodeGen/X86/basicblock-sections-clusters-eh.ll +++ b/llvm/test/CodeGen/X86/basicblock-sections-clusters-eh.ll @@ -62,7 +62,7 @@ declare i32 @__gxx_personality_v0(...) ; LINUX-SECTIONS1-LABEL: .LBB0_6: ; LINUX-SECTIONS1: .section .text.main,"ax",@progbits,unique,1 ; LINUX-SECTIONS1-LABEL: al.BB.main: -; LINUX-SECTIONS1: .section .text.main.eh,"ax",@progbits +; LINUX-SECTIONS1: .section .text.eh.main,"ax",@progbits ; LINUX-SECTIONS1-LABEL: l.BB.main: ; LINUX-SECTIONS1-NOT: .section ; LINUX-SECTIONS1-LABEL: .LBB0_3: diff --git a/llvm/test/CodeGen/X86/basicblock-sections-clusters.ll b/llvm/test/CodeGen/X86/basicblock-sections-clusters.ll index 3daf3a3..39d0b38 100644 --- a/llvm/test/CodeGen/X86/basicblock-sections-clusters.ll +++ b/llvm/test/CodeGen/X86/basicblock-sections-clusters.ll @@ -48,7 +48,7 @@ declare i32 @baz() #1 ; LINUX-SECTIONS1-LABEL: .Ltmp0: ; LINUX-SECTIONS1-NEXT: .size a.BB.foo, .Ltmp0-a.BB.foo ; LINUX-SECTIONS1-NOT: .section -; LINUX-SECTIONS1: .section .text.foo.unlikely,"ax",@progbits +; LINUX-SECTIONS1: .section .text.unlikely.foo,"ax",@progbits ; LINUX-SECTIONS1-LABEL: raa.BB.foo: ; LINUX-SECTIONS1: .section .text.foo,"ax",@progbits ; LINUX-SECTIONS1-LABEL: .Lfunc_end0: diff --git a/llvm/test/CodeGen/X86/basicblock-sections-cold.ll b/llvm/test/CodeGen/X86/basicblock-sections-cold.ll index 114ea8f..b2a36e8 100644 --- a/llvm/test/CodeGen/X86/basicblock-sections-cold.ll +++ b/llvm/test/CodeGen/X86/basicblock-sections-cold.ll @@ -34,7 +34,7 @@ declare i32 @_Z3foov() #1 ; Check that the basic block with id 1 doesn't get a section. ; LINUX-SECTIONS-NOT: .section .text._Z3bazb.r.BB._Z3bazb,"ax",@progbits,unique ; Check that a single cold section is started here and id 1 and 2 blocks are placed here. -; LINUX-SECTIONS: .section .text._Z3bazb.unlikely,"ax",@progbits +; LINUX-SECTIONS: .section .text.unlikely._Z3bazb,"ax",@progbits ; LINUX-SECTIONS: r.BB._Z3bazb: ; LINUX-SECTIONS-NOT: .section .text._Z3bazb.rr.BB._Z3bazb,"ax",@progbits,unique ; LINUX-SECTIONS: .LBB0_2: -- 2.7.4