[PATCH] D64077: [ELF] Assert sizeof(SymbolUnion) <= 80
Fangrui Song via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Thu Nov 14 11:30:12 PST 2019
MaskRay added a subscriber: mstorsjo.
MaskRay added a comment.
In D64077#1746253 <https://reviews.llvm.org/D64077#1746253>, @aykevl wrote:
> I did some monkey-patching of Symbol.h:
>
> --- a/lld/ELF/Symbols.h
> +++ b/lld/ELF/Symbols.h
> @@ -475,6 +475,12 @@ template <typename T> struct AssertSymbol {
> static_assert(sizeof(T) <= sizeof(SymbolUnion), "SymbolUnion too small");
> static_assert(alignof(T) <= alignof(SymbolUnion),
> "SymbolUnion not aligned enough");
> + static_assert(sizeof(T) <= 100, "Type bigger than 100 bytes");
> + static_assert(sizeof(T) <= 96, "Type bigger than 96 bytes");
> + static_assert(sizeof(T) <= 92, "Type bigger than 92 bytes");
> + static_assert(sizeof(T) <= 88, "Type bigger than 88 bytes");
> + static_assert(sizeof(T) <= 84, "Type bigger than 84 bytes");
> + static_assert(sizeof(T) <= 80, "Type bigger than 80 bytes");
> };
>
> static inline void assertSymbols() {
>
>
> The result is the following error:
>
> C:\ProgramData\chocolatey\bin\c++.exe -DGTEST_HAS_RTTI=0 -D_FILE_OFFSET_BITS=64 -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS -Itools/lld/ELF -ID:/a/1/s/llvm-project/lld/ELF -ID:/a/1/s/llvm-project/lld/include -Itools/lld/include -Iinclude -ID:/a/1/s/llvm-project/llvm/include -Wa,-mbig-obj -Werror=date-time -std=gnu++11 -Wall -Wextra -Wno-unused-parameter -Wwrite-strings -Wcast-qual -Wno-missing-field-initializers -pedantic -Wno-long-long -Wimplicit-fallthrough -Wno-maybe-uninitialized -Wno-class-memaccess -Wno-noexcept-type -Wdelete-non-virtual-dtor -Wno-comment -O2 -DNDEBUG -fno-exceptions -fno-rtti -MD -MT tools/lld/ELF/CMakeFiles/lldELF.dir/MapFile.cpp.obj -MF tools\lld\ELF\CMakeFiles\lldELF.dir\MapFile.cpp.obj.d -o tools/lld/ELF/CMakeFiles/lldELF.dir/MapFile.cpp.obj -c D:/a/1/s/llvm-project/lld/ELF/MapFile.cpp
> In file included from D:/a/1/s/llvm-project/lld/ELF/SymbolTable.h:13,
> from D:/a/1/s/llvm-project/lld/ELF/MapFile.cpp:25:
> D:/a/1/s/llvm-project/lld/ELF/Symbols.h:470:35: error: static assertion failed: SymbolUnion too large
> static_assert(sizeof(SymbolUnion) <= 80, "SymbolUnion too large");
> ~~~~~~~~~~~~~~~~~~~~^~~~~
> D:/a/1/s/llvm-project/lld/ELF/Symbols.h: In instantiation of 'struct lld::elf::AssertSymbol<lld::elf::Defined>':
> D:/a/1/s/llvm-project/lld/ELF/Symbols.h:487:25: required from here
> D:/a/1/s/llvm-project/lld/ELF/Symbols.h:482:27: error: static assertion failed: Type bigger than 84 bytes
> static_assert(sizeof(T) <= 84, "Type bigger than 84 bytes");
> ~~~~~~~~~~^~~~~
> D:/a/1/s/llvm-project/lld/ELF/Symbols.h:483:27: error: static assertion failed: Type bigger than 80 bytes
> static_assert(sizeof(T) <= 80, "Type bigger than 80 bytes");
> ~~~~~~~~~~^~~~~
> D:/a/1/s/llvm-project/lld/ELF/Symbols.h: In instantiation of 'struct lld::elf::AssertSymbol<lld::elf::SharedSymbol>':
> D:/a/1/s/llvm-project/lld/ELF/Symbols.h:490:30: required from here
> D:/a/1/s/llvm-project/lld/ELF/Symbols.h:482:27: error: static assertion failed: Type bigger than 84 bytes
> static_assert(sizeof(T) <= 84, "Type bigger than 84 bytes");
> ~~~~~~~~~~^~~~~
> D:/a/1/s/llvm-project/lld/ELF/Symbols.h:483:27: error: static assertion failed: Type bigger than 80 bytes
> static_assert(sizeof(T) <= 80, "Type bigger than 80 bytes");
> ~~~~~~~~~~^~~~~
>
>
> From that it looks like both `Defined` and `SharedSymbol` are bigger than 80 bytes, most likely 88 bytes.
@mstorsjo Do you have more idea about this - on `chocolatey\bin\c++.exe`, `sizeof(SymbolUnion)` is different from both Itanium and MSVC sizes?
Repository:
rL LLVM
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D64077/new/
https://reviews.llvm.org/D64077
More information about the llvm-commits
mailing list