Skip to content

Staticlib hide internal symbols - #155338

Merged
rust-bors[bot] merged 1 commit into
rust-lang:mainfrom
cezarbbb:staticlib-symbol-hygiene
Jun 8, 2026
Merged

Staticlib hide internal symbols#155338
rust-bors[bot] merged 1 commit into
rust-lang:mainfrom
cezarbbb:staticlib-symbol-hygiene

Conversation

@cezarbbb

@cezarbbbcezarbbb commented Apr 15, 2026

Copy link
Copy Markdown
Contributor

View all comments

According to issue #104707, when building a staticlib, all Rust internal symbols — mangled symbols, #[rustc_std_internal_symbol] items, allocator shims, etc. — leak out of the static archive. In contrast, cdylib correctly exports only #[no_mangle] symbols via a linker version script.

-Zstaticlib-hide-internal-symbols directly post-processes ELF object files in the archive: parsing the SHT_SYMTAB sections and setting STV_HIDDEN visibility on any GLOBAL/WEAK defined symbol that is not in the exported symbol set, without changing the binding. This is an in-place modification (only writing the st_other byte per matching entry), with zero overhead.

Supported on ELF targets (Linux, BSD, etc.) and Apple targets (macOS, iOS, etc.). On unsupported targets (Windows), a warning is emitted and the flag has no effect.

Update: The rename counterpart (-Zstaticlib-rename-internal-symbols) is in #156950.

The test code are as follows:

1.a std rust staticlib:

use std::collections::HashMap;use std::panic::{catch_unwind,AssertUnwindSafe};#[no_mangle]pubextern"C"fnmy_add(a:i32,b:i32) -> i32{ a + b }#[no_mangle]pubextern"C"fnmy_hash_lookup(key:u64) -> u64{letmut map = HashMap::new();for i in0..100u64{ map.insert(i, i.wrapping_mul(2654435761));}*map.get(&key).unwrap_or(&0)}pubfninternal_reverse(s:&str) -> String{ s.chars().rev().collect()}#[no_mangle]pubextern"C"fnmy_format_number(n:i32) -> i32{let s = format!("number: {}", n); s.len()asi32}#[no_mangle]pubextern"C"fnmy_safe_div(a:i32,b:i32) -> i32{matchcatch_unwind(AssertUnwindSafe(|| {if b == 0{panic!("division by zero!");}
a / b
})){Ok(result) => result,Err(_) => -1,}}#[no_mangle]pubextern"C"fnmy_uncaught_panic(){panic!("uncaught panic across FFI");}

1.b downstream c program:

externintmy_add(inta, intb);
externunsigned longmy_hash_lookup(unsigned longkey);
externintmy_format_number(intn);
externintmy_safe_div(inta, intb);
externvoidmy_uncaught_panic(void);
intmain() {
intfailures=0;
if (my_add(10, 20) !=30) failures++;
if (my_hash_lookup(5) !=5UL*2654435761UL) failures++;
if (my_format_number(42) !=10) failures++;
if (my_safe_div(100, 5) !=20) failures++;
if (my_safe_div(100, 0) !=-1) failures++;
pid_tpid=fork();
if (pid==0) { alarm(5); my_uncaught_panic(); _exit(0); }
else { waitpid(pid, &status, 0); }
returnfailures;
}

The test results with different compiler flags(which might cause binary size reduction) are as follows:
1.c result with -Zstaticlib-hide-internal-symbols

 settings OFF ON -Zsave ALL OFF.dynsym ON.dynsym ------------------------------------------------------------------------
default 1.7M 1.5M 204K (12%) 1735 5 1730
lto_thin 616K 584K 33K (5%) 246 5 241
lto_fat 525K 525K 0 (0%) 6 5 1
opt_s 1.7M 1.5M 204K (12%) 1735 5 1730
opt_z 1.7M 1.5M 204K (12%) 1735 5 1730
lto_thin_z 602K 570K 32K (5%) 246 5 241
lto_fat_z 514K 514K 0 (0%) 6 5 1
full 514K 514K 0 (0%) 6 5 1

1.d result with -Zstaticlib-hide-internal-symbols + -Zstaticlib-rename-internal-symbols

 settings OFF ON -Zsave ALL OFF.dynsym ON.dynsym ------------------------------------------------------------------------
