diff --git a/llvm/lib/ExecutionEngine/JITLink/ELF_x86_64.cpp b/llvm/lib/ExecutionEngine/JITLink/ELF_x86_64.cpp --- a/llvm/lib/ExecutionEngine/JITLink/ELF_x86_64.cpp +++ b/llvm/lib/ExecutionEngine/JITLink/ELF_x86_64.cpp @@ -510,6 +510,17 @@ // 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 @@ 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 --- /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,@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@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,@object + .comm common_data,4,4