diff options
| author | Davide Italiano <davide@freebsd.org> | 2016-11-02 17:32:19 +0000 |
|---|---|---|
| committer | Davide Italiano <davide@freebsd.org> | 2016-11-02 17:32:19 +0000 |
| commit | 6b2bba14a9266c944859fa2af9c5a311ae5c56f9 (patch) | |
| tree | d1752db081d926b78976832544968b12a1a58e44 | |
| parent | bf9ee26aeaba8bc1bf05c092a74c44fa3fca0be6 (diff) | |
| download | bcm5719-llvm-6b2bba14a9266c944859fa2af9c5a311ae5c56f9.tar.gz bcm5719-llvm-6b2bba14a9266c944859fa2af9c5a311ae5c56f9.zip | |
[lli/COFF] Set the correct alignment for common symbols
Otherwise we set it always to zero, which is not correct,
and we assert inside alignTo (Assertion failed:
Align != 0u && "Align can't be 0.").
Differential Revision: https://reviews.llvm.org/D26173
llvm-svn: 285841
| -rw-r--r-- | llvm/include/llvm/Object/COFF.h | 1 | ||||
| -rw-r--r-- | llvm/lib/Object/COFFObjectFile.cpp | 9 | ||||
| -rw-r--r-- | llvm/test/ExecutionEngine/MCJIT/coff-alignment.ll | 8 |
3 files changed, 18 insertions, 0 deletions
diff --git a/llvm/include/llvm/Object/COFF.h b/llvm/include/llvm/Object/COFF.h index e2b6beeb6b7..95e496ed35f 100644 --- a/llvm/include/llvm/Object/COFF.h +++ b/llvm/include/llvm/Object/COFF.h @@ -715,6 +715,7 @@ protected: void moveSymbolNext(DataRefImpl &Symb) const override; Expected<StringRef> getSymbolName(DataRefImpl Symb) const override; Expected<uint64_t> getSymbolAddress(DataRefImpl Symb) const override; + uint32_t getSymbolAlignment(DataRefImpl Symb) const override; uint64_t getSymbolValueImpl(DataRefImpl Symb) const override; uint64_t getCommonSymbolSizeImpl(DataRefImpl Symb) const override; uint32_t getSymbolFlags(DataRefImpl Symb) const override; diff --git a/llvm/lib/Object/COFFObjectFile.cpp b/llvm/lib/Object/COFFObjectFile.cpp index 601a7faba32..c95037f4540 100644 --- a/llvm/lib/Object/COFFObjectFile.cpp +++ b/llvm/lib/Object/COFFObjectFile.cpp @@ -157,6 +157,15 @@ uint64_t COFFObjectFile::getSymbolValueImpl(DataRefImpl Ref) const { return getCOFFSymbol(Ref).getValue(); } +uint32_t COFFObjectFile::getSymbolAlignment(DataRefImpl Ref) const { + // MSVC/link.exe seems to align symbols to the next-power-of-2 + // up to 32 bytes. + COFFSymbolRef Symb = getCOFFSymbol(Ref); + uint32_t Value = Symb.getValue(); + return std::min(uint64_t(32), + isPowerOf2_64(Value) ? Value : NextPowerOf2(Value)); +} + Expected<uint64_t> COFFObjectFile::getSymbolAddress(DataRefImpl Ref) const { uint64_t Result = getSymbolValue(Ref); COFFSymbolRef Symb = getCOFFSymbol(Ref); diff --git a/llvm/test/ExecutionEngine/MCJIT/coff-alignment.ll b/llvm/test/ExecutionEngine/MCJIT/coff-alignment.ll new file mode 100644 index 00000000000..ed45d73584c --- /dev/null +++ b/llvm/test/ExecutionEngine/MCJIT/coff-alignment.ll @@ -0,0 +1,8 @@ +; RUN: opt -mtriple=x86_64-pc-win32-coff %s -o - | lli + +@o = common global i32 0, align 4 + +define i32 @main() { + %patatino = load i32, i32* @o, align 4 + ret i32 %patatino +} |

