[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