[PATCH] D133978: [BOLT] Fix empty function emission in non-relocation mode
Maksim Panchenko via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Fri Sep 16 13:38:50 PDT 2022
This revision was automatically updated to reflect the committed changes.
Closed by commit rG9742c25b9894: [BOLT] Fix empty function emission in non-relocation mode (authored by maksfb).
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D133978/new/
https://reviews.llvm.org/D133978
Files:
bolt/include/bolt/Core/BinaryFunction.h
bolt/lib/Core/BinaryEmitter.cpp
bolt/test/X86/nop-function.s
Index: bolt/test/X86/nop-function.s
===================================================================
--- /dev/null
+++ bolt/test/X86/nop-function.s
@@ -0,0 +1,30 @@
+## Check that BOLT preserves nop instruction if it's the only instruction
+## in a function.
+
+# REQUIRES: system-linux
+
+# RUN: llvm-mc -filetype=obj -triple x86_64-unknown-linux %s -o %t.o
+# RUN: ld.lld %t.o -o %t.exe -q
+# RUN: llvm-bolt %t.exe -o %t.bolt.exe --relocs=0
+# RUN: llvm-objdump -d %t.bolt.exe | FileCheck %s
+
+ .text
+ .globl nop_function
+ .type nop_function, at function
+nop_function:
+ .cfi_startproc
+ nop
+# CHECK: <nop_function>:
+# CHECK-NEXT: nop
+
+ .size nop_function, .-nop_function
+ .cfi_endproc
+
+
+ .globl _start
+ .type _start, at function
+_start:
+ .cfi_startproc
+ call nop_function
+ .size _start, .-_start
+ .cfi_endproc
Index: bolt/lib/Core/BinaryEmitter.cpp
===================================================================
--- bolt/lib/Core/BinaryEmitter.cpp
+++ bolt/lib/Core/BinaryEmitter.cpp
@@ -287,6 +287,11 @@
if (Function.getState() == BinaryFunction::State::Empty)
return false;
+ // Avoid emitting function without instructions when overwriting the original
+ // function in-place. Otherwise, emit the empty function to define the symbol.
+ if (!BC.HasRelocations && !Function.hasNonPseudoInstructions())
+ return false;
+
MCSection *Section =
BC.getCodeSection(Function.getCodeSectionName(FF.getFragmentNum()));
Streamer.switchSection(Section);
Index: bolt/include/bolt/Core/BinaryFunction.h
===================================================================
--- bolt/include/bolt/Core/BinaryFunction.h
+++ bolt/include/bolt/Core/BinaryFunction.h
@@ -1074,6 +1074,14 @@
return N;
}
+ /// Return true if function has instructions to emit.
+ bool hasNonPseudoInstructions() const {
+ for (const BinaryBasicBlock &BB : blocks())
+ if (BB.getNumNonPseudos() > 0)
+ return true;
+ return false;
+ }
+
/// Return MC symbol associated with the function.
/// All references to the function should use this symbol.
MCSymbol *getSymbol(const FragmentNum Fragment = FragmentNum::main()) {
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D133978.460886.patch
Type: text/x-patch
Size: 2183 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20220916/507a3fa5/attachment.bin>
More information about the llvm-commits
mailing list