aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFangrui Song <maskray@google.com>2019-07-08 07:30:07 +0000
committerFangrui Song <maskray@google.com>2019-07-08 07:30:07 +0000
commit43375932dec2ff2d54dc2c5db253c3a35097ca03 (patch)
tree86f987fe9f501602c1bee1e5959993bb190de382
parent02536991a6000c5c0d1ec5f57ca25f2ef7b755e8 (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.h15
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);