Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Feature request] Improve support for clang's "wasm-ld" #10187

Open
fghzxm opened this issue Mar 26, 2022 · 0 comments
Open

[Feature request] Improve support for clang's "wasm-ld" #10187

fghzxm opened this issue Mar 26, 2022 · 0 comments
Labels
Arch:Wasm Compiling to WebAssembly

Comments

@fghzxm
Copy link
Contributor

fghzxm commented Mar 26, 2022

Vanilla clang has been supporting WebAssembly for some time. Clang uses its own "wasm-ld" which is a hard link to ld.lld (and outputs LLD x.y.z when queried for version), but which seems to have a different CLI from both Emscripten's wasm-ld and the usual Unix-style linker.

Currently Meson just emits the usual Unix-style linker flags like --as-needed, --no-undefined and --start-group, which clang's "wasm-ld" can't understand.

What I want:
Meson should detect "wasm-ld" when the compiler is set to clang. A reliable way to do this might be

<clang command-line arguments> -Wl,

and searching the output for the string wasm-ld. Then Meson can pass link arguments in a way that "wasm-ld" accepts them.

This is "wasm-ld"'s help page as of LLD 13.0.0:

OVERVIEW: LLVM Linker

USAGE: wasm-ld.exe [options] file...

OPTIONS:
  --allow-undefined-file=<value>
                         Allow symbols listed in <file> to be undefined in linked binary
  --allow-undefined      Allow undefined symbols in linked binary. This options is equivelant to --import-undefined and --unresolved-symbols=ignore-all
  --Bsymbolic            Bind defined symbols locally
  --check-features       Check feature compatibility of linked objects (default)
  --color-diagnostics=[auto,always,never]
                         Use colors in diagnostics (default: auto)
  --color-diagnostics    Alias for --color-diagnostics=always
  --compress-relocations Compress the relocation targets in the code section.
  --demangle             Demangle symbol names
  --emit-relocs          Generate relocations in output
  --entry <entry>        Name of entry point symbol
  --error-limit=<value>  Maximum number of errors to emit before stopping (0 = no limit)
  --error-unresolved-symbols
                         Report unresolved symbols as errors
  --experimental-pic     Enable Experimental PIC
  --export-all           Export all symbols (normally combined with --no-gc-sections)
  --export-dynamic       Put symbols in the dynamic symbol table
  --export-if-defined=<value>
                         Force a symbol to be exported, if it is defined in the input
  --export-table         Export function table to the environment
  --export=<value>       Force a symbol to be exported
  -E                     Alias for --export-dynamic
  --fatal-warnings       Treat warnings as errors
  --features=<value>     Comma-separated used features, inferred from input objects by default.
  --gc-sections          Enable garbage collection of unused sections
  --global-base=<value>  Where to start to place global data
  --growable-table       Remove maximum size from function table, allowing table to grow
  --help                 Print option help
  --import-memory        Import memory from the environment
  --import-table         Import function table from the environment
  --import-undefined     Turn undefined symbols into imports where possible
  --initial-memory=<value>
                         Initial size of the linear memory
  --lto-debug-pass-manager
                         Debug new pass manager
  --lto-legacy-pass-manager
                         Use legacy pass manager
  --lto-O<opt-level>     Optimization level for LTO
  --lto-partitions=<value>
                         Number of LTO codegen partitions
  -L <dir>               Add a directory to the library search path
  -l <libName>           Root name of library to use
  --Map=<value>          Print a link map to the specified file
  --max-memory=<value>   Maximum size of the linear memory
  --merge-data-segments  Enable merging data segments
  --mllvm <value>        Options to pass to LLVM
  -M                     Alias for --print-map
  -m <value>             Set target emulation
  --no-check-features    Ignore feature compatibility of linked objects
  --no-color-diagnostics Alias for --color-diagnostics=never
  --no-demangle          Do not demangle symbol names
  --no-entry             Do not output any entry point
  --no-export-dynamic    Do not put symbols in the dynamic symbol table (default)
  --no-gc-sections       Disable garbage collection of unused sections
  --no-lto-legacy-pass-manager
                         Use new pass manager
  --no-merge-data-segments
                         Disable merging data segments
  --no-pie               Do not create a position independent executable (default)
  --no-print-gc-sections Do not list removed unused sections
  --no-whole-archive     Do not force load of all members in a static library (default)
  -O <value>             Optimize output file size
  -o <path>              Path to file to write output
  --pie                  Create a position independent executable
  --print-gc-sections    List removed unused sections
  --print-map            Print a link map to the standard output
  --relocatable          Create relocatable object file
  --reproduce=<value>    Dump linker invocation and input files for debugging
  --rsp-quoting=[posix,windows]
                         Quoting style for response files
  --save-temps           Save intermediate LTO compilation results
  --shared-memory        Use shared linear memory
  --shared               Build a shared object
  --stack-first          Place stack at start of linear memory rather than after data
  --strip-all            Strip all symbols
  --strip-debug          Strip debugging information
  -S                     Alias for --strip-debug
  -s                     Alias for --strip-all
  --thinlto-cache-dir=<value>
                         Path to ThinLTO cached object file directory
  --thinlto-cache-policy=<value>
                         Pruning policy for the ThinLTO cache
  --thinlto-jobs=<value> Number of ThinLTO jobs. Default to --threads=
  --threads=<value>      Number of threads. '1' disables multi-threading. By default all available hardware threads are used
  --trace-symbol=<value> Trace references to symbols
  --trace                Print the names of the input files
  -t                     Alias for --trace
  --undefined=<value>    Force undefined symbol during linking
  --unresolved-symbols=<value>
                         Determine how to handle unresolved symbols
  --verbose              Verbose mode
  --version              Display the version number and exit
  -v                     Display the version number
  --warn-unresolved-symbols
                         Report unresolved symbols as warnings
  --whole-archive        Force load of all members in a static library
  --wrap=<symbol>=<symbol>
                         Use wrapper functions for symbol
  -y <value>             Alias for --trace-symbol
  -z <option>            Linker option extensions
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Arch:Wasm Compiling to WebAssembly
Projects
None yet
Development

No branches or pull requests

2 participants