diff options
author | Fangrui Song <maskray@google.com> | 2019-07-08 07:30:07 +0000 |
---|---|---|
committer | Fangrui Song <maskray@google.com> | 2019-07-08 07:30:07 +0000 |
commit | 43375932dec2ff2d54dc2c5db253c3a35097ca03 (patch) | |
tree | 86f987fe9f501602c1bee1e5959993bb190de382 | |
parent | 02536991a6000c5c0d1ec5f57ca25f2ef7b755e8 (diff) |
[WebAssembly] Add static_assert(sizeof(SymbolUnion) <= 96)
On Windows, the bitfield layout rule places `ussigned Referenced : 1` at
byte offset 40, instead of byte offset 37 on *NIX. The consequence is that
sizeof(SymbolUnion) == 104 on Windows while 96 on *NIX.
To eliminate this difference, change these unsigned bitfields to bool.
Reviewed By: ruiu
Differential Revision: https://reviews.llvm.org/D64238
git-svn-id: https://llvm.org/svn/llvm-project/lld/trunk@365296 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | wasm/Symbols.h | 15 |
1 files changed, 10 insertions, 5 deletions
diff --git a/wasm/Symbols.h b/wasm/Symbols.h index cb3c73e10..128ea9348 100644 --- a/wasm/Symbols.h +++ b/wasm/Symbols.h @@ -131,26 +131,26 @@ protected: uint32_t OutputSymbolIndex = INVALID_INDEX; uint32_t GOTIndex = INVALID_INDEX; Kind SymbolKind; - unsigned Referenced : 1; + bool Referenced : 1; public: // True if the symbol was used for linking and thus need to be added to the // output file's symbol table. This is true for all symbols except for // unreferenced DSO symbols, lazy (archive) symbols, and bitcode symbols that // are unreferenced except by other bitcode objects. - unsigned IsUsedInRegularObj : 1; + bool IsUsedInRegularObj : 1; // True if ths symbol is explicity marked for export (i.e. via the -e/--export // command line flag) - unsigned ForceExport : 1; + bool ForceExport : 1; // False if LTO shouldn't inline whatever this symbol points to. If a symbol // is overwritten after LTO, LTO shouldn't inline the symbol because it // doesn't know the final contents of the symbol. - unsigned CanInline : 1; + bool CanInline : 1; // True if this symbol is specified by --trace-symbol option. - unsigned Traced : 1; + bool Traced : 1; }; class FunctionSymbol : public Symbol { @@ -475,6 +475,11 @@ union SymbolUnion { alignas(SectionSymbol) char I[sizeof(SectionSymbol)]; }; +// It is important to keep the size of SymbolUnion small for performance and +// memory usage reasons. 96 bytes is a soft limit based on the size of +// UndefinedFunction on a 64-bit system. +static_assert(sizeof(SymbolUnion) <= 96, "SymbolUnion too large"); + void printTraceSymbol(Symbol *Sym); void printTraceSymbolUndefined(StringRef Name, const InputFile* File); |