default 1.7M 1.5M 162K (9%) 1735 5 1730
lto_thin 616K 599K 18K (2%) 246 5 241
lto_fat 525K 535K -1% (-1%) 6 5 1
opt_s 1.7M 1.5M 162K (9%) 1735 5 1730
opt_z 1.7M 1.5M 162K (9%) 1735 5 1730
lto_thin_z 602K 585K 18K (2%) 246 5 241
lto_fat_z 514K 524K -1% (-1%) 6 5 1
full 514K 523K -1% (-1%) 6 5 1

2.a no_std rust staticlib

#![no_std]#![feature(core_intrinsics)]use core::panic::PanicInfo;#[panic_handler]fnpanic(_info:&PanicInfo) -> ! {loop{}}#[no_mangle]pubextern"C"fnembedded_add(a:i32,b:i32) -> i32{ a.wrapping_add(b)}#[no_mangle]pubextern"C"fnembedded_checksum(data:*constu8,len:usize) -> u8{if data.is_null(){return0;}let slice = unsafe{ core::slice::from_raw_parts(data, len)};letmut sum:u8 = 0;for&byte in slice { sum = sum.wrapping_add(byte);}
sum
}fninternal_helper() -> i32{42}#[no_mangle]pubextern"C"fncall_internal() -> i32{internal_helper()}#[no_mangle]pubextern"C"fnembedded_trigger_abort(){ core::intrinsics::abort();}

2.b downstream c program

externintembedded_add(inta, intb);
externunsigned charembedded_checksum(constunsigned char*data, unsigned longlen);
externintcall_internal(void);
externvoidembedded_trigger_abort(void);
intmain() {
intfailures=0;
if (embedded_add(10, 20) !=30) failures++;
unsigned chardata[] = {1, 2, 3};
if (embedded_checksum(data, 3) !=6) failures++;
if (call_internal() !=42) failures++;
pid_tpid=fork();
if (pid==0) { embedded_trigger_abort(); _exit(0); }
else { waitpid(pid, &status, 0); }
returnfailures;
}

The test results with different compiler flags(which might cause binary size reduction) are as follows:
2.c result with -Zstaticlib-hide-internal-symbols

 settings OFF ON -Zsave ALL OFF.dynsym ON.dynsym ------------------------------------------------------------------------
default 485K 429K 56K (11%) 490 4 486
lto_thin 180K 180K 0 (0%) 4 4 0
lto_fat 179K 179K 0 (0%) 4 4 0
opt_s 485K 429K 56K (11%) 490 4 486
opt_z 485K 429K 56K (11%) 490 4 486
lto_thin_z 180K 180K 0 (0%) 4 4 0
lto_fat_z 179K 179K 0 (0%) 4 4 0
full 179K 179K 0 (0%) 4 4 0

2.d result with -Zstaticlib-hide-internal-symbols + -Zstaticlib-rename-internal-symbols

 settings OFF ON -Zsave ALL OFF.dynsym ON.dynsym ------------------------------------------------------------------------
default 485K 447K 39K (7%) 490 4 486
lto_thin 180K 189K -5% (-5%) 4 4 0
lto_fat 179K 189K -5% (-5%) 4 4 0
opt_s 485K 448K 38K (7%) 490 4 486
opt_z 485K 448K 38K (7%) 490 4 486
lto_thin_z 180K 189K -5% (-5%) 4 4 0
lto_fat_z 179K 189K -5% (-5%) 4 4 0
full 179K 189K -5% (-5%) 4 4 0

Test results show that this compiler option is beneficial for scenarios where LTO cannot be enabled.

r? @bjorn3@petrochenkov

@rustbotrustbot added A-LLVM Area: Code generation parts specific to LLVM. Both correctness bugs and optimization-related issues. A-run-make Area: port run-make Makefiles to rmake.rs S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. T-compiler Relevant to the compiler team, which will review and decide on the PR/issue. labels Apr 15, 2026
@rustbot

Copy link
Copy Markdown
Collaborator

r? @petrochenkov

rustbot has assigned @petrochenkov.
They will have a look at your PR within the next two weeks and either review your PR or reassign to another reviewer.

Use r? to explicitly pick a reviewer

Why was this reviewer chosen?

The reviewer was selected based on:

  • Owners of files modified in this PR: codegen, compiler
  • codegen, compiler expanded to 69 candidates
  • Random selection from 16 candidates

@rustbot

This comment has been minimized.

@rustbotrustbot assigned bjorn3 and unassigned petrochenkovApr 15, 2026
@bjorn3

Copy link
Copy Markdown
Member

This would also need to rename symbols to avoid conflicts between two rust staticlibs ending up getting linked together, right?

