diff --git a/llvm/include/llvm/CodeGen/BasicBlockSectionsProfileReader.h b/llvm/include/llvm/CodeGen/BasicBlockSectionsProfileReader.h --- a/llvm/include/llvm/CodeGen/BasicBlockSectionsProfileReader.h +++ b/llvm/include/llvm/CodeGen/BasicBlockSectionsProfileReader.h @@ -74,6 +74,10 @@ std::pair> getBBClusterInfoForFunction(StringRef FuncName) const; + /// Returns true if the function has a cold entry based on the basic block + /// sections profile. + bool isEntryCold(StringRef FuncName) const; + /// Read profiles of basic blocks if available here. void initializePass() override; diff --git a/llvm/include/llvm/IR/FixedMetadataKinds.def b/llvm/include/llvm/IR/FixedMetadataKinds.def --- a/llvm/include/llvm/IR/FixedMetadataKinds.def +++ b/llvm/include/llvm/IR/FixedMetadataKinds.def @@ -45,3 +45,4 @@ LLVM_FIXED_MD_KIND(MD_nosanitize, "nosanitize", 31) LLVM_FIXED_MD_KIND(MD_func_sanitize, "func_sanitize", 32) LLVM_FIXED_MD_KIND(MD_exclude, "exclude", 33) +LLVM_FIXED_MD_KIND(MD_basic_block_section_prefix, "basic_block_section_prefix", 34) diff --git a/llvm/include/llvm/IR/Function.h b/llvm/include/llvm/IR/Function.h --- a/llvm/include/llvm/IR/Function.h +++ b/llvm/include/llvm/IR/Function.h @@ -301,6 +301,12 @@ /// Get the section prefix for this function. Optional getSectionPrefix() const; + /// Set the section prefix for basic block sections of this function. + void setBasicBlockSectionPrefix(StringRef Prefix); + + /// Get the section prefix for basic block sections of this function. + Optional getBasicBlockSectionPrefix() const; + /// hasGC/getGC/setGC/clearGC - The name of the garbage collection algorithm /// to use during code generation. bool hasGC() const { diff --git a/llvm/include/llvm/IR/MDBuilder.h b/llvm/include/llvm/IR/MDBuilder.h --- a/llvm/include/llvm/IR/MDBuilder.h +++ b/llvm/include/llvm/IR/MDBuilder.h @@ -76,6 +76,10 @@ /// Return metadata containing the section prefix for a function. MDNode *createFunctionSectionPrefix(StringRef Prefix); + /// Return metadata containing the section prefix for basic block sections of + /// a function. + MDNode *createBasicBlockSectionPrefix(StringRef Prefix); + /// Return metadata containing the pseudo probe descriptor for a function. MDNode *createPseudoProbeDesc(uint64_t GUID, uint64_t Hash, Function *F); diff --git a/llvm/lib/CodeGen/BasicBlockSections.cpp b/llvm/lib/CodeGen/BasicBlockSections.cpp --- a/llvm/lib/CodeGen/BasicBlockSections.cpp +++ b/llvm/lib/CodeGen/BasicBlockSections.cpp @@ -82,15 +82,6 @@ using namespace llvm; -// Placing the cold clusters in a separate section mitigates against poor -// profiles and allows optimizations such as hugepage mapping to be applied at a -// section granularity. Defaults to ".text.split." which is recognized by lld -// via the `-z keep-text-section-prefix` flag. -cl::opt llvm::BBSectionsColdTextPrefix( - "bbsections-cold-text-prefix", - cl::desc("The text prefix to use for cold basic block clusters"), - cl::init(".text.split."), cl::Hidden); - cl::opt BBSectionsDetectSourceDrift( "bbsections-detect-source-drift", cl::desc("This checks if there is a fdo instr. profile hash " diff --git a/llvm/lib/CodeGen/BasicBlockSectionsProfileReader.cpp b/llvm/lib/CodeGen/BasicBlockSectionsProfileReader.cpp --- a/llvm/lib/CodeGen/BasicBlockSectionsProfileReader.cpp +++ b/llvm/lib/CodeGen/BasicBlockSectionsProfileReader.cpp @@ -32,6 +32,18 @@ return getBBClusterInfoForFunction(FuncName).first; } +bool BasicBlockSectionsProfileReader::isEntryCold(StringRef FuncName) const { + // The entry is cold either if the whole function is cold, or if the entry + // block is cold. + auto R = getBBClusterInfoForFunction(FuncName); + // The entry is hot iff the first cluster begins with 0. + if (!R.first) + return true; + if (R.second.empty()) + return false; + return R.second.front().MBBNumber != 0; +} + std::pair> BasicBlockSectionsProfileReader::getBBClusterInfoForFunction( StringRef FuncName) const { @@ -107,6 +119,9 @@ BBIndexStr + "'."); if (!BBIndex && CurrentPosition) return invalidProfileError("Entry BB (0) does not begin a cluster."); + if (!BBIndex && CurrentCluster) + return invalidProfileError( + "Entry BB (0) does not begin the first cluster."); FI->second.emplace_back(BBClusterInfo{ ((unsigned)BBIndex), CurrentCluster, CurrentPosition++}); diff --git a/llvm/lib/CodeGen/CodeGenPrepare.cpp b/llvm/lib/CodeGen/CodeGenPrepare.cpp --- a/llvm/lib/CodeGen/CodeGenPrepare.cpp +++ b/llvm/lib/CodeGen/CodeGenPrepare.cpp @@ -256,6 +256,17 @@ "cgp-optimize-phi-types", cl::Hidden, cl::init(false), cl::desc("Enable converting phi types in CodeGenPrepare")); +namespace llvm { + +cl::opt BBSectionsColdTextPrefix( + "bbsections-cold-text-prefix", + cl::desc("The text prefix to use for cold basic k clusters. " + "Placing the cold clusters in a separate section mitigates " + "against poor profiles and allows optimizations such as hugepage " + "mapping to be applied at a section granularity."), + cl::init("split"), cl::Hidden); +} // namespace llvm + namespace { enum ExtType { @@ -488,10 +499,16 @@ BBSectionsProfileReader = getAnalysisIfAvailable(); OptSize = F.hasOptSize(); - // Use the basic-block-sections profile to promote hot functions to .text.hot if requested. + // Use the basic-block-sections profile to promote hot functions to + // .text.hot if requested. if (BBSectionsGuidedSectionPrefix && BBSectionsProfileReader && BBSectionsProfileReader->isFunctionHot(F.getName())) { - F.setSectionPrefix("hot"); + // Function entry must be placed in .text.split if it's cold. + if (BBSectionsProfileReader->isEntryCold(F.getName())) + F.setSectionPrefix(BBSectionsColdTextPrefix); + else + F.setSectionPrefix("hot"); + F.setBasicBlockSectionPrefix("hot"); } else if (ProfileGuidedSectionPrefix) { // The hot attribute overwrites profile count based hotness while profile // counts based hotness overwrite the cold attribute. 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 @@ -1003,6 +1003,7 @@ const TargetMachine &TM) const { assert(MBB.isBeginSection() && "Basic block does not start a section!"); unsigned UniqueID = MCContext::GenericSectionID; + const MachineFunction &MF = *MBB.getParent(); // For cold sections use the .text.split. prefix along with the parent // function name. All cold blocks for the same function go to the same @@ -1010,20 +1011,38 @@ // 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 += BBSectionsColdTextPrefix; - Name += MBB.getParent()->getName(); - } else if (MBB.getSectionID() == MBBSectionID::ExceptionSectionID) { - Name += ".text.eh."; - Name += MBB.getParent()->getName(); + + if (MF.getFunction().hasSection() || + MF.getFunction().hasFnAttribute("implicit-section-name")) { + // If this function has a section attribute, use a unique section of the + // same name. + Name = MF.getSection()->getName(); + UniqueID = NextUniqueID++; } else { - Name += MBB.getParent()->getSection()->getName(); - if (TM.getUniqueBasicBlockSectionNames()) { - if (!Name.endswith(".")) - Name += "."; - Name += MBB.getSymbol()->getName(); + Name = ".text"; + if (MBB.getSectionID() == MBBSectionID::ColdSectionID) { + Name += ("." + BBSectionsColdTextPrefix + "." + MF.getName()).str(); + } else if (MBB.getSectionID() == MBBSectionID::ExceptionSectionID) { + Name += (".eh." + MF.getName()).str(); } else { - UniqueID = NextUniqueID++; + const auto &BBSectionPrefix = F.getBasicBlockSectionPrefix(); + const auto &FunctionSectionPrefix = F.getSectionPrefix(); + // Use the basic block section prefix if specified. Otherwise use the + // function section prefix. + if (BBSectionPrefix) + Name += ("." + *BBSectionPrefix).str(); + else if (FunctionSectionPrefix) + Name += ("." + *FunctionSectionPrefix).str(); + // If -unique-bb-section-names=true, augment the section name with the + // name of the symbol starting this section. Otherwise, use the function + // name and a unique id. + if (TM.getUniqueBasicBlockSectionNames()) + Name += ("." + MBB.getSymbol()->getName()).str(); + else { + if (TM.getUniqueSectionNames()) + Name += ("." + MF.getName()).str(); + UniqueID = NextUniqueID++; + } } } diff --git a/llvm/lib/IR/Function.cpp b/llvm/lib/IR/Function.cpp --- a/llvm/lib/IR/Function.cpp +++ b/llvm/lib/IR/Function.cpp @@ -2043,6 +2043,23 @@ return None; } +void Function::setBasicBlockSectionPrefix(StringRef Prefix) { + MDBuilder MDB(getContext()); + setMetadata(LLVMContext::MD_basic_block_section_prefix, + MDB.createBasicBlockSectionPrefix(Prefix)); +} + +Optional Function::getBasicBlockSectionPrefix() const { + if (MDNode *MD = getMetadata(LLVMContext::MD_basic_block_section_prefix)) { + assert(cast(MD->getOperand(0)) + ->getString() + .equals("basic_block_section_prefix") && + "Metadata not match"); + return cast(MD->getOperand(1))->getString(); + } + return None; +} + bool Function::nullPointerIsDefined() const { return hasFnAttribute(Attribute::NullPointerIsValid); } diff --git a/llvm/lib/IR/MDBuilder.cpp b/llvm/lib/IR/MDBuilder.cpp --- a/llvm/lib/IR/MDBuilder.cpp +++ b/llvm/lib/IR/MDBuilder.cpp @@ -81,6 +81,11 @@ createString(Prefix)}); } +MDNode *MDBuilder::createBasicBlockSectionPrefix(StringRef Prefix) { + return MDNode::get(Context, {createString("basic_block_section_prefix"), + createString(Prefix)}); +} + MDNode *MDBuilder::createRange(const APInt &Lo, const APInt &Hi) { assert(Lo.getBitWidth() == Hi.getBitWidth() && "Mismatched bitwidths!"); diff --git a/llvm/test/CodeGen/X86/basic-block-sections-clusters-branches.ll b/llvm/test/CodeGen/X86/basic-block-sections-clusters-branches.ll --- a/llvm/test/CodeGen/X86/basic-block-sections-clusters-branches.ll +++ b/llvm/test/CodeGen/X86/basic-block-sections-clusters-branches.ll @@ -7,7 +7,7 @@ ; RUN: echo '!foo' > %t1 ; RUN: echo '!!0 2' >> %t1 ; RUN: echo '!!1' >> %t1 -; RUN: llc < %s -O0 -mtriple=x86_64-pc-linux -function-sections -basic-block-sections=%t1 | FileCheck %s -check-prefix=LINUX-SECTIONS1 +; RUN: llc < %s -O0 -mtriple=x86_64-pc-linux -function-sections -bbsections-guided-section-prefix=false -basic-block-sections=%t1 | FileCheck %s -check-prefix=LINUX-SECTIONS1 ; ; Test2: Basic blocks #1 and #3 will be placed in the same section. ; The rest (#0 and #2) go into the function's section. @@ -15,7 +15,7 @@ ; #2 must have an explicit jump to #3. ; RUN: echo '!foo' > %t2 ; RUN: echo '!!1 3' >> %t2 -; RUN: llc < %s -O0 -mtriple=x86_64-pc-linux -function-sections -basic-block-sections=%t2 | FileCheck %s -check-prefix=LINUX-SECTIONS2 +; RUN: llc < %s -O0 -mtriple=x86_64-pc-linux -function-sections -bbsections-guided-section-prefix=false -basic-block-sections=%t2 | FileCheck %s -check-prefix=LINUX-SECTIONS2 define void @foo(i1 zeroext) nounwind { %2 = alloca i8, align 1 diff --git a/llvm/test/CodeGen/X86/basic-block-sections-clusters-error.ll b/llvm/test/CodeGen/X86/basic-block-sections-clusters-error.ll --- a/llvm/test/CodeGen/X86/basic-block-sections-clusters-error.ll +++ b/llvm/test/CodeGen/X86/basic-block-sections-clusters-error.ll @@ -16,6 +16,11 @@ ; RUN: echo '!f' >> %t4 ; RUN: not --crash llc < %s -O0 -mtriple=x86_64-pc-linux -function-sections -basic-block-sections=%t4 2>&1 | FileCheck %s --check-prefix=CHECK-ERROR4 ; CHECK-ERROR4: LLVM ERROR: Invalid profile {{.*}} at line 1: Cluster list does not follow a function name specifier. +; RUN: echo '!f' > %t5 +; RUN: echo '!!4 1' >> %t5 +; RUN: echo '!!0' >> %t5 +; RUN: not --crash llc < %s -O0 -mtriple=x86_64-pc-linux -function-sections -basic-block-sections=%t5 2>&1 | FileCheck %s --check-prefix=CHECK-ERROR5 +; CHECK-ERROR5: LLVM ERROR: Invalid profile {{.*}} at line 3: Entry BB (0) does not begin the first cluster. define i32 @dummy(i32 %x, i32 %y, i32 %z) { entry: diff --git a/llvm/test/CodeGen/X86/basic-block-sections-cold.ll b/llvm/test/CodeGen/X86/basic-block-sections-cold.ll --- a/llvm/test/CodeGen/X86/basic-block-sections-cold.ll +++ b/llvm/test/CodeGen/X86/basic-block-sections-cold.ll @@ -3,7 +3,7 @@ ; RUN: echo '!_Z3bazb' > %t ; RUN: echo '!!0' >> %t ; RUN: llc < %s -mtriple=x86_64 -function-sections -basic-block-sections=%t -unique-basic-block-section-names | FileCheck %s -check-prefix=LINUX-SECTIONS -; RUN: llc < %s -mtriple=x86_64 -function-sections -basic-block-sections=%t -unique-basic-block-section-names -bbsections-cold-text-prefix=".text.unlikely." | FileCheck %s -check-prefix=LINUX-SPLIT +; RUN: llc < %s -mtriple=x86_64 -function-sections -basic-block-sections=%t -unique-basic-block-section-names -bbsections-cold-text-prefix="unlikely" | FileCheck %s -check-prefix=LINUX-SPLIT define void @_Z3bazb(i1 zeroext %0) nounwind { br i1 %0, label %2, label %4 diff --git a/llvm/test/CodeGen/X86/basic-block-sections-directjumps.ll b/llvm/test/CodeGen/X86/basic-block-sections-directjumps.ll --- a/llvm/test/CodeGen/X86/basic-block-sections-directjumps.ll +++ b/llvm/test/CodeGen/X86/basic-block-sections-directjumps.ll @@ -30,9 +30,9 @@ ; LINUX-SECTIONS: .section .text._Z3bazb,"ax",@progbits ; LINUX-SECTIONS: _Z3bazb: ; LINUX-SECTIONS: jmp _Z3bazb.__part.1 -; LINUX-SECTIONS: .section .text._Z3bazb._Z3bazb.__part.1,"ax",@progbits +; LINUX-SECTIONS: .section .text._Z3bazb.__part.1,"ax",@progbits ; LINUX-SECTIONS: _Z3bazb.__part.1: ; LINUX-SECTIONS: jmp _Z3bazb.__part.2 -; LINUX-SECTIONS: .section .text._Z3bazb._Z3bazb.__part.2,"ax",@progbits +; LINUX-SECTIONS: .section .text._Z3bazb.__part.2,"ax",@progbits ; LINUX-SECTIONS: _Z3bazb.__part.2: ; LINUX-SECTIONS: jmp _Z3bazb.__part.3 diff --git a/llvm/test/CodeGen/X86/basic-block-sections-eh.ll b/llvm/test/CodeGen/X86/basic-block-sections-eh.ll --- a/llvm/test/CodeGen/X86/basic-block-sections-eh.ll +++ b/llvm/test/CodeGen/X86/basic-block-sections-eh.ll @@ -80,6 +80,6 @@ ;LINUX-SECTIONS: .section .text._Z3foob,"ax",@progbits ;LINUX-SECTIONS: _Z3foob: -;LINUX-SECTIONS: .section .text._Z3foob._Z3foob.__part.{{[0-9]+}},"ax",@progbits +;LINUX-SECTIONS: .section .text._Z3foob.__part.{{[0-9]+}},"ax",@progbits ;LINUX-SECTIONS-LABEL: _Z3foob.__part.{{[0-9]+}}: ;LINUX-SECTIONS: calll __cxa_begin_catch diff --git a/llvm/test/CodeGen/X86/basic-block-sections-list.ll b/llvm/test/CodeGen/X86/basic-block-sections-list.ll --- a/llvm/test/CodeGen/X86/basic-block-sections-list.ll +++ b/llvm/test/CodeGen/X86/basic-block-sections-list.ll @@ -1,6 +1,6 @@ ; Check the basic block sections list option. ; RUN: echo '!_Z3foob' > %t -; RUN: llc < %s -mtriple=x86_64-pc-linux -function-sections -basic-block-sections=%t -unique-basic-block-section-names | FileCheck %s -check-prefix=LINUX-SECTIONS --check-prefix=LINUX-SECTIONS-FUNCTION-SECTION +; RUN: llc < %s -mtriple=x86_64-pc-linux -function-sections -basic-block-sections=%t -unique-basic-block-section-names | FileCheck %s -check-prefixes=LINUX-SECTIONS,LINUX-SECTIONS-FUNCTION-SECTION ; RUN: llc < %s -mtriple=x86_64-pc-linux -basic-block-sections=%t -unique-basic-block-section-names | FileCheck %s -check-prefix=LINUX-SECTIONS --check-prefix=LINUX-SECTIONS-NO-FUNCTION-SECTION ; RUN: llc < %s -mtriple=x86_64-pc-linux -basic-block-sections=%t -unique-basic-block-section-names --bbsections-guided-section-prefix=false | FileCheck %s -check-prefix=LINUX-SECTIONS-NO-GUIDED-PREFIX @@ -59,14 +59,14 @@ ret i32 %14 } -; LINUX-SECTIONS-NO-GUIDED-PREFIX: .section .text._Z3foob,"ax",@progbits ; LINUX-SECTIONS: .section .text.hot._Z3foob,"ax",@progbits +; LINUX-SECTIONS-NO-GUIDED-PREFIX: .section .text._Z3foob,"ax",@progbits ; LINUX-SECTIONS: _Z3foob: -; LINUX-SECTIONS: .section .text.hot._Z3foob._Z3foob.__part.1,"ax",@progbits -; LINUX-SECTIONS: _Z3foob.__part.1: -; LINUX-SECTIONS: .section .text.hot._Z3foob._Z3foob.__part.2,"ax",@progbits +; LINUX-SECTIONS: .section .text.hot._Z3foob.__part.1,"ax",@progbits +; LINUX-SECTIONS-NO-GUIDED-PREFIX: .section .text._Z3foob.__part.1,"ax",@progbits +; LINUX-SECTIONS: .section .text.hot._Z3foob.__part.2,"ax",@progbits ; LINUX-SECTIONS: _Z3foob.__part.2: -; LINUX-SECTIONS: .section .text.hot._Z3foob._Z3foob.__part.3,"ax",@progbits +; LINUX-SECTIONS: .section .text.hot._Z3foob.__part.3,"ax",@progbits ; LINUX-SECTIONS: _Z3foob.__part.3: ; LINUX-SECTIONS-FUNCTION-SECTION: .section .text._Z3zipb,"ax",@progbits diff --git a/llvm/test/CodeGen/X86/basic-block-sections-listbb.ll b/llvm/test/CodeGen/X86/basic-block-sections-listbb.ll --- a/llvm/test/CodeGen/X86/basic-block-sections-listbb.ll +++ b/llvm/test/CodeGen/X86/basic-block-sections-listbb.ll @@ -1,8 +1,12 @@ ; Fine-grained basic block sections, subset of basic blocks in a function. -; Only basic block with id 2 must get a section. -; RUN: echo '!_Z3bazb' > %t -; RUN: echo '!!2' >> %t -; RUN: llc < %s -mtriple=x86_64-pc-linux -function-sections -basic-block-sections=%t -unique-basic-block-section-names | FileCheck %s -check-prefix=LINUX-SECTIONS +; Only basic block with id 2 must get a section. The function section must be placed in .text.split. +; RUN: echo '!_Z3bazb' > %t1 +; RUN: echo '!!2' >> %t1 +; RUN: llc < %s -mtriple=x86_64-pc-linux -function-sections -basic-block-sections=%t1 -unique-basic-block-section-names | FileCheck %s -check-prefixes=LINUX-SECTIONS-ENTRY-COLD,LINUX-SECTIONS +; Basic blocks 0 and 1 are placed in a section (the function section). ALl other blocks are placed in .text.split. +; RUN: echo '!_Z3bazb' > %t2 +; RUN: echo '!!0 1' >> %t2 +; RUN: llc < %s -mtriple=x86_64-pc-linux -function-sections -basic-block-sections=%t2 -unique-basic-block-section-names | FileCheck %s -DSECTION_LABEL=_Z3bazb.cold -check-prefixes=LINUX-SECTIONS-ENTRY-HOT,LINUX-SECTIONS define void @_Z3bazb(i1 zeroext) nounwind { %2 = alloca i8, align 1 @@ -30,17 +34,20 @@ ; Check that the correct block is found using the call insts for foo and bar. ; -; LINUX-SECTIONS: .section .text.hot._Z3bazb,"ax",@progbits +; LINUX-SECTIONS-ENTRY-COLD: .section .text.split._Z3bazb,"ax",@progbits +; LINUX-SECTIONS-ENTRY-HOT: .section .text.hot._Z3bazb,"ax",@progbits ; LINUX-SECTIONS: _Z3bazb: ; Check that the basic block with id 1 doesn't get a section. ; LINUX-SECTIONS-NOT: .section .text{{.*}}._Z3bazb.__part.{{[0-9]+}},"ax",@progbits ; LINUX-SECTIONS-LABEL: # %bb.1: ; LINUX-SECTIONS-NEXT: callq _Z3barv -; LINUX-SECTIONS: .section .text.hot._Z3bazb.[[SECTION_LABEL:_Z3bazb.__part.[0-9]+]],"ax",@progbits +; LINUX-SECTIONS-ENTRY-COLD: .section .text.hot.[[SECTION_LABEL:_Z3bazb.__part.[0-9]+]],"ax",@progbits +; LINUX-SECTIONS-ENTRY-HOT: .section .text.split._Z3bazb,"ax",@progbits ; LINUX-SECTIONS-NEXT: [[SECTION_LABEL]]: ; LINUX-SECTIONS-NEXT: callq _Z3foov ; LINUX-SECTIONS: .LBB_END0_2: ; LINUX-SECTIONS-NEXT: .size [[SECTION_LABEL]], .LBB_END0_2-[[SECTION_LABEL]] -; LINUX-SECTIONS: .section .text.hot._Z3bazb,"ax",@progbits +; LINUX-SECTIONS-ENTRY-COLD: .section .text.split._Z3bazb,"ax",@progbits +; LINUX-SECTIONS-ENTRY-HOT: .section .text.hot._Z3bazb,"ax",@progbits ; LINUX-SECTIONS: .Lfunc_end0: ; LINUX-SECTIONS-NEXT: .size _Z3bazb, .Lfunc_end0-_Z3bazb diff --git a/llvm/test/CodeGen/X86/basic-block-sections.ll b/llvm/test/CodeGen/X86/basic-block-sections.ll --- a/llvm/test/CodeGen/X86/basic-block-sections.ll +++ b/llvm/test/CodeGen/X86/basic-block-sections.ll @@ -31,11 +31,11 @@ ; LINUX-SECTIONS: .section .text._Z3bazb,"ax",@progbits ; LINUX-SECTIONS: _Z3bazb: -; LINUX-SECTIONS: .section .text._Z3bazb.[[SECTION_LABEL_1:_Z3bazb.__part.[0-9]+]],"ax",@progbits +; LINUX-SECTIONS: .section .text.[[SECTION_LABEL_1:_Z3bazb.__part.[0-9]+]],"ax",@progbits ; LINUX-SECTIONS: [[SECTION_LABEL_1]]: ; LINUX-SECTIONS: .LBB_END0_1: ; LINUX-SECTIONS-NEXT: .size [[SECTION_LABEL_1]], .LBB_END0_1-[[SECTION_LABEL_1]] -; LINUX-SECTIONS: .section .text._Z3bazb.[[SECTION_LABEL_2:_Z3bazb.__part.[0-9]+]],"ax",@progbits +; LINUX-SECTIONS: .section .text.[[SECTION_LABEL_2:_Z3bazb.__part.[0-9]+]],"ax",@progbits ; LINUX-SECTIONS: [[SECTION_LABEL_2]]: ; LINUX-SECTIONS: .LBB_END0_2: ; LINUX-SECTIONS-NEXT: .size [[SECTION_LABEL_2]], .LBB_END0_2-[[SECTION_LABEL_2]]