[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
This commit is contained in:
parent
bf9ee26aea
commit
6b2bba14a9
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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
|
||||
}
|
Loading…
Reference in New Issue