[llvm] 22d7a01 - [JITLink] Allow zero-length symbols at the end of blocks.
Lang Hames via llvm-commits
llvm-commits at lists.llvm.org
Fri Jun 19 10:06:25 PDT 2020
Author: Lang Hames
Date: 2020-06-19T10:05:02-07:00
New Revision: 22d7a01dd7282ee5e70ce57a8c1465fd335ea27d
URL: https://github.com/llvm/llvm-project/commit/22d7a01dd7282ee5e70ce57a8c1465fd335ea27d
DIFF: https://github.com/llvm/llvm-project/commit/22d7a01dd7282ee5e70ce57a8c1465fd335ea27d.diff
LOG: [JITLink] Allow zero-length symbols at the end of blocks.
This relaxes an assertion that required symbols to start before the end
of a block. Instead, symbols are now required to end on or before the
end of a block. This fixes two important corner cases: Symbols at the
start of empty blocks/sections, and block/section end symbols.
Added:
llvm/test/ExecutionEngine/JITLink/X86/MachO_empty_section.s
Modified:
llvm/include/llvm/ExecutionEngine/JITLink/JITLink.h
Removed:
################################################################################
diff --git a/llvm/include/llvm/ExecutionEngine/JITLink/JITLink.h b/llvm/include/llvm/ExecutionEngine/JITLink/JITLink.h
index 000dd18fb373..76f9dea4160f 100644
--- a/llvm/include/llvm/ExecutionEngine/JITLink/JITLink.h
+++ b/llvm/include/llvm/ExecutionEngine/JITLink/JITLink.h
@@ -352,7 +352,8 @@ class Symbol {
JITTargetAddress Size, bool IsCallable,
bool IsLive) {
assert(SymStorage && "Storage cannot be null");
- assert(Offset < Base.getSize() && "Symbol offset is outside block");
+ assert((Offset + Size) <= Base.getSize() &&
+ "Symbol extends past end of block");
auto *Sym = reinterpret_cast<Symbol *>(SymStorage);
new (Sym) Symbol(Base, Offset, StringRef(), Size, Linkage::Strong,
Scope::Local, IsLive, IsCallable);
@@ -364,7 +365,8 @@ class Symbol {
JITTargetAddress Size, Linkage L, Scope S,
bool IsLive, bool IsCallable) {
assert(SymStorage && "Storage cannot be null");
- assert(Offset < Base.getSize() && "Symbol offset is outside block");
+ assert((Offset + Size) <= Base.getSize() &&
+ "Symbol extends past end of block");
assert(!Name.empty() && "Name cannot be empty");
auto *Sym = reinterpret_cast<Symbol *>(SymStorage);
new (Sym) Symbol(Base, Offset, Name, Size, L, S, IsLive, IsCallable);
diff --git a/llvm/test/ExecutionEngine/JITLink/X86/MachO_empty_section.s b/llvm/test/ExecutionEngine/JITLink/X86/MachO_empty_section.s
new file mode 100644
index 000000000000..f0787ea5f515
--- /dev/null
+++ b/llvm/test/ExecutionEngine/JITLink/X86/MachO_empty_section.s
@@ -0,0 +1,16 @@
+# RUN: llvm-mc -triple=x86_64-apple-macosx10.9 -filetype=obj -o %t.o %s
+# RUN: llvm-jitlink -noexec -entry hook %t.o
+#
+# Make sure that an empty __text section doesn't cause any problems.
+
+ .section __TEXT,__text,regular,pure_instructions
+ .macosx_version_min 10, 15
+l_empty:
+
+ .section __TEXT,__const
+ .globl hook
+ .p2align 2
+hook:
+ .long 42
+
+.subsections_via_symbols
More information about the llvm-commits
mailing list