Backport bugfix
This commit is contained in:
parent
3459d3038a
commit
7e0b429d98
126
0001-Fix-trap-value-for-non-X86.patch
Normal file
126
0001-Fix-trap-value-for-non-X86.patch
Normal file
@ -0,0 +1,126 @@
|
|||||||
|
From 868d8c360b3e1e5f291cb3e0dae0777a4529228f Mon Sep 17 00:00:00 2001
|
||||||
|
From: Denis Revunov <revunov.denis@huawei-partners.com>
|
||||||
|
Date: Thu, 27 Jul 2023 11:48:08 -0400
|
||||||
|
Subject: [PATCH] Fix trap value for non-X86
|
||||||
|
|
||||||
|
The trap value used by BOLT was assumed to be single-byte instruction.
|
||||||
|
It made some functions unaligned on AArch64(e.g exceptions-instrumentation test)
|
||||||
|
and caused emission failures. Fix that by changing fill value to StringRef.
|
||||||
|
|
||||||
|
Reviewed By: rafauler
|
||||||
|
|
||||||
|
Differential Revision: https://reviews.llvm.org/D158191
|
||||||
|
---
|
||||||
|
bolt/include/bolt/Core/MCPlusBuilder.h | 9 ++++++---
|
||||||
|
bolt/lib/Core/BinaryEmitter.cpp | 4 ++--
|
||||||
|
bolt/lib/Rewrite/RewriteInstance.cpp | 6 ++++--
|
||||||
|
bolt/lib/Target/AArch64/AArch64MCPlusBuilder.cpp | 4 ++++
|
||||||
|
bolt/lib/Target/RISCV/RISCVMCPlusBuilder.cpp | 4 ++++
|
||||||
|
bolt/lib/Target/X86/X86MCPlusBuilder.cpp | 2 +-
|
||||||
|
6 files changed, 21 insertions(+), 8 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/bolt/include/bolt/Core/MCPlusBuilder.h b/bolt/include/bolt/Core/MCPlusBuilder.h
|
||||||
|
index 56d0228cd..beb06751d 100644
|
||||||
|
--- a/bolt/include/bolt/Core/MCPlusBuilder.h
|
||||||
|
+++ b/bolt/include/bolt/Core/MCPlusBuilder.h
|
||||||
|
@@ -636,9 +636,12 @@ public:
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
- /// If non-zero, this is used to fill the executable space with instructions
|
||||||
|
- /// that will trap. Defaults to 0.
|
||||||
|
- virtual unsigned getTrapFillValue() const { return 0; }
|
||||||
|
+ /// Used to fill the executable space with instructions
|
||||||
|
+ /// that will trap.
|
||||||
|
+ virtual StringRef getTrapFillValue() const {
|
||||||
|
+ llvm_unreachable("not implemented");
|
||||||
|
+ return StringRef();
|
||||||
|
+ }
|
||||||
|
|
||||||
|
/// Interface and basic functionality of a MCInstMatcher. The idea is to make
|
||||||
|
/// it easy to match one or more MCInsts against a tree-like pattern and
|
||||||
|
diff --git a/bolt/lib/Core/BinaryEmitter.cpp b/bolt/lib/Core/BinaryEmitter.cpp
|
||||||
|
index c4129615a..df076c81d 100644
|
||||||
|
--- a/bolt/lib/Core/BinaryEmitter.cpp
|
||||||
|
+++ b/bolt/lib/Core/BinaryEmitter.cpp
|
||||||
|
@@ -376,7 +376,7 @@ bool BinaryEmitter::emitFunction(BinaryFunction &Function,
|
||||||
|
}
|
||||||
|
|
||||||
|
if (opts::MarkFuncs)
|
||||||
|
- Streamer.emitIntValue(BC.MIB->getTrapFillValue(), 1);
|
||||||
|
+ Streamer.emitBytes(BC.MIB->getTrapFillValue());
|
||||||
|
|
||||||
|
// Emit CFI end
|
||||||
|
if (Function.hasCFI())
|
||||||
|
@@ -420,7 +420,7 @@ void BinaryEmitter::emitFunctionBody(BinaryFunction &BF, FunctionFragment &FF,
|
||||||
|
// case, the call site entries in that LSDA have 0 as offset to the landing
|
||||||
|
// pad, which the runtime interprets as "no handler". To prevent this,
|
||||||
|
// insert some padding.
|
||||||
|
- Streamer.emitIntValue(BC.MIB->getTrapFillValue(), 1);
|
||||||
|
+ Streamer.emitBytes(BC.MIB->getTrapFillValue());
|
||||||
|
}
|
||||||
|
|
||||||
|
// Track the first emitted instruction with debug info.
|
||||||
|
diff --git a/bolt/lib/Rewrite/RewriteInstance.cpp b/bolt/lib/Rewrite/RewriteInstance.cpp
|
||||||
|
index fe8c134b8..c6ea0b009 100644
|
||||||
|
--- a/bolt/lib/Rewrite/RewriteInstance.cpp
|
||||||
|
+++ b/bolt/lib/Rewrite/RewriteInstance.cpp
|
||||||
|
@@ -5273,8 +5273,10 @@ void RewriteInstance::rewriteFile() {
|
||||||
|
if (!BF.getFileOffset() || !BF.isEmitted())
|
||||||
|
continue;
|
||||||
|
OS.seek(BF.getFileOffset());
|
||||||
|
- for (unsigned I = 0; I < BF.getMaxSize(); ++I)
|
||||||
|
- OS.write((unsigned char)BC->MIB->getTrapFillValue());
|
||||||
|
+ StringRef TrapInstr = BC->MIB->getTrapFillValue();
|
||||||
|
+ unsigned NInstr = BF.getMaxSize() / TrapInstr.size();
|
||||||
|
+ for (unsigned I = 0; I < NInstr; ++I)
|
||||||
|
+ OS.write(TrapInstr.data(), TrapInstr.size());
|
||||||
|
}
|
||||||
|
OS.seek(SavedPos);
|
||||||
|
}
|
||||||
|
diff --git a/bolt/lib/Target/AArch64/AArch64MCPlusBuilder.cpp b/bolt/lib/Target/AArch64/AArch64MCPlusBuilder.cpp
|
||||||
|
index acf21ba23..cd66b654e 100644
|
||||||
|
--- a/bolt/lib/Target/AArch64/AArch64MCPlusBuilder.cpp
|
||||||
|
+++ b/bolt/lib/Target/AArch64/AArch64MCPlusBuilder.cpp
|
||||||
|
@@ -1142,6 +1142,10 @@ public:
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
+ StringRef getTrapFillValue() const override {
|
||||||
|
+ return StringRef("\0\0\0\0", 4);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
bool createReturn(MCInst &Inst) const override {
|
||||||
|
Inst.setOpcode(AArch64::RET);
|
||||||
|
Inst.clear();
|
||||||
|
diff --git a/bolt/lib/Target/RISCV/RISCVMCPlusBuilder.cpp b/bolt/lib/Target/RISCV/RISCVMCPlusBuilder.cpp
|
||||||
|
index ec5bca852..badc1bde8 100644
|
||||||
|
--- a/bolt/lib/Target/RISCV/RISCVMCPlusBuilder.cpp
|
||||||
|
+++ b/bolt/lib/Target/RISCV/RISCVMCPlusBuilder.cpp
|
||||||
|
@@ -171,6 +171,10 @@ public:
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
+ StringRef getTrapFillValue() const override {
|
||||||
|
+ return StringRef("\0\0\0\0", 4);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
bool analyzeBranch(InstructionIterator Begin, InstructionIterator End,
|
||||||
|
const MCSymbol *&TBB, const MCSymbol *&FBB,
|
||||||
|
MCInst *&CondBranch,
|
||||||
|
diff --git a/bolt/lib/Target/X86/X86MCPlusBuilder.cpp b/bolt/lib/Target/X86/X86MCPlusBuilder.cpp
|
||||||
|
index 3ee161d0b..5e3c01a1c 100644
|
||||||
|
--- a/bolt/lib/Target/X86/X86MCPlusBuilder.cpp
|
||||||
|
+++ b/bolt/lib/Target/X86/X86MCPlusBuilder.cpp
|
||||||
|
@@ -397,7 +397,7 @@ public:
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
- unsigned getTrapFillValue() const override { return 0xCC; }
|
||||||
|
+ StringRef getTrapFillValue() const override { return StringRef("\314", 1); }
|
||||||
|
|
||||||
|
struct IndJmpMatcherFrag1 : MCInstMatcher {
|
||||||
|
std::unique_ptr<MCInstMatcher> Base;
|
||||||
|
--
|
||||||
|
2.33.0
|
||||||
|
|
||||||
44
0002-Add-test-for-emitting-trap-value.patch
Normal file
44
0002-Add-test-for-emitting-trap-value.patch
Normal file
@ -0,0 +1,44 @@
|
|||||||
|
From e4ae238a42296a84bc819dd1fb61f3c699952f17 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Denis Revunov <rnovds@gmail.com>
|
||||||
|
Date: Thu, 17 Aug 2023 18:30:07 +0300
|
||||||
|
Subject: [PATCH] Add test for emitting trap value
|
||||||
|
|
||||||
|
Reviewed By: rafauler
|
||||||
|
|
||||||
|
Differential Revision: https://reviews.llvm.org/D158191
|
||||||
|
---
|
||||||
|
bolt/test/runtime/mark-funcs.c | 22 ++++++++++++++++++++++
|
||||||
|
1 file changed, 22 insertions(+)
|
||||||
|
create mode 100644 bolt/test/runtime/mark-funcs.c
|
||||||
|
|
||||||
|
diff --git a/bolt/test/runtime/mark-funcs.c b/bolt/test/runtime/mark-funcs.c
|
||||||
|
new file mode 100644
|
||||||
|
index 000000000..a8586ca8b
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/bolt/test/runtime/mark-funcs.c
|
||||||
|
@@ -0,0 +1,22 @@
|
||||||
|
+#include <stdio.h>
|
||||||
|
+
|
||||||
|
+int dummy() {
|
||||||
|
+ printf("Dummy called\n");
|
||||||
|
+ return 0;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+int main(int argc, char **argv) {
|
||||||
|
+ if (dummy() != 0)
|
||||||
|
+ return 1;
|
||||||
|
+ printf("Main called\n");
|
||||||
|
+ return 0;
|
||||||
|
+}
|
||||||
|
+// Check that emitting trap value works properly and
|
||||||
|
+// does not break functions
|
||||||
|
+// REQUIRES: system-linux
|
||||||
|
+// RUN: %clangxx -Wl,-q %s -o %t.exe
|
||||||
|
+// RUN: %t.exe | FileCheck %s
|
||||||
|
+// CHECK: Dummy called
|
||||||
|
+// CHECK-NEXT: Main called
|
||||||
|
+// RUN: llvm-bolt %t.exe -o %t.exe.bolt -lite=false --mark-funcs
|
||||||
|
+// RUN: %t.exe.bolt | FileCheck %s
|
||||||
|
--
|
||||||
|
2.33.0
|
||||||
|
|
||||||
@ -22,7 +22,7 @@
|
|||||||
|
|
||||||
Name: %{pkg_name}
|
Name: %{pkg_name}
|
||||||
Version: %{bolt_version}
|
Version: %{bolt_version}
|
||||||
Release: 3
|
Release: 4
|
||||||
Summary: BOLT is a post-link optimizer developed to speed up large applications
|
Summary: BOLT is a post-link optimizer developed to speed up large applications
|
||||||
License: Apache 2.0
|
License: Apache 2.0
|
||||||
URL: https://github.com/llvm/llvm-project/tree/main/bolt
|
URL: https://github.com/llvm/llvm-project/tree/main/bolt
|
||||||
@ -30,6 +30,9 @@ URL: https://github.com/llvm/llvm-project/tree/main/bolt
|
|||||||
Source0: https://github.com/llvm/llvm-project/releases/download/llvmorg-%{bolt_version}/%{bolt_srcdir}.tar.xz
|
Source0: https://github.com/llvm/llvm-project/releases/download/llvmorg-%{bolt_version}/%{bolt_srcdir}.tar.xz
|
||||||
Source1: https://github.com/llvm/llvm-project/releases/download/llvmorg-%{bolt_version}/%{bolt_srcdir}.tar.xz.sig
|
Source1: https://github.com/llvm/llvm-project/releases/download/llvmorg-%{bolt_version}/%{bolt_srcdir}.tar.xz.sig
|
||||||
|
|
||||||
|
Patch1: 0001-Fix-trap-value-for-non-X86.patch
|
||||||
|
Patch2: 0002-Add-test-for-emitting-trap-value.patch
|
||||||
|
|
||||||
BuildRequires: gcc
|
BuildRequires: gcc
|
||||||
BuildRequires: gcc-c++
|
BuildRequires: gcc-c++
|
||||||
BuildRequires: cmake
|
BuildRequires: cmake
|
||||||
@ -140,6 +143,12 @@ rm -f %{buildroot}/%{_builddir}/%{bolt_srcdir}/%{_vpath_builddir}/%{_lib}/lib*.a
|
|||||||
%doc %{install_docdir}
|
%doc %{install_docdir}
|
||||||
|
|
||||||
%changelog
|
%changelog
|
||||||
|
* Tue Jun 18 2024 Xiong Zhou <xiongzhou4@huawei.com> 17.0.6-4
|
||||||
|
- Type:Backport
|
||||||
|
- ID:NA
|
||||||
|
- SUG:NA
|
||||||
|
- DESC: Backport bugfix.
|
||||||
|
|
||||||
* Tue Jun 18 2024 Xiong Zhou <xiongzhou4@huawei.com> 17.0.6-3
|
* Tue Jun 18 2024 Xiong Zhou <xiongzhou4@huawei.com> 17.0.6-3
|
||||||
- Type:Update
|
- Type:Update
|
||||||
- ID:NA
|
- ID:NA
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user