1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-11-22 18:54:02 +01:00

[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 4dafa2234f
commit 5f0fcf1af8
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
// be more beneficial to augment the linker to ensure contiguous layout of
// 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;
// We don't want to proceed further for cold functions

View File

@ -223,6 +223,26 @@ exit:
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 @baz()
declare i32 @bam()
@ -232,6 +252,8 @@ declare i32 @__gxx_personality_v0(...)
@_ZTIi = external constant i8*
attributes #0 = { "implicit-section-name"="nosplit" }
!llvm.module.flags = !{!0}
!0 = !{i32 1, !"ProfileSummary", !1}
!1 = !{!2, !3, !4, !5, !6, !7, !8, !9}