@bjorn3

Copy link
Copy Markdown
Member

The rust_eh_personality symbol is always kept visible to ensure .eh_frame unwinding works correctly for C consumers.

Why exactly is that the case? rust_eh_personality is actually the symbol that is most likely to cause conflicts as it is the only one whose name doesn't get mangled depending on the rustc version.

@cezarbbb
cezarbbbforce-pushed the staticlib-symbol-hygiene branch from ff707ad to 7ac49d1CompareApril 15, 2026 12:35
@rustbot

This comment has been minimized.

@rust-log-analyzer

This comment has been minimized.

@cezarbbb

Copy link
Copy Markdown
ContributorAuthor

This would also need to rename symbols to avoid conflicts between two rust staticlibs ending up getting linked together, right?

My primary goal right now is to reduce binary size, so I don't have immediate plans to implement symbol renaming. This means that linking multiple Rust staticlibs together can still result in multiple definition errors. Would you like me to address that in this PR as well? It seems feasible to implement — for example, by rehashing symbols and updating their references accordingly.

@cezarbbb

Copy link
Copy Markdown
ContributorAuthor

The rust_eh_personality symbol is always kept visible to ensure .eh_frame unwinding works correctly for C consumers.

Why exactly is that the case? rust_eh_personality is actually the symbol that is most likely to cause conflicts as it is the only one whose name doesn't get mangled depending on the rustc version.

I previously assumed this symbol needed to remain externally visible to support scenarios requiring cross-language exception propagation. Do you think we should also set rust_eh_personality as hidden?

@bjorn3

Copy link
Copy Markdown
Member

If it isn't too hard it would be nice to do symbol renaming too. I think doing in-place modification isn't going to work for that though. Adding a unique suffix would require growing the size of the string table.

@bjorn3

Copy link
Copy Markdown
Member

I previously assumed this symbol needed to remain externally visible to support scenarios requiring cross-language exception propagation. Do you think we should also set rust_eh_personality as hidden?

rust_eh_personality is only meant to be referenced by the .eh_frame section of rust object files. The only reason it's name isn't mangled is because LLVM hard codes the name to determine the exception table format to emit.

@cezarbbb

Copy link
Copy Markdown
ContributorAuthor

If it isn't too hard it would be nice to do symbol renaming too. I think doing in-place modification isn't going to work for that though. Adding a unique suffix would require growing the size of the string table.

Got it. I will first fix the rust_eh_personality issue, and then try to implement symbol renaming.

@rust-log-analyzer

This comment has been minimized.

@rust-log-analyzer

This comment has been minimized.

@cezarbbb
cezarbbbforce-pushed the staticlib-symbol-hygiene branch from 5e1c3a1 to c7d4e98CompareApril 16, 2026 03:27
@SparrowLii

Copy link
Copy Markdown
Member

@bors delegate=try

@rust-bors

rust-borsBot commented Apr 16, 2026

Copy link
Copy Markdown
Contributor

✌️ @cezarbbb, you can now perform try builds on this pull request!

You can now post @bors try to start a try build.

@cezarbbb

Copy link
Copy Markdown
ContributorAuthor

@bors try

@rust-bors

This comment has been minimized.

rust-borsBot pushed a commit that referenced this pull request Apr 16, 2026
`-Zstaticlib-hide-internal-symbols`: Hide non-exported internal symbols from staticlibs
@rust-bors

rust-borsBot commented Apr 16, 2026

Copy link
Copy Markdown
Contributor

☀️ Try build successful (CI)
Build commit: a9431d3 (a9431d37da1d0346038257cec9d94f2783997621, parent: e8e4541ff19649d95afab52fdde2c2eaa6829965)

@cezarbbb

Copy link
Copy Markdown
ContributorAuthor

@bors try jobs=x86_64-*

@rust-bors

This comment has been minimized.

@rust-bors

rust-borsBot commented Jun 5, 2026

Copy link
Copy Markdown
Contributor

This pull request was unapproved.

