summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--bolt/lib/Rewrite/RewriteInstance.cpp10
-rw-r--r--bolt/test/X86/section-end-sym.s29
2 files changed, 39 insertions, 0 deletions
diff --git a/bolt/lib/Rewrite/RewriteInstance.cpp b/bolt/lib/Rewrite/RewriteInstance.cpp
index 04ccbcf20de1..57e41d5b5724 100644
--- a/bolt/lib/Rewrite/RewriteInstance.cpp
+++ b/bolt/lib/Rewrite/RewriteInstance.cpp
@@ -1050,6 +1050,16 @@ void RewriteInstance::discoverFileObjects() {
LLVM_DEBUG(dbgs() << "BOLT-DEBUG: considering symbol " << UniqueName
<< " for function\n");
+ if (Address == Section->getAddress() + Section->getSize()) {
+ assert(SymbolSize == 0 &&
+ "unexpect non-zero sized symbol at end of section");
+ LLVM_DEBUG(
+ dbgs()
+ << "BOLT-DEBUG: rejecting as symbol points to end of its section\n");
+ registerName(SymbolSize);
+ continue;
+ }
+
if (!Section->isText()) {
assert(SymbolType != SymbolRef::ST_Function &&
"unexpected function inside non-code section");
diff --git a/bolt/test/X86/section-end-sym.s b/bolt/test/X86/section-end-sym.s
new file mode 100644
index 000000000000..a9bca5604ec1
--- /dev/null
+++ b/bolt/test/X86/section-end-sym.s
@@ -0,0 +1,29 @@
+## Check that BOLT doesn't consider end-of-section symbols (e.g., _etext) as
+## functions.
+
+# 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 /dev/null --print-cfg --debug-only=bolt 2>&1 \
+# RUN: | FileCheck %s
+
+# CHECK: considering symbol etext for function
+# CHECK-NEXT: rejecting as symbol points to end of its section
+# CHECK-NOT: Binary Function "etext{{.*}}" after building cfg
+
+
+ .text
+ .globl _start
+ .type _start,@function
+_start:
+ retq
+ .size _start, .-_start
+
+ .align 0x1000
+ .globl etext
+etext:
+
+ .data
+.Lfoo:
+ .word 0