Index: tools/lld/docs/ReleaseNotes.rst =================================================================== --- tools/lld/docs/ReleaseNotes.rst +++ tools/lld/docs/ReleaseNotes.rst @@ -44,4 +44,7 @@ WebAssembly Improvements ------------------------ -* ... +* `__data_end` and `__heap_base` are no longer exported by default, + as it's best to keep them internal when possible. They can be + explicitly exported with `--export=__data_end` and + `--export=__heap_base`, respectively. Index: tools/lld/docs/WebAssembly.rst =================================================================== --- tools/lld/docs/WebAssembly.rst +++ tools/lld/docs/WebAssembly.rst @@ -109,7 +109,7 @@ and use these stub functions at the otherwise invalid call sites. The default behaviour is to generate these stub function and to produce -a warning. The ``--falal-warnings`` flag can be used to disable this behaviour +a warning. The ``--fatal-warnings`` flag can be used to disable this behaviour and error out if mismatched are found. Imports and Exports Index: tools/lld/wasm/LTO.cpp =================================================================== --- tools/lld/wasm/LTO.cpp +++ tools/lld/wasm/LTO.cpp @@ -105,6 +105,7 @@ // be removed. r.Prevailing = !objSym.isUndefined() && sym->getFile() == &f; r.VisibleToRegularObj = config->relocatable || sym->isUsedInRegularObj || + sym->isNoStrip() || (r.Prevailing && sym->isExported()); if (r.Prevailing) undefine(sym); Index: tools/lld/wasm/MarkLive.cpp =================================================================== --- tools/lld/wasm/MarkLive.cpp +++ tools/lld/wasm/MarkLive.cpp @@ -71,7 +71,7 @@ // We need to preserve any exported symbol for (Symbol *sym : symtab->getSymbols()) - if (sym->isExported()) + if (sym->isNoStrip() || sym->isExported()) enqueue(sym); // For relocatable output, we need to preserve all the ctor functions Index: tools/lld/wasm/Symbols.h =================================================================== --- tools/lld/wasm/Symbols.h +++ tools/lld/wasm/Symbols.h @@ -107,6 +107,10 @@ WasmSymbolType getWasmType() const; bool isExported() const; + // Indicates that the symbol is used in an __attribute__((used)) directive + // or similar. + bool isNoStrip() const; + const WasmSignature* getSignature() const; bool isInGOT() const { return gotIndex != INVALID_INDEX; } Index: tools/lld/wasm/Symbols.cpp =================================================================== --- tools/lld/wasm/Symbols.cpp +++ tools/lld/wasm/Symbols.cpp @@ -155,6 +155,10 @@ return flags & WASM_SYMBOL_EXPORTED; } +bool Symbol::isNoStrip() const { + return flags & WASM_SYMBOL_NO_STRIP; +} + uint32_t FunctionSymbol::getFunctionIndex() const { if (auto *f = dyn_cast(this)) return f->function->getFunctionIndex();