This PR was contained in a rollup (#157464), which was unapproved.

View changes since this unapproval

@cezarbbb
cezarbbbforce-pushed the staticlib-symbol-hygiene branch from bc6e8ed to e5d8cdfCompareJune 5, 2026 09:27
@cezarbbb

Copy link
Copy Markdown
ContributorAuthor

It appears that unsigned long is 32-bit on i686 and 64-bit on x86_64, but u64 is 64-bit, hence the error on i686. This has been fixed; unsigned long was changed to uint64_t in main.c.

@cezarbbb

Copy link
Copy Markdown
ContributorAuthor

@bors try jobs=i686-*

@rust-bors

This comment has been minimized.

rust-borsBot pushed a commit that referenced this pull request Jun 5, 2026
Staticlib hide internal symbols
try-job: i686-*
@petrochenkov

Copy link
Copy Markdown
Contributor

Yeah, it's not good to rely on specific sizes for C types.
The reliable way is to either use stdint.h types on C side, or std::ffi types on Rust side.

@rust-bors

rust-borsBot commented Jun 5, 2026

Copy link
Copy Markdown
Contributor

☀️ Try build successful (CI)
Build commit: b480660 (b4806607a4f4f014e606e6033274a8cd3f9fdfb0, parent: 3179a47d67719a92b4d3c3689aca391c40ff1a04)

@petrochenkov

Copy link
Copy Markdown
Contributor

@bors r+

@rust-bors

rust-borsBot commented Jun 5, 2026

Copy link
Copy Markdown
Contributor

📌 Commit e5d8cdf has been approved by petrochenkov

It is now in the queue for this repository.

@rust-borsrust-borsBot added S-waiting-on-bors Status: Waiting on bors to run and complete tests. Bors will change the label on completion. and removed S-waiting-on-author Status: This is awaiting some action (such as code changes or more information) from the author. labels Jun 5, 2026
JonathanBrouwer added a commit to JonathanBrouwer/rust that referenced this pull request Jun 5, 2026
… r=petrochenkov
Staticlib hide internal symbols
According to issue rust-lang#104707, when building a staticlib, all Rust internal symbols — mangled symbols, `#[rustc_std_internal_symbol]` items, allocator shims, etc. — leak out of the static archive. In contrast, cdylib correctly exports only `#[no_mangle]` symbols via a linker version script.
`-Zstaticlib-hide-internal-symbols` directly post-processes ELF object files in the archive: parsing the `SHT_SYMTAB` sections and setting `STV_HIDDEN` visibility on any `GLOBAL/WEAK` defined symbol that is not in the exported symbol set, without changing the binding. This is an in-place modification (only writing the st_other byte per matching entry), with zero overhead.
Supported on ELF targets (Linux, BSD, etc.) and Apple targets (macOS, iOS, etc.). On unsupported targets (Windows), a warning is emitted and the flag has no effect.
**Update**: The rename counterpart (`-Zstaticlib-rename-internal-symbols`) is in rust-lang#156950.
The test code are as follows:
1.a std rust staticlib:
```rust
use std::collections::HashMap;
use std::panic::{catch_unwind, AssertUnwindSafe};
#[no_mangle]
pub extern "C" fn my_add(a: i32, b: i32) -> i32 { a + b }
#[no_mangle]
pub extern "C" fn my_hash_lookup(key: u64) -> u64 {
let mut map = HashMap::new();
for i in 0..100u64 { map.insert(i, i.wrapping_mul(2654435761)); }
*map.get(&key).unwrap_or(&0)
}
pub fn internal_reverse(s: &str) -> String { s.chars().rev().collect() }
#[no_mangle]
pub extern "C" fn my_format_number(n: i32) -> i32 {
let s = format!("number: {}", n); s.len() as i32
}
#[no_mangle]
pub extern "C" fn my_safe_div(a: i32, b: i32) -> i32 {
match catch_unwind(AssertUnwindSafe(|| {
if b == 0 { panic!("division by zero!"); }
a / b
})) {
Ok(result) => result,
Err(_) => -1,
}
}
#[no_mangle]
pub extern "C" fn my_uncaught_panic() { panic!("uncaught panic across FFI"); }
```
1.b downstream c program:
```c
extern int my_add(int a, int b);
extern unsigned long my_hash_lookup(unsigned long key);
extern int my_format_number(int n);
extern int my_safe_div(int a, int b);
extern void my_uncaught_panic(void);
int main() {
int failures = 0;
if (my_add(10, 20) != 30) failures++;
if (my_hash_lookup(5) != 5UL * 2654435761UL) failures++;
if (my_format_number(42) != 10) failures++;
if (my_safe_div(100, 5) != 20) failures++;
if (my_safe_div(100, 0) != -1) failures++;
pid_t pid = fork();
if (pid == 0) { alarm(5); my_uncaught_panic(); _exit(0); }
else { waitpid(pid, &status, 0); }
return failures;
}
```
The test results with different compiler flags(which might cause binary size reduction) are as follows:
1.c result with `-Zstaticlib-hide-internal-symbols`
```
settings OFF ON -Zsave ALL OFF.dynsym ON.dynsym
------------------------------------------------------------------------
default 1.7M 1.5M 204K (12%) 1735 5 1730
lto_thin 616K 584K 33K (5%) 246 5 241
lto_fat 525K 525K 0 (0%) 6 5 1
opt_s 1.7M 1.5M 204K (12%) 1735 5 1730
opt_z 1.7M 1.5M 204K (12%) 1735 5 1730
lto_thin_z 602K 570K 32K (5%) 246 5 241
lto_fat_z 514K 514K 0 (0%) 6 5 1
full 514K 514K 0 (0%) 6 5 1
```
1.d result with `-Zstaticlib-hide-internal-symbols + -Zstaticlib-rename-internal-symbols`
```
settings OFF ON -Zsave ALL OFF.dynsym ON.dynsym
------------------------------------------------------------------------
default 1.7M 1.5M 162K (9%) 1735 5 1730
lto_thin 616K 599K 18K (2%) 246 5 241
lto_fat 525K 535K -1% (-1%) 6 5 1
opt_s 1.7M 1.5M 162K (9%) 1735 5 1730
opt_z 1.7M 1.5M 162K (9%) 1735 5 1730
lto_thin_z 602K 585K 18K (2%) 246 5 241
lto_fat_z 514K 524K -1% (-1%) 6 5 1
full 514K 523K -1% (-1%) 6 5 1
```
2.a no_std rust staticlib
```rust
#![no_std]
#![feature(core_intrinsics)]
use core::panic::PanicInfo;
#[panic_handler]
fn panic(_info: &PanicInfo) -> ! { loop {} }
#[no_mangle]
pub extern "C" fn embedded_add(a: i32, b: i32) -> i32 { a.wrapping_add(b) }
#[no_mangle]
pub extern "C" fn embedded_checksum(data: *const u8, len: usize) -> u8 {
if data.is_null() { return 0; }
let slice = unsafe { core::slice::from_raw_parts(data, len) };
let mut sum: u8 = 0;
for &byte in slice { sum = sum.wrapping_add(byte); }
sum
}
fn internal_helper() -> i32 { 42 }
#[no_mangle]
pub extern "C" fn call_internal() -> i32 { internal_helper() }
#[no_mangle]
pub extern "C" fn embedded_trigger_abort() { core::intrinsics::abort(); }
```
2.b downstream c program
```c
extern int embedded_add(int a, int b);
extern unsigned char embedded_checksum(const unsigned char *data, unsigned long len);
extern int call_internal(void);
extern void embedded_trigger_abort(void);
int main() {
int failures = 0;
if (embedded_add(10, 20) != 30) failures++;
unsigned char data[] = {1, 2, 3};
if (embedded_checksum(data, 3) != 6) failures++;
if (call_internal() != 42) failures++;
pid_t pid = fork();
if (pid == 0) { embedded_trigger_abort(); _exit(0); }
else { waitpid(pid, &status, 0); }
return failures;
}
```
The test results with different compiler flags(which might cause binary size reduction) are as follows:
2.c result with `-Zstaticlib-hide-internal-symbols`
```
settings OFF ON -Zsave ALL OFF.dynsym ON.dynsym
------------------------------------------------------------------------
default 485K 429K 56K (11%) 490 4 486
lto_thin 180K 180K 0 (0%) 4 4 0
lto_fat 179K 179K 0 (0%) 4 4 0
opt_s 485K 429K 56K (11%) 490 4 486
opt_z 485K 429K 56K (11%) 490 4 486
lto_thin_z 180K 180K 0 (0%) 4 4 0
lto_fat_z 179K 179K 0 (0%) 4 4 0
full 179K 179K 0 (0%) 4 4 0
```
2.d result with `-Zstaticlib-hide-internal-symbols + -Zstaticlib-rename-internal-symbols`
```
settings OFF ON -Zsave ALL OFF.dynsym ON.dynsym
------------------------------------------------------------------------
default 485K 447K 39K (7%) 490 4 486
lto_thin 180K 189K -5% (-5%) 4 4 0
lto_fat 179K 189K -5% (-5%) 4 4 0
opt_s 485K 448K 38K (7%) 490 4 486
opt_z 485K 448K 38K (7%) 490 4 486
lto_thin_z 180K 189K -5% (-5%) 4 4 0
lto_fat_z 179K 189K -5% (-5%) 4 4 0
full 179K 189K -5% (-5%) 4 4 0
```
Test results show that this compiler option is beneficial for scenarios where LTO cannot be enabled.
r? @bjorn3@petrochenkov
@JonathanBrouwer

Copy link
Copy Markdown
Member

💔 I suspect this PR failed tests as part of a rollup
@bors r-

After fixing the problem, consider running a try job for the failed job before re-approving.

Link to failure: #157484 (comment)

@rust-borsrust-borsBot added the S-waiting-on-author Status: This is awaiting some action (such as code changes or more information) from the author. label Jun 5, 2026
@rust-bors

rust-borsBot commented Jun 5, 2026

Copy link
Copy Markdown
Contributor

This pull request was unapproved.

This PR was contained in a rollup (#157484), which was unapproved.

View changes since this unapproval

@cezarbbb

Copy link
Copy Markdown
ContributorAuthor

Weird. I'll check and fix it on Monday.

@cezarbbb

Copy link
Copy Markdown
ContributorAuthor

It seems that the logic for handling prefixe _ in Mach-O format was overlooked when processing reviewer's comments.
@bors try jobs=apple

@rust-bors

This comment has been minimized.

@rust-bors

rust-borsBot commented Jun 8, 2026

Copy link
Copy Markdown
Contributor

☀️ Try build successful (CI)
Build commit: 4013026 (4013026817304e79aacd56f0d7909c134053b307, parent: f20a92ec01483dc5c58e90e246f266bdad822d86)

@cezarbbb

Copy link
Copy Markdown
ContributorAuthor

@rustbot ready

@petrochenkov

Copy link
Copy Markdown
Contributor

@bors r+

@rust-bors

rust-borsBot commented Jun 8, 2026

Copy link
Copy Markdown
Contributor

📌 Commit 6caae67 has been approved by petrochenkov

It is now in the queue for this repository.

🌲 The tree is currently closed for pull requests below priority 100. This pull request will be tested once the tree is reopened.

@JonathanBrouwer

Copy link
Copy Markdown
Member

@rust-timer build 7f76357

@rust-timer

This comment has been minimized.

@rust-timer

Copy link
Copy Markdown
Collaborator

Finished benchmarking commit (7f76357): comparison URL.

Overall result: ✅ improvements - no action needed

Benchmarking means the PR may be perf-sensitive. It's automatically marked not fit for rolling up. Overriding is possible but disadvised: it risks changing compiler perf.

@bors rollup=never
@rustbot label: -S-waiting-on-perf -perf-regression

Instruction count

Our most reliable metric. Used to determine the overall result above. However, even this metric can be noisy.

meanrangecount
Regressions ❌
(primary)
--0
Regressions ❌
(secondary)
--0
Improvements ✅
(primary)
-0.4%[-0.4%, -0.3%]4
Improvements ✅
(secondary)
-0.4%[-0.9%, -0.2%]11
All ❌✅ (primary)-0.4%[-0.4%, -0.3%]4

Max RSS (memory usage)

Results (primary 1.7%)

A less reliable metric. May be of interest, but not used to determine the overall result above.

meanrangecount
Regressions ❌
(primary)
1.7%[1.7%, 1.7%]1
Regressions ❌
(secondary)
--0
Improvements ✅
(primary)
--0
Improvements ✅
(secondary)
--0
All ❌✅ (primary)1.7%[1.7%, 1.7%]1

Cycles

Results (secondary -3.5%)

A less reliable metric. May be of interest, but not used to determine the overall result above.

meanrangecount
Regressions ❌
(primary)
--0
Regressions ❌
(secondary)
--0
Improvements ✅
(primary)
--0
Improvements ✅
(secondary)
-3.5%[-5.5%, -2.3%]6
All ❌✅ (primary)--0

Binary size

This perf run didn't have relevant results for this metric.

Bootstrap: 516.268s -> 514.837s (-0.28%)
Artifact size: 400.81 MiB -> 400.84 MiB (0.01%)

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

A-LLVMArea: Code generation parts specific to LLVM. Both correctness bugs and optimization-related issues.A-run-makeArea: port run-make Makefiles to rmake.rsS-waiting-on-borsStatus: Waiting on bors to run and complete tests. Bors will change the label on completion.T-compilerRelevant to the compiler team, which will review and decide on the PR/issue.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

10 participants

@cezarbbb@rustbot@bjorn3@rust-log-analyzer@SparrowLii@MicroDroid@petrochenkov@JonathanBrouwer@rust-timer@traviscross