[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