mirror of
https://github.com/rust-lang/rust.git
synced 2024-12-04 20:54:13 +00:00
74b8d324eb
Both GCC and Clang write by default a `.comment` section with compiler information: ```txt $ gcc -c -xc /dev/null && readelf -p '.comment' null.o String dump of section '.comment': [ 1] GCC: (GNU) 11.2.0 $ clang -c -xc /dev/null && readelf -p '.comment' null.o String dump of section '.comment': [ 1] clang version 14.0.1 (https://github.com/llvm/llvm-project.git c62053979489ccb002efe411c3af059addcb5d7d) ``` They also implement the `-Qn` flag to avoid doing so: ```txt $ gcc -Qn -c -xc /dev/null && readelf -p '.comment' null.o readelf: Warning: Section '.comment' was not dumped because it does not exist! $ clang -Qn -c -xc /dev/null && readelf -p '.comment' null.o readelf: Warning: Section '.comment' was not dumped because it does not exist! ``` So far, `rustc` only does it for WebAssembly targets and only when debug info is enabled: ```txt $ echo 'fn main(){}' | rustc --target=wasm32-unknown-unknown --emit=llvm-ir -Cdebuginfo=2 - && grep llvm.ident rust_out.ll !llvm.ident = !{!27} ``` In the RFC part of this PR it was decided to always add the information, which gets us closer to other popular compilers. An opt-out flag like GCC and Clang may be added later on if deemed necessary. Implementation-wise, this covers both `ModuleLlvm::new()` and `ModuleLlvm::new_metadata()` cases by moving the addition to `context::create_module` and adds a few test cases. ThinLTO also sees the `llvm.ident` named metadata duplicated (in temporary outputs), so this deduplicates it like it is done for `wasm.custom_sections`. The tests also check this duplication does not take place. Signed-off-by: Miguel Ojeda <ojeda@kernel.org>
20 lines
727 B
Makefile
20 lines
727 B
Makefile
include ../tools.mk
|
|
|
|
# only-linux
|
|
|
|
all:
|
|
# `-Ccodegen-units=16 -Copt-level=2` is used here to trigger thin LTO
|
|
# across codegen units to test deduplication of the named metadata
|
|
# (see `LLVMRustPrepareThinLTOImport` for details).
|
|
echo 'fn main(){}' | $(RUSTC) - --emit=link,obj -Csave-temps -Ccodegen-units=16 -Copt-level=2 --target=$(TARGET)
|
|
|
|
# `llvm-dis` is used here since `--emit=llvm-ir` does not emit LLVM IR
|
|
# for temporary outputs.
|
|
"$(LLVM_BIN_DIR)"/llvm-dis $(TMPDIR)/*.bc
|
|
|
|
# Check LLVM IR files (including temporary outputs) have `!llvm.ident`
|
|
# named metadata, reusing the related codegen test.
|
|
set -e; for f in $(TMPDIR)/*.ll; do \
|
|
$(LLVM_FILECHECK) --input-file $$f ../../codegen/llvm-ident.rs; \
|
|
done
|