[CodeGen] Do not split functions with attr "implicit-section-name".

The #pragma clang section can be used at a coarse granularity to specify
the section used for bss/data/text/rodata for global objects. When split
functions is enabled, the function may be split into two parts violating
user expectations.

Reference:
https://clang.llvm.org/docs/LanguageExtensions.html#specifying-section-names-for-global-objects-pragma-clang-section

Differential Revision: https://reviews.llvm.org/D101004
This commit is contained in:
Snehasish Kumar 2021-04-21 14:41:12 -07:00
parent e4fa0b307f
commit 8077d0ff5c
2 changed files with 24 additions and 1 deletions

View File

@ -101,7 +101,8 @@ bool MachineFunctionSplitter::runOnMachineFunction(MachineFunction &MF) {
// since the split part may not be placed in a contiguous region. It may also // since the split part may not be placed in a contiguous region. It may also
// be more beneficial to augment the linker to ensure contiguous layout of // be more beneficial to augment the linker to ensure contiguous layout of
// split functions within the same section as specified by the attribute. // split functions within the same section as specified by the attribute.
if (!MF.getFunction().getSection().empty()) if (!MF.getFunction().getSection().empty() ||
MF.getFunction().hasFnAttribute("implicit-section-name"))
return false; return false;
// We don't want to proceed further for cold functions // We don't want to proceed further for cold functions

View File

@ -223,6 +223,26 @@ exit:
ret i32 %5 ret i32 %5
} }
define void @foo9(i1 zeroext %0) nounwind #0 !prof !14 {
;; Check that function with section attribute is not split.
; MFS-DEFAULTS-LABEL: foo9
; MFS-DEFAULTS-NOT: foo9.cold:
br i1 %0, label %2, label %4, !prof !17
2: ; preds = %1
%3 = call i32 @bar()
br label %6
4: ; preds = %1
%5 = call i32 @baz()
br label %6
6: ; preds = %4, %2
%7 = tail call i32 @qux()
ret void
}
declare i32 @bar() declare i32 @bar()
declare i32 @baz() declare i32 @baz()
declare i32 @bam() declare i32 @bam()
@ -232,6 +252,8 @@ declare i32 @__gxx_personality_v0(...)
@_ZTIi = external constant i8* @_ZTIi = external constant i8*
attributes #0 = { "implicit-section-name"="nosplit" }
!llvm.module.flags = !{!0} !llvm.module.flags = !{!0}
!0 = !{i32 1, !"ProfileSummary", !1} !0 = !{i32 1, !"ProfileSummary", !1}
!1 = !{!2, !3, !4, !5, !6, !7, !8, !9} !1 = !{!2, !3, !4, !5, !6, !7, !8, !9}