diff --git a/lld/wasm/Config.h b/lld/wasm/Config.h index 0c2ba3eebffc4f..970e9243dad3d3 100644 --- a/lld/wasm/Config.h +++ b/lld/wasm/Config.h @@ -93,6 +93,7 @@ struct Config { // for shared libraries (since they always added to a dynamic offset at // runtime). uint64_t tableBase; + uint64_t functionPointerAlignment; uint64_t zStackSize; unsigned ltoPartitions; unsigned ltoo; diff --git a/lld/wasm/Driver.cpp b/lld/wasm/Driver.cpp index 02471950fb5196..225785329f8f38 100644 --- a/lld/wasm/Driver.cpp +++ b/lld/wasm/Driver.cpp @@ -638,6 +638,7 @@ static void readConfigs(opt::InputArgList &args) { LLVM_DEBUG(errorHandler().verbose = true); config->tableBase = args::getInteger(args, OPT_table_base, 0); + config->functionPointerAlignment = args::getInteger(args, OPT_function_pointer_alignment, 0); config->globalBase = args::getInteger(args, OPT_global_base, 0); config->initialHeap = args::getInteger(args, OPT_initial_heap, 0); config->initialMemory = args::getInteger(args, OPT_initial_memory, 0); diff --git a/lld/wasm/Options.td b/lld/wasm/Options.td index 1316dc5c70d936..b43ff513b89b65 100644 --- a/lld/wasm/Options.td +++ b/lld/wasm/Options.td @@ -251,6 +251,9 @@ def stack_first: FF<"stack-first">, def table_base: JJ<"table-base=">, HelpText<"Table offset at which to place address taken functions (Defaults to 1)">; +def function_pointer_alignment: JJ<"function-pointer-alignment=">, + HelpText<"Align function pointers at a given value (Defaults to 1)">; + defm whole_archive: B<"whole-archive", "Force load of all members in a static library", "Do not force load of all members in a static library (default)">; diff --git a/lld/wasm/SyntheticSections.cpp b/lld/wasm/SyntheticSections.cpp index 5292915d885a6b..a0c347651dbf82 100644 --- a/lld/wasm/SyntheticSections.cpp +++ b/lld/wasm/SyntheticSections.cpp @@ -567,20 +567,11 @@ void ElemSection::addEntry(FunctionSymbol *sym) { if (sym->hasTableIndex() || sym->isStub) return; - uint32_t padding = 0; - uint64_t alignment = 1; - - if (indirectFunctions.size() == 0 && padding > 0) { - for (uint32_t i=0; isetTableIndex(config->tableBase + indirectFunctions.size()); indirectFunctions.emplace_back(sym); - if (alignment > 1) { - for (uint32_t i=0; ifunctionPointerAlignment > 1) { + for (uint32_t i=0; ifunctionPointerAlignment-1; i++) { indirectFunctions.push_back(nullptr); } }