[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