Index: llvm/trunk/include/llvm/Object/COFF.h =================================================================== --- llvm/trunk/include/llvm/Object/COFF.h +++ llvm/trunk/include/llvm/Object/COFF.h @@ -715,6 +715,7 @@ void moveSymbolNext(DataRefImpl &Symb) const override; Expected getSymbolName(DataRefImpl Symb) const override; Expected 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; Index: llvm/trunk/lib/Object/COFFObjectFile.cpp =================================================================== --- llvm/trunk/lib/Object/COFFObjectFile.cpp +++ llvm/trunk/lib/Object/COFFObjectFile.cpp @@ -157,6 +157,15 @@ 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 COFFObjectFile::getSymbolAddress(DataRefImpl Ref) const { uint64_t Result = getSymbolValue(Ref); COFFSymbolRef Symb = getCOFFSymbol(Ref); Index: llvm/trunk/test/ExecutionEngine/MCJIT/coff-alignment.ll =================================================================== --- llvm/trunk/test/ExecutionEngine/MCJIT/coff-alignment.ll +++ llvm/trunk/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 +}