[llvm] e9955b0 - [jitlink][ELF] Add zero-fill blocks for symbols in section SHN_COMMON
Stefan Gränitz via llvm-commits
llvm-commits at lists.llvm.org
Sat Oct 24 05:56:37 PDT 2020
Author: Stefan Gränitz
Date: 2020-10-24T14:54:38+02:00
New Revision: e9955b0843cc1e5876430f3f051494d4197419f3
URL: https://github.com/llvm/llvm-project/commit/e9955b0843cc1e5876430f3f051494d4197419f3
DIFF: https://github.com/llvm/llvm-project/commit/e9955b0843cc1e5876430f3f051494d4197419f3.diff
LOG: [jitlink][ELF] Add zero-fill blocks for symbols in section SHN_COMMON
Symbols with special section index SHN_COMMON (0xfff2) haven't been handled so far and caused an invalid section error.
This is a more or less straightforward use of the code commented out at the end of the function. I checked with the ELF spec, that the symbol value gives the alignment.
Reviewed By: lhames
Differential Revision: https://reviews.llvm.org/D89795
Added:
llvm/test/ExecutionEngine/JITLink/X86/ELF_x86-64_common.s
Modified:
llvm/lib/ExecutionEngine/JITLink/ELF_x86_64.cpp
Removed:
################################################################################
diff --git a/llvm/lib/ExecutionEngine/JITLink/ELF_x86_64.cpp b/llvm/lib/ExecutionEngine/JITLink/ELF_x86_64.cpp
index 821a7b3cc44e..4f48378186f0 100644
--- a/llvm/lib/ExecutionEngine/JITLink/ELF_x86_64.cpp
+++ b/llvm/lib/ExecutionEngine/JITLink/ELF_x86_64.cpp
@@ -510,6 +510,17 @@ class ELFLinkGraphBuilder_x86_64 {
// I am not sure on If this is going to hold as an invariant. Revisit.
if (!Name)
return Name.takeError();
+
+ if (SymRef.isCommon()) {
+ // Symbols in SHN_COMMON refer to uninitialized data. The st_value
+ // field holds alignment constraints.
+ Symbol &S =
+ G->addCommonSymbol(*Name, Scope::Default, getCommonSection(), 0,
+ SymRef.st_size, SymRef.getValue(), false);
+ JITSymbolTable[SymbolIndex] = &S;
+ continue;
+ }
+
// TODO: weak and hidden
if (SymRef.isExternal())
bindings = {Linkage::Strong, Scope::Default};
@@ -550,18 +561,12 @@ class ELFLinkGraphBuilder_x86_64 {
JITSymbolTable[SymbolIndex] = &S;
}
- // }
// TODO: The following has to be implmented.
// leaving commented out to save time for future patchs
/*
G->addAbsoluteSymbol(*Name, SymRef.getValue(), SymRef.st_size,
Linkage::Strong, Scope::Default, false);
-
- if(SymRef.isCommon()) {
- G->addCommonSymbol(*Name, Scope::Default, getCommonSection(), 0, 0,
- SymRef.getValue(), false);
- }
- */
+ */
}
}
return Error::success();
diff --git a/llvm/test/ExecutionEngine/JITLink/X86/ELF_x86-64_common.s b/llvm/test/ExecutionEngine/JITLink/X86/ELF_x86-64_common.s
new file mode 100644
index 000000000000..865b3f8aa49a
--- /dev/null
+++ b/llvm/test/ExecutionEngine/JITLink/X86/ELF_x86-64_common.s
@@ -0,0 +1,25 @@
+# RUN: rm -rf %t && mkdir -p %t
+# RUN: llvm-mc -triple=x86_64-unknown-linux -position-independent -filetype=obj -o %t/elf_common.o %s
+# RUN: llvm-jitlink -entry=load_common -noexec -check %s %t/elf_common.o
+
+ .text
+ .file "elf_common.c"
+ .globl load_common
+ .p2align 4, 0x90
+ .type load_common, at function
+
+load_common:
+# Check that common variable GOT entry is synthesized correctly. In order to
+# prevent the optimizer from relaxing the edge, we use a movl instruction.
+# jitlink-check: decode_operand(load_common, 4) = \
+# jitlink-check: got_addr(elf_common.o, common_data) - next_pc(load_common)
+# jitlink-check: *{8}(got_addr(elf_common.o, common_data)) = common_data
+ movl common_data at GOTPCREL(%rip), %eax
+ ret
+.Lfunc_end0:
+ .size load_common, .Lfunc_end0-load_common
+
+# Check that common is zero-filled.
+# jitlink-check: *{4}(common_data) = 0
+ .type common_data, at object
+ .comm common_data,4,4
More information about the llvm-commits
mailing list