[llvm] 66abe65 - Reapply "[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 08:01:29 PDT 2020


Author: Stefan Gränitz
Date: 2020-10-24T16:58:06+02:00
New Revision: 66abe650fff6031074171ea9c7c6aa180bc2cbe9

URL: https://github.com/llvm/llvm-project/commit/66abe650fff6031074171ea9c7c6aa180bc2cbe9
DIFF: https://github.com/llvm/llvm-project/commit/66abe650fff6031074171ea9c7c6aa180bc2cbe9.diff

LOG: Reapply "[jitlink][ELF] Add zero-fill blocks for symbols in section SHN_COMMON"

Root cause of the test failure was fixed with:
[JITLink][ELF] PCRel32GOTLoad edge offset can be smaller three

This reverts commit 10b1a61bafba39fd7400a814a7272f41222ad579.

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 fb931c3d85e9..813875d14d0e 100644
--- a/llvm/lib/ExecutionEngine/JITLink/ELF_x86_64.cpp
+++ b/llvm/lib/ExecutionEngine/JITLink/ELF_x86_64.cpp
@@ -509,6 +509,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};
@@ -549,18 +560,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