-
Notifications
You must be signed in to change notification settings - Fork 12.8k
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
Remove branch target prologues from #[naked] fn
#98998
Remove branch target prologues from #[naked] fn
#98998
Conversation
r? @cjgillot (rust-highfive has picked a reviewer for you, use r? to override) |
831ef5b
to
e4d1612
Compare
This comment has been minimized.
This comment has been minimized.
We can apply nocf_check as a hack for now.
Same idea but for AArch64.
e4d1612
to
530b5da
Compare
Hmm, probably should also get input from |
I am not the right reviewer for this. Do you know who would be better suited @workingjubilee? |
...honestly I have no idea, this feels like a deeply cursed segment of the compiler and not a lot of hands pass through here. Apparently a lot of recent touches to this were from tmiasko and flip1995, not sure if either are considered compiler reviewers. |
This approach seems sane to me. Perhaps @joshtriplett or @Amanieu might want to look at it? |
What about lowering naked functions into global asm blocks? That way no codegen backend can accidentally add a prologue or epilogue and no codegen backend has to implement naked functions themself, but can piggyback on rustc's lowering for it. |
LGTM! @bors r+
I actually have a WIP branch that does just that, but it's still incomplete and I've been working on other stuff lately. I think this is the best way forward for naked functions in the long term. |
Rollup of 7 pull requests Successful merges: - rust-lang#98839 (Add assertion that `transmute_copy`'s U is not larger than T) - rust-lang#98998 (Remove branch target prologues from `#[naked] fn`) - rust-lang#99198 (add missing null ptr check in alloc example) - rust-lang#99344 (rustdoc: avoid inlining items with duplicate `(type, name)`) - rust-lang#99351 (Use `typeck_results` to get accurate qpath res for arg mismatch error) - rust-lang#99378 (interpret/visitor: add missing early return) - rust-lang#99394 (Add regression test for rust-lang#95230) Failed merges: r? `@ghost` `@rustbot` modify labels: rollup
Sure! I agree that using that approach for handling naked functions is likely quite profitable, though I still think that LLVM should be handling this more correctly in general. At the very least, we shouldn't have to emit per-architecture hints just to disable the same codegen feature on different architectures. |
This patch hacks around #98768 for now via injecting appropriate attributes into the LLVMIR we emit for naked functions. I intend to pursue this upstream so that these attributes can be removed in general, but it's slow going wading through C++ for me.