rust/compiler/rustc_llvm/llvm-wrapper
Javier Blazquez 4ed846ad4d Add -Z no-unique-section-names to reduce ELF header bloat.
This change adds a new compiler flag that can help reduce the size of
ELF binaries that contain many functions.

By default, when enabling function sections (which is the default for most
targets), the LLVM backend will generate different section names for each
function. For example, a function "func" would generate a section called
".text.func". Normally this is fine because the linker will merge all those
sections into a single one in the binary. However, starting with LLVM 12
(llvm/llvm-project@ee5d1a0), the backend will
also generate unique section names for exception handling, resulting in
thousands of ".gcc_except_table.*" sections ending up in the final binary
because some linkers don't currently merge or strip these EH sections.
This can bloat the ELF headers and string table significantly in
binaries that contain many functions.

The new option is analogous to Clang's -fno-unique-section-names, and
instructs LLVM to generate the same ".text" and ".gcc_except_table"
section for each function, resulting in smaller object files and
potentially a smaller final binary.
2021-10-11 12:09:32 -07:00
..
.editorconfig Move rustllvm into rustc_llvm 2020-09-09 23:05:43 +03:00
ArchiveWrapper.cpp Update the minimum external LLVM to 10 2021-03-22 11:33:43 -07:00
CoverageMappingWrapper.cpp fix: I meant LLVM version 13, not 12 2021-03-19 16:46:40 -04:00
Linker.cpp Move rustllvm into rustc_llvm 2020-09-09 23:05:43 +03:00
LLVMWrapper.h LLVMWrapper: attractive nuisance macros 2021-03-24 14:39:13 -04:00
PassWrapper.cpp Add -Z no-unique-section-names to reduce ELF header bloat. 2021-10-11 12:09:32 -07:00
README Move rustllvm into rustc_llvm 2020-09-09 23:05:43 +03:00
RustWrapper.cpp RustWrapper: remove some uses of AttrBuilder 2021-09-08 10:47:41 -04:00

This directory currently contains some LLVM support code. This will generally
be sent upstream to LLVM in time; for now it lives here.

NOTE: the LLVM C++ ABI is subject to between-version breakage and must *never*
be exposed to Rust. To allow for easy auditing of that, all Rust-exposed types
must be typedef-ed as "LLVMXyz", or "LLVMRustXyz" if they were defined here.

Functions that return a failure status and leave the error in
the LLVM last error should return an LLVMRustResult rather than an
int or anything to avoid confusion.

When translating enums, add a single `Other` variant as the first
one to allow for new variants to be added. It should abort when used
as an input.

All other types must not be typedef-ed as such.