tests/assembly-llvm: pin frame pointer in issue-141649 aarch64 test - #159328

Merged
rust-bors[bot] merged 1 commit into
rust-lang:mainfrom
DeepeshWR:fix/issue-141649-relax-aarch64-stack-check
Jul 18, 2026
Merged

tests/assembly-llvm: pin frame pointer in issue-141649 aarch64 test#159328
rust-bors[bot] merged 1 commit into
rust-lang:mainfrom
DeepeshWR:fix/issue-141649-relax-aarch64-stack-check

Conversation

@DeepeshWR

@DeepeshWRDeepeshWR commented Jul 15, 2026

Copy link
Copy Markdown
Contributor

The scoped_two_small_structs test expects sub sp, sp, #48 on
aarch64, which assumes the frame pointer (x29) is saved. Custom targets
that don't set frame-pointer: non-leaf (e.g., OpenEmbedded/Yocto's
aarch64-poky-linux-gnu) omit x29, producing sub sp, sp, #32 instead.

Add -Cforce-frame-pointers=yes to the aarch64 revision so the test
produces consistent codegen regardless of the target's default frame
pointer policy.

@rustbotrustbot added 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 Jul 15, 2026
@rustbot

Copy link
Copy Markdown
Collaborator

r? @jieyouxu

rustbot has assigned @jieyouxu.
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: compiler
  • compiler expanded to 75 candidates
  • Random selection from 19 candidates

@rustbot

This comment has been minimized.

@jieyouxu

Copy link
Copy Markdown
Member

@rustbot reroll

@rustbotrustbot assigned mati865 and unassigned jieyouxuJul 15, 2026
@mati865

mati865 commented Jul 15, 2026

Copy link
Copy Markdown
Member

I believe the explanation is a pure hallucination but the test change might be sound (after ammending the other function's comment/assert). Perhaps @nikic or @dianqk could comment on that matter?

@nikicnikic left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The explanation in the PR description is completely nonsense. You're going to have to properly justify where the difference comes from.

View changes since this review

@rustbotrustbot added S-waiting-on-author Status: This is awaiting some action (such as code changes or more information) from the author. and removed S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. labels Jul 15, 2026
@rustbot

Copy link
Copy Markdown
Collaborator

Reminder, once the PR becomes ready for a review, use @rustbot ready.

@mati865

Copy link
Copy Markdown
Member

@rustbot author

@RalfJung

RalfJung commented Jul 15, 2026

Copy link
Copy Markdown
Member

Also please note that AI-generated PR descriptions are frowned upon in this project (and generally I think it is good etiquette to get explicit consent from people before confronting them with AI-generated text, or to hide all such text behind a "further LLVM-generated details you can freely skip"). The point of a PR description is for you to describe your motivation and understanding of this change. During the PR review process we expect to interact with a human who has a genuine interest in understanding how to fix this issue properly, and as part of that we expect the PR description to be written by said human.

@dianqk

Copy link
Copy Markdown
Member

I'm surprised that this is the root cause. LLVM should produce the same result regardless of the optimization level used to build it. Could you explaina bit more?

@DeepeshWR

Copy link
Copy Markdown
ContributorAuthor

Thank you all for the feedback. I apologize for the AI-generated description, that was a mistake on my part. Let me provide the proper explanation based on my investigation.

Root cause:

The failure occurs in OE-core (OpenEmbedded/Yocto) builds where Rust is compiled against an external system LLVM and tests are run against a custom target aarch64-poky-linux-gnu. This custom target JSON spec does not set "frame-pointer": "non-leaf".

The built-in aarch64-unknown-linux-gnu target in Rust has FramePointer::NonLeaf set (per AAPCS64), which forces x29 to be saved on the stack. This adds 16 bytes to the frame:

  • With frame pointer (rust built-in target): saves x29 + x30 + x19 = sub sp, sp, # 48
  • Without frame pointer (OE custom target): saves x30 + x19 only = sub sp, sp, # 32

I confirmed this by changing FramePointer::NonLeaf to FramePointer::MayOmit in compiler/rustc_target/src/spec/targets/aarch64_unknown_linux_gnu.rs this reproduces #32.

I think both the values are correct.

Please let me know what I need to do now. Whether I can update the commit message with the same fix what we have in this PR or shall I update the testcase with -Cforce-frame-pointers=yes for aarch64 revision.

Let me know which approach you'd prefer and I'll update the PR accordingly.

@nikic

Copy link
Copy Markdown
Contributor

I'd prefer the variant using -Cforce-frame-pointers=yes.

The `scoped_two_small_structs` test expects `sub sp, sp, rust-lang#48` on
aarch64, which assumes the frame pointer (x29) is saved. Custom targets
that don't set `frame-pointer: non-leaf` (e.g., OpenEmbedded/Yocto's
`aarch64-poky-linux-gnu`) omit x29, producing `sub sp, sp, rust-lang#32` instead.
Add `-Cforce-frame-pointers=yes` to the aarch64 revision so the test
produces consistent codegen regardless of the target's default frame
pointer policy.
Signed-off-by: Deepesh Varatharajan <Deepesh.Varatharajan@windriver.com>
@DeepeshWR
DeepeshWRforce-pushed the fix/issue-141649-relax-aarch64-stack-check branch from 0cb43cc to 9e0664aCompareJuly 16, 2026 14:52
@rustbot

Copy link
Copy Markdown
Collaborator

⚠️Warning⚠️

  • There are issue links (such as #123) in the commit messages of the following commits.
    Please move them to the PR description, to avoid spamming the issues with references to the commit, and so this bot can automatically canonicalize them to avoid issues with subtree.

@DeepeshWRDeepeshWR changed the title tests/assembly-llvm: relax aarch64 stack size check in issue-141649tests/assembly-llvm: pin frame pointer in issue-141649 aarch64 testJul 16, 2026
@DeepeshWR

Copy link
Copy Markdown
ContributorAuthor

@rustbot ready

@rustbotrustbot added S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. and removed S-waiting-on-author Status: This is awaiting some action (such as code changes or more information) from the author. labels Jul 16, 2026
@DeepeshWR
DeepeshWR requested a review from nikicJuly 17, 2026 02:01

@mati865mati865 left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@rust-bors

rust-borsBot commented Jul 18, 2026

Copy link
Copy Markdown
Contributor

📌 Commit 9e0664a has been approved by mati865

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-review Status: Awaiting review from the assignee but also interested parties. labels Jul 18, 2026
JonathanBrouwer added a commit to JonathanBrouwer/rust that referenced this pull request Jul 18, 2026
…arch64-stack-check, r=mati865
tests/assembly-llvm: pin frame pointer in issue-141649 aarch64 test
The `scoped_two_small_structs` test expects `sub sp, sp, rust-lang#48` on
aarch64, which assumes the frame pointer (x29) is saved. Custom targets
that don't set `frame-pointer: non-leaf` (e.g., OpenEmbedded/Yocto's
`aarch64-poky-linux-gnu`) omit x29, producing `sub sp, sp, rust-lang#32` instead.
Add `-Cforce-frame-pointers=yes` to the aarch64 revision so the test
produces consistent codegen regardless of the target's default frame
pointer policy.
rust-borsBot pushed a commit that referenced this pull request Jul 18, 2026
…uwer
Rollup of 5 pull requests
Successful merges:
- #159189 (Account for type alias projections in E0308 "expected/found" shortening logic)
- #158545 (Move `std::io::read_to_string` to `alloc::io`)
- #159328 (tests/assembly-llvm: pin frame pointer in issue-141649 aarch64 test)
- #159470 (Fix string indexing in diagnostic format strings)
- #159500 (Move compiletest CLI parsing to `cli.rs`)
JonathanBrouwer added a commit to JonathanBrouwer/rust that referenced this pull request Jul 18, 2026
…arch64-stack-check, r=mati865
tests/assembly-llvm: pin frame pointer in issue-141649 aarch64 test
The `scoped_two_small_structs` test expects `sub sp, sp, rust-lang#48` on
aarch64, which assumes the frame pointer (x29) is saved. Custom targets
that don't set `frame-pointer: non-leaf` (e.g., OpenEmbedded/Yocto's
`aarch64-poky-linux-gnu`) omit x29, producing `sub sp, sp, rust-lang#32` instead.
Add `-Cforce-frame-pointers=yes` to the aarch64 revision so the test
produces consistent codegen regardless of the target's default frame
pointer policy.
rust-borsBot pushed a commit that referenced this pull request Jul 18, 2026
…uwer
Rollup of 5 pull requests
Successful merges:
- #159467 (Add explicit `Iterator::count` impl for `str::EncodeUtf16`)
- #158545 (Move `std::io::read_to_string` to `alloc::io`)
- #159328 (tests/assembly-llvm: pin frame pointer in issue-141649 aarch64 test)
- #159470 (Fix string indexing in diagnostic format strings)
- #159500 (Move compiletest CLI parsing to `cli.rs`)
rust-borsBot pushed a commit that referenced this pull request Jul 18, 2026
…uwer
Rollup of 8 pull requests
Successful merges:
- #159425 (Windows: add context when opening NUL for child stdio fails)
- #159467 (Add explicit `Iterator::count` impl for `str::EncodeUtf16`)
- #157860 (Move rustdoc run-make tests into new `tests/run-make/rustdoc/`)
- #158545 (Move `std::io::read_to_string` to `alloc::io`)
- #159328 (tests/assembly-llvm: pin frame pointer in issue-141649 aarch64 test)
- #159459 (Detect when trait bound requires closure to return itself)
- #159470 (Fix string indexing in diagnostic format strings)
- #159500 (Move compiletest CLI parsing to `cli.rs`)
@rust-bors
rust-borsBot merged commit 823b135 into rust-lang:mainJul 18, 2026
13 checks passed
@rustbotrustbot added this to the 1.99.0 milestone Jul 18, 2026
rust-timer added a commit that referenced this pull request Jul 18, 2026
Rollup merge of #159328 - DeepeshWR:fix/issue-141649-relax-aarch64-stack-check, r=mati865
tests/assembly-llvm: pin frame pointer in issue-141649 aarch64 test
The `scoped_two_small_structs` test expects `sub sp, sp, #48` on
aarch64, which assumes the frame pointer (x29) is saved. Custom targets
that don't set `frame-pointer: non-leaf` (e.g., OpenEmbedded/Yocto's
`aarch64-poky-linux-gnu`) omit x29, producing `sub sp, sp, #32` instead.
Add `-Cforce-frame-pointers=yes` to the aarch64 revision so the test
produces consistent codegen regardless of the target's default frame
pointer policy.
github-actionsBot pushed a commit to rust-lang/rustc-dev-guide that referenced this pull request Jul 20, 2026
…uwer
Rollup of 8 pull requests
Successful merges:
- rust-lang/rust#159425 (Windows: add context when opening NUL for child stdio fails)
- rust-lang/rust#159467 (Add explicit `Iterator::count` impl for `str::EncodeUtf16`)
- rust-lang/rust#157860 (Move rustdoc run-make tests into new `tests/run-make/rustdoc/`)
- rust-lang/rust#158545 (Move `std::io::read_to_string` to `alloc::io`)
- rust-lang/rust#159328 (tests/assembly-llvm: pin frame pointer in issue-141649 aarch64 test)
- rust-lang/rust#159459 (Detect when trait bound requires closure to return itself)
- rust-lang/rust#159470 (Fix string indexing in diagnostic format strings)
- rust-lang/rust#159500 (Move compiletest CLI parsing to `cli.rs`)
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

S-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.

7 participants

@DeepeshWR@rustbot@jieyouxu@mati865@RalfJung@dianqk@nikic
, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

tests/assembly-llvm: pin frame pointer in issue-141649 aarch64 test - #159328

Merged
rust-bors[bot] merged 1 commit into
rust-lang:mainfrom
DeepeshWR:fix/issue-141649-relax-aarch64-stack-check
Jul 18, 2026
Merged

tests/assembly-llvm: pin frame pointer in issue-141649 aarch64 test#159328
rust-bors[bot] merged 1 commit into
rust-lang:mainfrom
DeepeshWR:fix/issue-141649-relax-aarch64-stack-check

Conversation

@DeepeshWR

@DeepeshWRDeepeshWR commented Jul 15, 2026

Copy link
Copy Markdown
Contributor

The scoped_two_small_structs test expects sub sp, sp, #48 on
aarch64, which assumes the frame pointer (x29) is saved. Custom targets
that don't set frame-pointer: non-leaf (e.g., OpenEmbedded/Yocto's
aarch64-poky-linux-gnu) omit x29, producing sub sp, sp, #32 instead.

Add -Cforce-frame-pointers=yes to the aarch64 revision so the test
produces consistent codegen regardless of the target's default frame
pointer policy.

@rustbotrustbot added 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 Jul 15, 2026
@rustbot

Copy link
Copy Markdown
Collaborator

r? @jieyouxu

rustbot has assigned @jieyouxu.
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: compiler
  • compiler expanded to 75 candidates
  • Random selection from 19 candidates

@rustbot

This comment has been minimized.

@jieyouxu

Copy link
Copy Markdown
Member

@rustbot reroll

@rustbotrustbot assigned mati865 and unassigned jieyouxuJul 15, 2026
@mati865

mati865 commented Jul 15, 2026

Copy link
Copy Markdown
Member

I believe the explanation is a pure hallucination but the test change might be sound (after ammending the other function's comment/assert). Perhaps @nikic or @dianqk could comment on that matter?

@nikicnikic left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The explanation in the PR description is completely nonsense. You're going to have to properly justify where the difference comes from.

View changes since this review

@rustbotrustbot added S-waiting-on-author Status: This is awaiting some action (such as code changes or more information) from the author. and removed S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. labels Jul 15, 2026
@rustbot

Copy link
Copy Markdown
Collaborator

Reminder, once the PR becomes ready for a review, use @rustbot ready.

@mati865

Copy link
Copy Markdown
Member

@rustbot author

@RalfJung

RalfJung commented Jul 15, 2026

Copy link
Copy Markdown
Member

Also please note that AI-generated PR descriptions are frowned upon in this project (and generally I think it is good etiquette to get explicit consent from people before confronting them with AI-generated text, or to hide all such text behind a "further LLVM-generated details you can freely skip"). The point of a PR description is for you to describe your motivation and understanding of this change. During the PR review process we expect to interact with a human who has a genuine interest in understanding how to fix this issue properly, and as part of that we expect the PR description to be written by said human.

@dianqk

Copy link
Copy Markdown
Member

I'm surprised that this is the root cause. LLVM should produce the same result regardless of the optimization level used to build it. Could you explaina bit more?

@DeepeshWR

Copy link
Copy Markdown
ContributorAuthor

Thank you all for the feedback. I apologize for the AI-generated description, that was a mistake on my part. Let me provide the proper explanation based on my investigation.

Root cause:

The failure occurs in OE-core (OpenEmbedded/Yocto) builds where Rust is compiled against an external system LLVM and tests are run against a custom target aarch64-poky-linux-gnu. This custom target JSON spec does not set "frame-pointer": "non-leaf".

The built-in aarch64-unknown-linux-gnu target in Rust has FramePointer::NonLeaf set (per AAPCS64), which forces x29 to be saved on the stack. This adds 16 bytes to the frame:

  • With frame pointer (rust built-in target): saves x29 + x30 + x19 = sub sp, sp, # 48
  • Without frame pointer (OE custom target): saves x30 + x19 only = sub sp, sp, # 32

I confirmed this by changing FramePointer::NonLeaf to FramePointer::MayOmit in compiler/rustc_target/src/spec/targets/aarch64_unknown_linux_gnu.rs this reproduces #32.

I think both the values are correct.

Please let me know what I need to do now. Whether I can update the commit message with the same fix what we have in this PR or shall I update the testcase with -Cforce-frame-pointers=yes for aarch64 revision.

Let me know which approach you'd prefer and I'll update the PR accordingly.

@nikic

Copy link
Copy Markdown
Contributor

I'd prefer the variant using -Cforce-frame-pointers=yes.

The `scoped_two_small_structs` test expects `sub sp, sp, rust-lang#48` on
aarch64, which assumes the frame pointer (x29) is saved. Custom targets
that don't set `frame-pointer: non-leaf` (e.g., OpenEmbedded/Yocto's
`aarch64-poky-linux-gnu`) omit x29, producing `sub sp, sp, rust-lang#32` instead.
Add `-Cforce-frame-pointers=yes` to the aarch64 revision so the test
produces consistent codegen regardless of the target's default frame
pointer policy.
Signed-off-by: Deepesh Varatharajan <Deepesh.Varatharajan@windriver.com>
@DeepeshWR
DeepeshWRforce-pushed the fix/issue-141649-relax-aarch64-stack-check branch from 0cb43cc to 9e0664aCompareJuly 16, 2026 14:52
@rustbot

Copy link
Copy Markdown
Collaborator

⚠️Warning⚠️

  • There are issue links (such as #123) in the commit messages of the following commits.
    Please move them to the PR description, to avoid spamming the issues with references to the commit, and so this bot can automatically canonicalize them to avoid issues with subtree.

@DeepeshWRDeepeshWR changed the title tests/assembly-llvm: relax aarch64 stack size check in issue-141649tests/assembly-llvm: pin frame pointer in issue-141649 aarch64 testJul 16, 2026
@DeepeshWR

Copy link
Copy Markdown
ContributorAuthor

@rustbot ready

@rustbotrustbot added S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. and removed S-waiting-on-author Status: This is awaiting some action (such as code changes or more information) from the author. labels Jul 16, 2026
@DeepeshWR
DeepeshWR requested a review from nikicJuly 17, 2026 02:01

@mati865mati865 left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@rust-bors

rust-borsBot commented Jul 18, 2026

Copy link
Copy Markdown
Contributor

📌 Commit 9e0664a has been approved by mati865

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-review Status: Awaiting review from the assignee but also interested parties. labels Jul 18, 2026
JonathanBrouwer added a commit to JonathanBrouwer/rust that referenced this pull request Jul 18, 2026
…arch64-stack-check, r=mati865
tests/assembly-llvm: pin frame pointer in issue-141649 aarch64 test
The `scoped_two_small_structs` test expects `sub sp, sp, rust-lang#48` on
aarch64, which assumes the frame pointer (x29) is saved. Custom targets
that don't set `frame-pointer: non-leaf` (e.g., OpenEmbedded/Yocto's
`aarch64-poky-linux-gnu`) omit x29, producing `sub sp, sp, rust-lang#32` instead.
Add `-Cforce-frame-pointers=yes` to the aarch64 revision so the test
produces consistent codegen regardless of the target's default frame
pointer policy.
rust-borsBot pushed a commit that referenced this pull request Jul 18, 2026
…uwer
Rollup of 5 pull requests
Successful merges:
- #159189 (Account for type alias projections in E0308 "expected/found" shortening logic)
- #158545 (Move `std::io::read_to_string` to `alloc::io`)
- #159328 (tests/assembly-llvm: pin frame pointer in issue-141649 aarch64 test)
- #159470 (Fix string indexing in diagnostic format strings)
- #159500 (Move compiletest CLI parsing to `cli.rs`)
JonathanBrouwer added a commit to JonathanBrouwer/rust that referenced this pull request Jul 18, 2026
…arch64-stack-check, r=mati865
tests/assembly-llvm: pin frame pointer in issue-141649 aarch64 test
The `scoped_two_small_structs` test expects `sub sp, sp, rust-lang#48` on
aarch64, which assumes the frame pointer (x29) is saved. Custom targets
that don't set `frame-pointer: non-leaf` (e.g., OpenEmbedded/Yocto's
`aarch64-poky-linux-gnu`) omit x29, producing `sub sp, sp, rust-lang#32` instead.
Add `-Cforce-frame-pointers=yes` to the aarch64 revision so the test
produces consistent codegen regardless of the target's default frame
pointer policy.
rust-borsBot pushed a commit that referenced this pull request Jul 18, 2026
…uwer
Rollup of 5 pull requests
Successful merges:
- #159467 (Add explicit `Iterator::count` impl for `str::EncodeUtf16`)
- #158545 (Move `std::io::read_to_string` to `alloc::io`)
- #159328 (tests/assembly-llvm: pin frame pointer in issue-141649 aarch64 test)
- #159470 (Fix string indexing in diagnostic format strings)
- #159500 (Move compiletest CLI parsing to `cli.rs`)
rust-borsBot pushed a commit that referenced this pull request Jul 18, 2026
…uwer
Rollup of 8 pull requests
Successful merges:
- #159425 (Windows: add context when opening NUL for child stdio fails)
- #159467 (Add explicit `Iterator::count` impl for `str::EncodeUtf16`)
- #157860 (Move rustdoc run-make tests into new `tests/run-make/rustdoc/`)
- #158545 (Move `std::io::read_to_string` to `alloc::io`)
- #159328 (tests/assembly-llvm: pin frame pointer in issue-141649 aarch64 test)
- #159459 (Detect when trait bound requires closure to return itself)
- #159470 (Fix string indexing in diagnostic format strings)
- #159500 (Move compiletest CLI parsing to `cli.rs`)
@rust-bors
rust-borsBot merged commit 823b135 into rust-lang:mainJul 18, 2026
13 checks passed
@rustbotrustbot added this to the 1.99.0 milestone Jul 18, 2026
rust-timer added a commit that referenced this pull request Jul 18, 2026
Rollup merge of #159328 - DeepeshWR:fix/issue-141649-relax-aarch64-stack-check, r=mati865
tests/assembly-llvm: pin frame pointer in issue-141649 aarch64 test
The `scoped_two_small_structs` test expects `sub sp, sp, #48` on
aarch64, which assumes the frame pointer (x29) is saved. Custom targets
that don't set `frame-pointer: non-leaf` (e.g., OpenEmbedded/Yocto's
`aarch64-poky-linux-gnu`) omit x29, producing `sub sp, sp, #32` instead.
Add `-Cforce-frame-pointers=yes` to the aarch64 revision so the test
produces consistent codegen regardless of the target's default frame
pointer policy.
github-actionsBot pushed a commit to rust-lang/rustc-dev-guide that referenced this pull request Jul 20, 2026
…uwer
Rollup of 8 pull requests
Successful merges:
- rust-lang/rust#159425 (Windows: add context when opening NUL for child stdio fails)
- rust-lang/rust#159467 (Add explicit `Iterator::count` impl for `str::EncodeUtf16`)
- rust-lang/rust#157860 (Move rustdoc run-make tests into new `tests/run-make/rustdoc/`)
- rust-lang/rust#158545 (Move `std::io::read_to_string` to `alloc::io`)
- rust-lang/rust#159328 (tests/assembly-llvm: pin frame pointer in issue-141649 aarch64 test)
- rust-lang/rust#159459 (Detect when trait bound requires closure to return itself)
- rust-lang/rust#159470 (Fix string indexing in diagnostic format strings)
- rust-lang/rust#159500 (Move compiletest CLI parsing to `cli.rs`)
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

S-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.

7 participants

@DeepeshWR@rustbot@jieyouxu@mati865@RalfJung@dianqk@nikic
, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

tests/assembly-llvm: pin frame pointer in issue-141649 aarch64 test - #159328

Merged
rust-bors[bot] merged 1 commit into
rust-lang:mainfrom
DeepeshWR:fix/issue-141649-relax-aarch64-stack-check
Jul 18, 2026
Merged

tests/assembly-llvm: pin frame pointer in issue-141649 aarch64 test#159328
rust-bors[bot] merged 1 commit into
rust-lang:mainfrom
DeepeshWR:fix/issue-141649-relax-aarch64-stack-check

Conversation

@DeepeshWR

@DeepeshWRDeepeshWR commented Jul 15, 2026

Copy link
Copy Markdown
Contributor

The scoped_two_small_structs test expects sub sp, sp, #48 on
aarch64, which assumes the frame pointer (x29) is saved. Custom targets
that don't set frame-pointer: non-leaf (e.g., OpenEmbedded/Yocto's
aarch64-poky-linux-gnu) omit x29, producing sub sp, sp, #32 instead.

Add -Cforce-frame-pointers=yes to the aarch64 revision so the test
produces consistent codegen regardless of the target's default frame
pointer policy.

@rustbotrustbot added 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 Jul 15, 2026
@rustbot

Copy link
Copy Markdown
Collaborator

r? @jieyouxu

rustbot has assigned @jieyouxu.
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: compiler
  • compiler expanded to 75 candidates
  • Random selection from 19 candidates

@rustbot

This comment has been minimized.

@jieyouxu

Copy link
Copy Markdown
Member

@rustbot reroll

@rustbotrustbot assigned mati865 and unassigned jieyouxuJul 15, 2026
@mati865

mati865 commented Jul 15, 2026

Copy link
Copy Markdown
Member

I believe the explanation is a pure hallucination but the test change might be sound (after ammending the other function's comment/assert). Perhaps @nikic or @dianqk could comment on that matter?

@nikicnikic left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The explanation in the PR description is completely nonsense. You're going to have to properly justify where the difference comes from.

View changes since this review

@rustbotrustbot added S-waiting-on-author Status: This is awaiting some action (such as code changes or more information) from the author. and removed S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. labels Jul 15, 2026
@rustbot

Copy link
Copy Markdown
Collaborator

Reminder, once the PR becomes ready for a review, use @rustbot ready.

@mati865

Copy link
Copy Markdown
Member

@rustbot author

@RalfJung

RalfJung commented Jul 15, 2026

Copy link
Copy Markdown
Member

Also please note that AI-generated PR descriptions are frowned upon in this project (and generally I think it is good etiquette to get explicit consent from people before confronting them with AI-generated text, or to hide all such text behind a "further LLVM-generated details you can freely skip"). The point of a PR description is for you to describe your motivation and understanding of this change. During the PR review process we expect to interact with a human who has a genuine interest in understanding how to fix this issue properly, and as part of that we expect the PR description to be written by said human.

@dianqk

Copy link
Copy Markdown
Member

I'm surprised that this is the root cause. LLVM should produce the same result regardless of the optimization level used to build it. Could you explaina bit more?

@DeepeshWR

Copy link
Copy Markdown
ContributorAuthor

Thank you all for the feedback. I apologize for the AI-generated description, that was a mistake on my part. Let me provide the proper explanation based on my investigation.

Root cause:

The failure occurs in OE-core (OpenEmbedded/Yocto) builds where Rust is compiled against an external system LLVM and tests are run against a custom target aarch64-poky-linux-gnu. This custom target JSON spec does not set "frame-pointer": "non-leaf".

The built-in aarch64-unknown-linux-gnu target in Rust has FramePointer::NonLeaf set (per AAPCS64), which forces x29 to be saved on the stack. This adds 16 bytes to the frame:

  • With frame pointer (rust built-in target): saves x29 + x30 + x19 = sub sp, sp, # 48
  • Without frame pointer (OE custom target): saves x30 + x19 only = sub sp, sp, # 32

I confirmed this by changing FramePointer::NonLeaf to FramePointer::MayOmit in compiler/rustc_target/src/spec/targets/aarch64_unknown_linux_gnu.rs this reproduces #32.

I think both the values are correct.

Please let me know what I need to do now. Whether I can update the commit message with the same fix what we have in this PR or shall I update the testcase with -Cforce-frame-pointers=yes for aarch64 revision.

Let me know which approach you'd prefer and I'll update the PR accordingly.

@nikic

Copy link
Copy Markdown
Contributor

I'd prefer the variant using -Cforce-frame-pointers=yes.

The `scoped_two_small_structs` test expects `sub sp, sp, rust-lang#48` on
aarch64, which assumes the frame pointer (x29) is saved. Custom targets
that don't set `frame-pointer: non-leaf` (e.g., OpenEmbedded/Yocto's
`aarch64-poky-linux-gnu`) omit x29, producing `sub sp, sp, rust-lang#32` instead.
Add `-Cforce-frame-pointers=yes` to the aarch64 revision so the test
produces consistent codegen regardless of the target's default frame
pointer policy.
Signed-off-by: Deepesh Varatharajan <Deepesh.Varatharajan@windriver.com>
@DeepeshWR
DeepeshWRforce-pushed the fix/issue-141649-relax-aarch64-stack-check branch from 0cb43cc to 9e0664aCompareJuly 16, 2026 14:52
@rustbot

Copy link
Copy Markdown
Collaborator

⚠️Warning⚠️

  • There are issue links (such as #123) in the commit messages of the following commits.
    Please move them to the PR description, to avoid spamming the issues with references to the commit, and so this bot can automatically canonicalize them to avoid issues with subtree.

@DeepeshWRDeepeshWR changed the title tests/assembly-llvm: relax aarch64 stack size check in issue-141649tests/assembly-llvm: pin frame pointer in issue-141649 aarch64 testJul 16, 2026
@DeepeshWR

Copy link
Copy Markdown
ContributorAuthor

@rustbot ready

@rustbotrustbot added S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. and removed S-waiting-on-author Status: This is awaiting some action (such as code changes or more information) from the author. labels Jul 16, 2026
@DeepeshWR
DeepeshWR requested a review from nikicJuly 17, 2026 02:01

@mati865mati865 left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@rust-bors

rust-borsBot commented Jul 18, 2026

Copy link
Copy Markdown
Contributor

📌 Commit 9e0664a has been approved by mati865

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-review Status: Awaiting review from the assignee but also interested parties. labels Jul 18, 2026
JonathanBrouwer added a commit to JonathanBrouwer/rust that referenced this pull request Jul 18, 2026
…arch64-stack-check, r=mati865
tests/assembly-llvm: pin frame pointer in issue-141649 aarch64 test
The `scoped_two_small_structs` test expects `sub sp, sp, rust-lang#48` on
aarch64, which assumes the frame pointer (x29) is saved. Custom targets
that don't set `frame-pointer: non-leaf` (e.g., OpenEmbedded/Yocto's
`aarch64-poky-linux-gnu`) omit x29, producing `sub sp, sp, rust-lang#32` instead.
Add `-Cforce-frame-pointers=yes` to the aarch64 revision so the test
produces consistent codegen regardless of the target's default frame
pointer policy.
rust-borsBot pushed a commit that referenced this pull request Jul 18, 2026
…uwer
Rollup of 5 pull requests
Successful merges:
- #159189 (Account for type alias projections in E0308 "expected/found" shortening logic)
- #158545 (Move `std::io::read_to_string` to `alloc::io`)
- #159328 (tests/assembly-llvm: pin frame pointer in issue-141649 aarch64 test)
- #159470 (Fix string indexing in diagnostic format strings)
- #159500 (Move compiletest CLI parsing to `cli.rs`)
JonathanBrouwer added a commit to JonathanBrouwer/rust that referenced this pull request Jul 18, 2026
…arch64-stack-check, r=mati865
tests/assembly-llvm: pin frame pointer in issue-141649 aarch64 test
The `scoped_two_small_structs` test expects `sub sp, sp, rust-lang#48` on
aarch64, which assumes the frame pointer (x29) is saved. Custom targets
that don't set `frame-pointer: non-leaf` (e.g., OpenEmbedded/Yocto's
`aarch64-poky-linux-gnu`) omit x29, producing `sub sp, sp, rust-lang#32` instead.
Add `-Cforce-frame-pointers=yes` to the aarch64 revision so the test
produces consistent codegen regardless of the target's default frame
pointer policy.
rust-borsBot pushed a commit that referenced this pull request Jul 18, 2026
…uwer
Rollup of 5 pull requests
Successful merges:
- #159467 (Add explicit `Iterator::count` impl for `str::EncodeUtf16`)
- #158545 (Move `std::io::read_to_string` to `alloc::io`)
- #159328 (tests/assembly-llvm: pin frame pointer in issue-141649 aarch64 test)
- #159470 (Fix string indexing in diagnostic format strings)
- #159500 (Move compiletest CLI parsing to `cli.rs`)
rust-borsBot pushed a commit that referenced this pull request Jul 18, 2026
…uwer
Rollup of 8 pull requests
Successful merges:
- #159425 (Windows: add context when opening NUL for child stdio fails)
- #159467 (Add explicit `Iterator::count` impl for `str::EncodeUtf16`)
- #157860 (Move rustdoc run-make tests into new `tests/run-make/rustdoc/`)
- #158545 (Move `std::io::read_to_string` to `alloc::io`)
- #159328 (tests/assembly-llvm: pin frame pointer in issue-141649 aarch64 test)
- #159459 (Detect when trait bound requires closure to return itself)
- #159470 (Fix string indexing in diagnostic format strings)
- #159500 (Move compiletest CLI parsing to `cli.rs`)
@rust-bors
rust-borsBot merged commit 823b135 into rust-lang:mainJul 18, 2026
13 checks passed
@rustbotrustbot added this to the 1.99.0 milestone Jul 18, 2026
rust-timer added a commit that referenced this pull request Jul 18, 2026
Rollup merge of #159328 - DeepeshWR:fix/issue-141649-relax-aarch64-stack-check, r=mati865
tests/assembly-llvm: pin frame pointer in issue-141649 aarch64 test
The `scoped_two_small_structs` test expects `sub sp, sp, #48` on
aarch64, which assumes the frame pointer (x29) is saved. Custom targets
that don't set `frame-pointer: non-leaf` (e.g., OpenEmbedded/Yocto's
`aarch64-poky-linux-gnu`) omit x29, producing `sub sp, sp, #32` instead.
Add `-Cforce-frame-pointers=yes` to the aarch64 revision so the test
produces consistent codegen regardless of the target's default frame
pointer policy.
github-actionsBot pushed a commit to rust-lang/rustc-dev-guide that referenced this pull request Jul 20, 2026
…uwer
Rollup of 8 pull requests
Successful merges:
- rust-lang/rust#159425 (Windows: add context when opening NUL for child stdio fails)
- rust-lang/rust#159467 (Add explicit `Iterator::count` impl for `str::EncodeUtf16`)
- rust-lang/rust#157860 (Move rustdoc run-make tests into new `tests/run-make/rustdoc/`)
- rust-lang/rust#158545 (Move `std::io::read_to_string` to `alloc::io`)
- rust-lang/rust#159328 (tests/assembly-llvm: pin frame pointer in issue-141649 aarch64 test)
- rust-lang/rust#159459 (Detect when trait bound requires closure to return itself)
- rust-lang/rust#159470 (Fix string indexing in diagnostic format strings)
- rust-lang/rust#159500 (Move compiletest CLI parsing to `cli.rs`)
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

S-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.

7 participants

@DeepeshWR@rustbot@jieyouxu@mati865@RalfJung@dianqk@nikic
, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

tests/assembly-llvm: pin frame pointer in issue-141649 aarch64 test - #159328

Merged
rust-bors[bot] merged 1 commit into
rust-lang:mainfrom
DeepeshWR:fix/issue-141649-relax-aarch64-stack-check
Jul 18, 2026
Merged

tests/assembly-llvm: pin frame pointer in issue-141649 aarch64 test#159328
rust-bors[bot] merged 1 commit into
rust-lang:mainfrom
DeepeshWR:fix/issue-141649-relax-aarch64-stack-check

Conversation

@DeepeshWR

@DeepeshWRDeepeshWR commented Jul 15, 2026

Copy link
Copy Markdown
Contributor

The scoped_two_small_structs test expects sub sp, sp, #48 on
aarch64, which assumes the frame pointer (x29) is saved. Custom targets
that don't set frame-pointer: non-leaf (e.g., OpenEmbedded/Yocto's
aarch64-poky-linux-gnu) omit x29, producing sub sp, sp, #32 instead.

Add -Cforce-frame-pointers=yes to the aarch64 revision so the test
produces consistent codegen regardless of the target's default frame
pointer policy.

@rustbotrustbot added 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 Jul 15, 2026
@rustbot

Copy link
Copy Markdown
Collaborator

r? @jieyouxu

rustbot has assigned @jieyouxu.
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: compiler
  • compiler expanded to 75 candidates
  • Random selection from 19 candidates

@rustbot

This comment has been minimized.

@jieyouxu

Copy link
Copy Markdown
Member

@rustbot reroll

@rustbotrustbot assigned mati865 and unassigned jieyouxuJul 15, 2026
@mati865

mati865 commented Jul 15, 2026

Copy link
Copy Markdown
Member

I believe the explanation is a pure hallucination but the test change might be sound (after ammending the other function's comment/assert). Perhaps @nikic or @dianqk could comment on that matter?

@nikicnikic left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The explanation in the PR description is completely nonsense. You're going to have to properly justify where the difference comes from.

View changes since this review

@rustbotrustbot added S-waiting-on-author Status: This is awaiting some action (such as code changes or more information) from the author. and removed S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. labels Jul 15, 2026
@rustbot

Copy link
Copy Markdown
Collaborator

Reminder, once the PR becomes ready for a review, use @rustbot ready.

@mati865

Copy link
Copy Markdown
Member

@rustbot author

@RalfJung

RalfJung commented Jul 15, 2026

Copy link
Copy Markdown
Member

Also please note that AI-generated PR descriptions are frowned upon in this project (and generally I think it is good etiquette to get explicit consent from people before confronting them with AI-generated text, or to hide all such text behind a "further LLVM-generated details you can freely skip"). The point of a PR description is for you to describe your motivation and understanding of this change. During the PR review process we expect to interact with a human who has a genuine interest in understanding how to fix this issue properly, and as part of that we expect the PR description to be written by said human.

@dianqk

Copy link
Copy Markdown
Member

I'm surprised that this is the root cause. LLVM should produce the same result regardless of the optimization level used to build it. Could you explaina bit more?

@DeepeshWR

Copy link
Copy Markdown
ContributorAuthor

Thank you all for the feedback. I apologize for the AI-generated description, that was a mistake on my part. Let me provide the proper explanation based on my investigation.

Root cause:

The failure occurs in OE-core (OpenEmbedded/Yocto) builds where Rust is compiled against an external system LLVM and tests are run against a custom target aarch64-poky-linux-gnu. This custom target JSON spec does not set "frame-pointer": "non-leaf".

The built-in aarch64-unknown-linux-gnu target in Rust has FramePointer::NonLeaf set (per AAPCS64), which forces x29 to be saved on the stack. This adds 16 bytes to the frame:

  • With frame pointer (rust built-in target): saves x29 + x30 + x19 = sub sp, sp, # 48
  • Without frame pointer (OE custom target): saves x30 + x19 only = sub sp, sp, # 32

I confirmed this by changing FramePointer::NonLeaf to FramePointer::MayOmit in compiler/rustc_target/src/spec/targets/aarch64_unknown_linux_gnu.rs this reproduces #32.

I think both the values are correct.

Please let me know what I need to do now. Whether I can update the commit message with the same fix what we have in this PR or shall I update the testcase with -Cforce-frame-pointers=yes for aarch64 revision.

Let me know which approach you'd prefer and I'll update the PR accordingly.

@nikic

Copy link
Copy Markdown
Contributor

I'd prefer the variant using -Cforce-frame-pointers=yes.

The `scoped_two_small_structs` test expects `sub sp, sp, rust-lang#48` on
aarch64, which assumes the frame pointer (x29) is saved. Custom targets
that don't set `frame-pointer: non-leaf` (e.g., OpenEmbedded/Yocto's
`aarch64-poky-linux-gnu`) omit x29, producing `sub sp, sp, rust-lang#32` instead.
Add `-Cforce-frame-pointers=yes` to the aarch64 revision so the test
produces consistent codegen regardless of the target's default frame
pointer policy.
Signed-off-by: Deepesh Varatharajan <Deepesh.Varatharajan@windriver.com>
@DeepeshWR
DeepeshWRforce-pushed the fix/issue-141649-relax-aarch64-stack-check branch from 0cb43cc to 9e0664aCompareJuly 16, 2026 14:52
@rustbot

Copy link
Copy Markdown
Collaborator

⚠️Warning⚠️

  • There are issue links (such as #123) in the commit messages of the following commits.
    Please move them to the PR description, to avoid spamming the issues with references to the commit, and so this bot can automatically canonicalize them to avoid issues with subtree.

@DeepeshWRDeepeshWR changed the title tests/assembly-llvm: relax aarch64 stack size check in issue-141649tests/assembly-llvm: pin frame pointer in issue-141649 aarch64 testJul 16, 2026
@DeepeshWR

Copy link
Copy Markdown
ContributorAuthor

@rustbot ready

@rustbotrustbot added S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. and removed S-waiting-on-author Status: This is awaiting some action (such as code changes or more information) from the author. labels Jul 16, 2026
@DeepeshWR
DeepeshWR requested a review from nikicJuly 17, 2026 02:01

@mati865mati865 left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@rust-bors

rust-borsBot commented Jul 18, 2026

Copy link
Copy Markdown
Contributor

📌 Commit 9e0664a has been approved by mati865

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-review Status: Awaiting review from the assignee but also interested parties. labels Jul 18, 2026
JonathanBrouwer added a commit to JonathanBrouwer/rust that referenced this pull request Jul 18, 2026
…arch64-stack-check, r=mati865
tests/assembly-llvm: pin frame pointer in issue-141649 aarch64 test
The `scoped_two_small_structs` test expects `sub sp, sp, rust-lang#48` on
aarch64, which assumes the frame pointer (x29) is saved. Custom targets
that don't set `frame-pointer: non-leaf` (e.g., OpenEmbedded/Yocto's
`aarch64-poky-linux-gnu`) omit x29, producing `sub sp, sp, rust-lang#32` instead.
Add `-Cforce-frame-pointers=yes` to the aarch64 revision so the test
produces consistent codegen regardless of the target's default frame
pointer policy.
rust-borsBot pushed a commit that referenced this pull request Jul 18, 2026
…uwer
Rollup of 5 pull requests
Successful merges:
- #159189 (Account for type alias projections in E0308 "expected/found" shortening logic)
- #158545 (Move `std::io::read_to_string` to `alloc::io`)
- #159328 (tests/assembly-llvm: pin frame pointer in issue-141649 aarch64 test)
- #159470 (Fix string indexing in diagnostic format strings)
- #159500 (Move compiletest CLI parsing to `cli.rs`)
JonathanBrouwer added a commit to JonathanBrouwer/rust that referenced this pull request Jul 18, 2026
…arch64-stack-check, r=mati865
tests/assembly-llvm: pin frame pointer in issue-141649 aarch64 test
The `scoped_two_small_structs` test expects `sub sp, sp, rust-lang#48` on
aarch64, which assumes the frame pointer (x29) is saved. Custom targets
that don't set `frame-pointer: non-leaf` (e.g., OpenEmbedded/Yocto's
`aarch64-poky-linux-gnu`) omit x29, producing `sub sp, sp, rust-lang#32` instead.
Add `-Cforce-frame-pointers=yes` to the aarch64 revision so the test
produces consistent codegen regardless of the target's default frame
pointer policy.
rust-borsBot pushed a commit that referenced this pull request Jul 18, 2026
…uwer
Rollup of 5 pull requests
Successful merges:
- #159467 (Add explicit `Iterator::count` impl for `str::EncodeUtf16`)
- #158545 (Move `std::io::read_to_string` to `alloc::io`)
- #159328 (tests/assembly-llvm: pin frame pointer in issue-141649 aarch64 test)
- #159470 (Fix string indexing in diagnostic format strings)
- #159500 (Move compiletest CLI parsing to `cli.rs`)
rust-borsBot pushed a commit that referenced this pull request Jul 18, 2026
…uwer
Rollup of 8 pull requests
Successful merges:
- #159425 (Windows: add context when opening NUL for child stdio fails)
- #159467 (Add explicit `Iterator::count` impl for `str::EncodeUtf16`)
- #157860 (Move rustdoc run-make tests into new `tests/run-make/rustdoc/`)
- #158545 (Move `std::io::read_to_string` to `alloc::io`)
- #159328 (tests/assembly-llvm: pin frame pointer in issue-141649 aarch64 test)
- #159459 (Detect when trait bound requires closure to return itself)
- #159470 (Fix string indexing in diagnostic format strings)
- #159500 (Move compiletest CLI parsing to `cli.rs`)
@rust-bors
rust-borsBot merged commit 823b135 into rust-lang:mainJul 18, 2026
13 checks passed
@rustbotrustbot added this to the 1.99.0 milestone Jul 18, 2026
rust-timer added a commit that referenced this pull request Jul 18, 2026
Rollup merge of #159328 - DeepeshWR:fix/issue-141649-relax-aarch64-stack-check, r=mati865
tests/assembly-llvm: pin frame pointer in issue-141649 aarch64 test
The `scoped_two_small_structs` test expects `sub sp, sp, #48` on
aarch64, which assumes the frame pointer (x29) is saved. Custom targets
that don't set `frame-pointer: non-leaf` (e.g., OpenEmbedded/Yocto's
`aarch64-poky-linux-gnu`) omit x29, producing `sub sp, sp, #32` instead.
Add `-Cforce-frame-pointers=yes` to the aarch64 revision so the test
produces consistent codegen regardless of the target's default frame
pointer policy.
github-actionsBot pushed a commit to rust-lang/rustc-dev-guide that referenced this pull request Jul 20, 2026
…uwer
Rollup of 8 pull requests
Successful merges:
- rust-lang/rust#159425 (Windows: add context when opening NUL for child stdio fails)
- rust-lang/rust#159467 (Add explicit `Iterator::count` impl for `str::EncodeUtf16`)
- rust-lang/rust#157860 (Move rustdoc run-make tests into new `tests/run-make/rustdoc/`)
- rust-lang/rust#158545 (Move `std::io::read_to_string` to `alloc::io`)
- rust-lang/rust#159328 (tests/assembly-llvm: pin frame pointer in issue-141649 aarch64 test)
- rust-lang/rust#159459 (Detect when trait bound requires closure to return itself)
- rust-lang/rust#159470 (Fix string indexing in diagnostic format strings)
- rust-lang/rust#159500 (Move compiletest CLI parsing to `cli.rs`)
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

S-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.

7 participants

@DeepeshWR@rustbot@jieyouxu@mati865@RalfJung@dianqk@nikic
, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

tests/assembly-llvm: pin frame pointer in issue-141649 aarch64 test - #159328

Merged
rust-bors[bot] merged 1 commit into
rust-lang:mainfrom
DeepeshWR:fix/issue-141649-relax-aarch64-stack-check
Jul 18, 2026
Merged

tests/assembly-llvm: pin frame pointer in issue-141649 aarch64 test#159328
rust-bors[bot] merged 1 commit into
rust-lang:mainfrom
DeepeshWR:fix/issue-141649-relax-aarch64-stack-check

Conversation

@DeepeshWR

@DeepeshWRDeepeshWR commented Jul 15, 2026

Copy link
Copy Markdown
Contributor

The scoped_two_small_structs test expects sub sp, sp, #48 on
aarch64, which assumes the frame pointer (x29) is saved. Custom targets
that don't set frame-pointer: non-leaf (e.g., OpenEmbedded/Yocto's
aarch64-poky-linux-gnu) omit x29, producing sub sp, sp, #32 instead.

Add -Cforce-frame-pointers=yes to the aarch64 revision so the test
produces consistent codegen regardless of the target's default frame
pointer policy.

@rustbotrustbot added 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 Jul 15, 2026
@rustbot

Copy link
Copy Markdown
Collaborator

r? @jieyouxu

rustbot has assigned @jieyouxu.
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: compiler
  • compiler expanded to 75 candidates
  • Random selection from 19 candidates

@rustbot

This comment has been minimized.

@jieyouxu

Copy link
Copy Markdown
Member

@rustbot reroll

@rustbotrustbot assigned mati865 and unassigned jieyouxuJul 15, 2026
@mati865

mati865 commented Jul 15, 2026

Copy link
Copy Markdown
Member

I believe the explanation is a pure hallucination but the test change might be sound (after ammending the other function's comment/assert). Perhaps @nikic or @dianqk could comment on that matter?

@nikicnikic left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The explanation in the PR description is completely nonsense. You're going to have to properly justify where the difference comes from.

View changes since this review

@rustbotrustbot added S-waiting-on-author Status: This is awaiting some action (such as code changes or more information) from the author. and removed S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. labels Jul 15, 2026
@rustbot

Copy link
Copy Markdown
Collaborator

Reminder, once the PR becomes ready for a review, use @rustbot ready.

@mati865

Copy link
Copy Markdown
Member

@rustbot author

@RalfJung

RalfJung commented Jul 15, 2026

Copy link
Copy Markdown
Member

Also please note that AI-generated PR descriptions are frowned upon in this project (and generally I think it is good etiquette to get explicit consent from people before confronting them with AI-generated text, or to hide all such text behind a "further LLVM-generated details you can freely skip"). The point of a PR description is for you to describe your motivation and understanding of this change. During the PR review process we expect to interact with a human who has a genuine interest in understanding how to fix this issue properly, and as part of that we expect the PR description to be written by said human.

@dianqk

Copy link
Copy Markdown
Member

I'm surprised that this is the root cause. LLVM should produce the same result regardless of the optimization level used to build it. Could you explaina bit more?

@DeepeshWR

Copy link
Copy Markdown
ContributorAuthor

Thank you all for the feedback. I apologize for the AI-generated description, that was a mistake on my part. Let me provide the proper explanation based on my investigation.

Root cause:

The failure occurs in OE-core (OpenEmbedded/Yocto) builds where Rust is compiled against an external system LLVM and tests are run against a custom target aarch64-poky-linux-gnu. This custom target JSON spec does not set "frame-pointer": "non-leaf".

The built-in aarch64-unknown-linux-gnu target in Rust has FramePointer::NonLeaf set (per AAPCS64), which forces x29 to be saved on the stack. This adds 16 bytes to the frame:

  • With frame pointer (rust built-in target): saves x29 + x30 + x19 = sub sp, sp, # 48
  • Without frame pointer (OE custom target): saves x30 + x19 only = sub sp, sp, # 32

I confirmed this by changing FramePointer::NonLeaf to FramePointer::MayOmit in compiler/rustc_target/src/spec/targets/aarch64_unknown_linux_gnu.rs this reproduces #32.

I think both the values are correct.

Please let me know what I need to do now. Whether I can update the commit message with the same fix what we have in this PR or shall I update the testcase with -Cforce-frame-pointers=yes for aarch64 revision.

Let me know which approach you'd prefer and I'll update the PR accordingly.

@nikic

Copy link
Copy Markdown
Contributor

I'd prefer the variant using -Cforce-frame-pointers=yes.

The `scoped_two_small_structs` test expects `sub sp, sp, rust-lang#48` on
aarch64, which assumes the frame pointer (x29) is saved. Custom targets
that don't set `frame-pointer: non-leaf` (e.g., OpenEmbedded/Yocto's
`aarch64-poky-linux-gnu`) omit x29, producing `sub sp, sp, rust-lang#32` instead.
Add `-Cforce-frame-pointers=yes` to the aarch64 revision so the test
produces consistent codegen regardless of the target's default frame
pointer policy.
Signed-off-by: Deepesh Varatharajan <Deepesh.Varatharajan@windriver.com>
@DeepeshWR
DeepeshWRforce-pushed the fix/issue-141649-relax-aarch64-stack-check branch from 0cb43cc to 9e0664aCompareJuly 16, 2026 14:52
@rustbot

Copy link
Copy Markdown
Collaborator

⚠️Warning⚠️

  • There are issue links (such as #123) in the commit messages of the following commits.
    Please move them to the PR description, to avoid spamming the issues with references to the commit, and so this bot can automatically canonicalize them to avoid issues with subtree.

@DeepeshWRDeepeshWR changed the title tests/assembly-llvm: relax aarch64 stack size check in issue-141649tests/assembly-llvm: pin frame pointer in issue-141649 aarch64 testJul 16, 2026
@DeepeshWR

Copy link
Copy Markdown
ContributorAuthor

@rustbot ready

@rustbotrustbot added S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. and removed S-waiting-on-author Status: This is awaiting some action (such as code changes or more information) from the author. labels Jul 16, 2026
@DeepeshWR
DeepeshWR requested a review from nikicJuly 17, 2026 02:01

@mati865mati865 left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@rust-bors

rust-borsBot commented Jul 18, 2026

Copy link
Copy Markdown
Contributor

📌 Commit 9e0664a has been approved by mati865

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-review Status: Awaiting review from the assignee but also interested parties. labels Jul 18, 2026
JonathanBrouwer added a commit to JonathanBrouwer/rust that referenced this pull request Jul 18, 2026
…arch64-stack-check, r=mati865
tests/assembly-llvm: pin frame pointer in issue-141649 aarch64 test
The `scoped_two_small_structs` test expects `sub sp, sp, rust-lang#48` on
aarch64, which assumes the frame pointer (x29) is saved. Custom targets
that don't set `frame-pointer: non-leaf` (e.g., OpenEmbedded/Yocto's
`aarch64-poky-linux-gnu`) omit x29, producing `sub sp, sp, rust-lang#32` instead.
Add `-Cforce-frame-pointers=yes` to the aarch64 revision so the test
produces consistent codegen regardless of the target's default frame
pointer policy.
rust-borsBot pushed a commit that referenced this pull request Jul 18, 2026
…uwer
Rollup of 5 pull requests
Successful merges:
- #159189 (Account for type alias projections in E0308 "expected/found" shortening logic)
- #158545 (Move `std::io::read_to_string` to `alloc::io`)
- #159328 (tests/assembly-llvm: pin frame pointer in issue-141649 aarch64 test)
- #159470 (Fix string indexing in diagnostic format strings)
- #159500 (Move compiletest CLI parsing to `cli.rs`)
JonathanBrouwer added a commit to JonathanBrouwer/rust that referenced this pull request Jul 18, 2026
…arch64-stack-check, r=mati865
tests/assembly-llvm: pin frame pointer in issue-141649 aarch64 test
The `scoped_two_small_structs` test expects `sub sp, sp, rust-lang#48` on
aarch64, which assumes the frame pointer (x29) is saved. Custom targets
that don't set `frame-pointer: non-leaf` (e.g., OpenEmbedded/Yocto's
`aarch64-poky-linux-gnu`) omit x29, producing `sub sp, sp, rust-lang#32` instead.
Add `-Cforce-frame-pointers=yes` to the aarch64 revision so the test
produces consistent codegen regardless of the target's default frame
pointer policy.
rust-borsBot pushed a commit that referenced this pull request Jul 18, 2026
…uwer
Rollup of 5 pull requests
Successful merges:
- #159467 (Add explicit `Iterator::count` impl for `str::EncodeUtf16`)
- #158545 (Move `std::io::read_to_string` to `alloc::io`)
- #159328 (tests/assembly-llvm: pin frame pointer in issue-141649 aarch64 test)
- #159470 (Fix string indexing in diagnostic format strings)
- #159500 (Move compiletest CLI parsing to `cli.rs`)
rust-borsBot pushed a commit that referenced this pull request Jul 18, 2026
…uwer
Rollup of 8 pull requests
Successful merges:
- #159425 (Windows: add context when opening NUL for child stdio fails)
- #159467 (Add explicit `Iterator::count` impl for `str::EncodeUtf16`)
- #157860 (Move rustdoc run-make tests into new `tests/run-make/rustdoc/`)
- #158545 (Move `std::io::read_to_string` to `alloc::io`)
- #159328 (tests/assembly-llvm: pin frame pointer in issue-141649 aarch64 test)
- #159459 (Detect when trait bound requires closure to return itself)
- #159470 (Fix string indexing in diagnostic format strings)
- #159500 (Move compiletest CLI parsing to `cli.rs`)
@rust-bors
rust-borsBot merged commit 823b135 into rust-lang:mainJul 18, 2026
13 checks passed
@rustbotrustbot added this to the 1.99.0 milestone Jul 18, 2026
rust-timer added a commit that referenced this pull request Jul 18, 2026
Rollup merge of #159328 - DeepeshWR:fix/issue-141649-relax-aarch64-stack-check, r=mati865
tests/assembly-llvm: pin frame pointer in issue-141649 aarch64 test
The `scoped_two_small_structs` test expects `sub sp, sp, #48` on
aarch64, which assumes the frame pointer (x29) is saved. Custom targets
that don't set `frame-pointer: non-leaf` (e.g., OpenEmbedded/Yocto's
`aarch64-poky-linux-gnu`) omit x29, producing `sub sp, sp, #32` instead.
Add `-Cforce-frame-pointers=yes` to the aarch64 revision so the test
produces consistent codegen regardless of the target's default frame
pointer policy.
github-actionsBot pushed a commit to rust-lang/rustc-dev-guide that referenced this pull request Jul 20, 2026
…uwer
Rollup of 8 pull requests
Successful merges:
- rust-lang/rust#159425 (Windows: add context when opening NUL for child stdio fails)
- rust-lang/rust#159467 (Add explicit `Iterator::count` impl for `str::EncodeUtf16`)
- rust-lang/rust#157860 (Move rustdoc run-make tests into new `tests/run-make/rustdoc/`)
- rust-lang/rust#158545 (Move `std::io::read_to_string` to `alloc::io`)
- rust-lang/rust#159328 (tests/assembly-llvm: pin frame pointer in issue-141649 aarch64 test)
- rust-lang/rust#159459 (Detect when trait bound requires closure to return itself)
- rust-lang/rust#159470 (Fix string indexing in diagnostic format strings)
- rust-lang/rust#159500 (Move compiletest CLI parsing to `cli.rs`)
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

S-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.

7 participants

@DeepeshWR@rustbot@jieyouxu@mati865@RalfJung@dianqk@nikic
, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

tests/assembly-llvm: pin frame pointer in issue-141649 aarch64 test - #159328

Merged
rust-bors[bot] merged 1 commit into
rust-lang:mainfrom
DeepeshWR:fix/issue-141649-relax-aarch64-stack-check
Jul 18, 2026
Merged

tests/assembly-llvm: pin frame pointer in issue-141649 aarch64 test#159328
rust-bors[bot] merged 1 commit into
rust-lang:mainfrom
DeepeshWR:fix/issue-141649-relax-aarch64-stack-check

Conversation

@DeepeshWR

@DeepeshWRDeepeshWR commented Jul 15, 2026

Copy link
Copy Markdown
Contributor

The scoped_two_small_structs test expects sub sp, sp, #48 on
aarch64, which assumes the frame pointer (x29) is saved. Custom targets
that don't set frame-pointer: non-leaf (e.g., OpenEmbedded/Yocto's
aarch64-poky-linux-gnu) omit x29, producing sub sp, sp, #32 instead.

Add -Cforce-frame-pointers=yes to the aarch64 revision so the test
produces consistent codegen regardless of the target's default frame
pointer policy.

@rustbotrustbot added 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 Jul 15, 2026
@rustbot

Copy link
Copy Markdown
Collaborator

r? @jieyouxu

rustbot has assigned @jieyouxu.
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: compiler
  • compiler expanded to 75 candidates
  • Random selection from 19 candidates

@rustbot

This comment has been minimized.

@jieyouxu

Copy link
Copy Markdown
Member

@rustbot reroll

@rustbotrustbot assigned mati865 and unassigned jieyouxuJul 15, 2026
@mati865

mati865 commented Jul 15, 2026

Copy link
Copy Markdown
Member

I believe the explanation is a pure hallucination but the test change might be sound (after ammending the other function's comment/assert). Perhaps @nikic or @dianqk could comment on that matter?

@nikicnikic left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The explanation in the PR description is completely nonsense. You're going to have to properly justify where the difference comes from.

View changes since this review

@rustbotrustbot added S-waiting-on-author Status: This is awaiting some action (such as code changes or more information) from the author. and removed S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. labels Jul 15, 2026
@rustbot

Copy link
Copy Markdown
Collaborator

Reminder, once the PR becomes ready for a review, use @rustbot ready.

@mati865

Copy link
Copy Markdown
Member

@rustbot author

@RalfJung

RalfJung commented Jul 15, 2026

Copy link
Copy Markdown
Member

Also please note that AI-generated PR descriptions are frowned upon in this project (and generally I think it is good etiquette to get explicit consent from people before confronting them with AI-generated text, or to hide all such text behind a "further LLVM-generated details you can freely skip"). The point of a PR description is for you to describe your motivation and understanding of this change. During the PR review process we expect to interact with a human who has a genuine interest in understanding how to fix this issue properly, and as part of that we expect the PR description to be written by said human.

@dianqk

Copy link
Copy Markdown
Member

I'm surprised that this is the root cause. LLVM should produce the same result regardless of the optimization level used to build it. Could you explaina bit more?

@DeepeshWR

Copy link
Copy Markdown
ContributorAuthor

Thank you all for the feedback. I apologize for the AI-generated description, that was a mistake on my part. Let me provide the proper explanation based on my investigation.

Root cause:

The failure occurs in OE-core (OpenEmbedded/Yocto) builds where Rust is compiled against an external system LLVM and tests are run against a custom target aarch64-poky-linux-gnu. This custom target JSON spec does not set "frame-pointer": "non-leaf".

The built-in aarch64-unknown-linux-gnu target in Rust has FramePointer::NonLeaf set (per AAPCS64), which forces x29 to be saved on the stack. This adds 16 bytes to the frame:

  • With frame pointer (rust built-in target): saves x29 + x30 + x19 = sub sp, sp, # 48
  • Without frame pointer (OE custom target): saves x30 + x19 only = sub sp, sp, # 32

I confirmed this by changing FramePointer::NonLeaf to FramePointer::MayOmit in compiler/rustc_target/src/spec/targets/aarch64_unknown_linux_gnu.rs this reproduces #32.

I think both the values are correct.

Please let me know what I need to do now. Whether I can update the commit message with the same fix what we have in this PR or shall I update the testcase with -Cforce-frame-pointers=yes for aarch64 revision.

Let me know which approach you'd prefer and I'll update the PR accordingly.

@nikic

Copy link
Copy Markdown
Contributor

I'd prefer the variant using -Cforce-frame-pointers=yes.

The `scoped_two_small_structs` test expects `sub sp, sp, rust-lang#48` on
aarch64, which assumes the frame pointer (x29) is saved. Custom targets
that don't set `frame-pointer: non-leaf` (e.g., OpenEmbedded/Yocto's
`aarch64-poky-linux-gnu`) omit x29, producing `sub sp, sp, rust-lang#32` instead.
Add `-Cforce-frame-pointers=yes` to the aarch64 revision so the test
produces consistent codegen regardless of the target's default frame
pointer policy.
Signed-off-by: Deepesh Varatharajan <Deepesh.Varatharajan@windriver.com>
@DeepeshWR
DeepeshWRforce-pushed the fix/issue-141649-relax-aarch64-stack-check branch from 0cb43cc to 9e0664aCompareJuly 16, 2026 14:52
@rustbot

Copy link
Copy Markdown
Collaborator

⚠️Warning⚠️

  • There are issue links (such as #123) in the commit messages of the following commits.
    Please move them to the PR description, to avoid spamming the issues with references to the commit, and so this bot can automatically canonicalize them to avoid issues with subtree.

@DeepeshWRDeepeshWR changed the title tests/assembly-llvm: relax aarch64 stack size check in issue-141649tests/assembly-llvm: pin frame pointer in issue-141649 aarch64 testJul 16, 2026
@DeepeshWR

Copy link
Copy Markdown
ContributorAuthor

@rustbot ready

@rustbotrustbot added S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. and removed S-waiting-on-author Status: This is awaiting some action (such as code changes or more information) from the author. labels Jul 16, 2026
@DeepeshWR
DeepeshWR requested a review from nikicJuly 17, 2026 02:01

@mati865mati865 left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@rust-bors

rust-borsBot commented Jul 18, 2026

Copy link
Copy Markdown
Contributor

📌 Commit 9e0664a has been approved by mati865

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-review Status: Awaiting review from the assignee but also interested parties. labels Jul 18, 2026
JonathanBrouwer added a commit to JonathanBrouwer/rust that referenced this pull request Jul 18, 2026
…arch64-stack-check, r=mati865
tests/assembly-llvm: pin frame pointer in issue-141649 aarch64 test
The `scoped_two_small_structs` test expects `sub sp, sp, rust-lang#48` on
aarch64, which assumes the frame pointer (x29) is saved. Custom targets
that don't set `frame-pointer: non-leaf` (e.g., OpenEmbedded/Yocto's
`aarch64-poky-linux-gnu`) omit x29, producing `sub sp, sp, rust-lang#32` instead.
Add `-Cforce-frame-pointers=yes` to the aarch64 revision so the test
produces consistent codegen regardless of the target's default frame
pointer policy.
rust-borsBot pushed a commit that referenced this pull request Jul 18, 2026
…uwer
Rollup of 5 pull requests
Successful merges:
- #159189 (Account for type alias projections in E0308 "expected/found" shortening logic)
- #158545 (Move `std::io::read_to_string` to `alloc::io`)
- #159328 (tests/assembly-llvm: pin frame pointer in issue-141649 aarch64 test)
- #159470 (Fix string indexing in diagnostic format strings)
- #159500 (Move compiletest CLI parsing to `cli.rs`)
JonathanBrouwer added a commit to JonathanBrouwer/rust that referenced this pull request Jul 18, 2026
…arch64-stack-check, r=mati865
tests/assembly-llvm: pin frame pointer in issue-141649 aarch64 test
The `scoped_two_small_structs` test expects `sub sp, sp, rust-lang#48` on
aarch64, which assumes the frame pointer (x29) is saved. Custom targets
that don't set `frame-pointer: non-leaf` (e.g., OpenEmbedded/Yocto's
`aarch64-poky-linux-gnu`) omit x29, producing `sub sp, sp, rust-lang#32` instead.
Add `-Cforce-frame-pointers=yes` to the aarch64 revision so the test
produces consistent codegen regardless of the target's default frame
pointer policy.
rust-borsBot pushed a commit that referenced this pull request Jul 18, 2026
…uwer
Rollup of 5 pull requests
Successful merges:
- #159467 (Add explicit `Iterator::count` impl for `str::EncodeUtf16`)
- #158545 (Move `std::io::read_to_string` to `alloc::io`)
- #159328 (tests/assembly-llvm: pin frame pointer in issue-141649 aarch64 test)
- #159470 (Fix string indexing in diagnostic format strings)
- #159500 (Move compiletest CLI parsing to `cli.rs`)
rust-borsBot pushed a commit that referenced this pull request Jul 18, 2026
…uwer
Rollup of 8 pull requests
Successful merges:
- #159425 (Windows: add context when opening NUL for child stdio fails)
- #159467 (Add explicit `Iterator::count` impl for `str::EncodeUtf16`)
- #157860 (Move rustdoc run-make tests into new `tests/run-make/rustdoc/`)
- #158545 (Move `std::io::read_to_string` to `alloc::io`)
- #159328 (tests/assembly-llvm: pin frame pointer in issue-141649 aarch64 test)
- #159459 (Detect when trait bound requires closure to return itself)
- #159470 (Fix string indexing in diagnostic format strings)
- #159500 (Move compiletest CLI parsing to `cli.rs`)
@rust-bors
rust-borsBot merged commit 823b135 into rust-lang:mainJul 18, 2026
13 checks passed
@rustbotrustbot added this to the 1.99.0 milestone Jul 18, 2026
rust-timer added a commit that referenced this pull request Jul 18, 2026
Rollup merge of #159328 - DeepeshWR:fix/issue-141649-relax-aarch64-stack-check, r=mati865
tests/assembly-llvm: pin frame pointer in issue-141649 aarch64 test
The `scoped_two_small_structs` test expects `sub sp, sp, #48` on
aarch64, which assumes the frame pointer (x29) is saved. Custom targets
that don't set `frame-pointer: non-leaf` (e.g., OpenEmbedded/Yocto's
`aarch64-poky-linux-gnu`) omit x29, producing `sub sp, sp, #32` instead.
Add `-Cforce-frame-pointers=yes` to the aarch64 revision so the test
produces consistent codegen regardless of the target's default frame
pointer policy.
github-actionsBot pushed a commit to rust-lang/rustc-dev-guide that referenced this pull request Jul 20, 2026
…uwer
Rollup of 8 pull requests
Successful merges:
- rust-lang/rust#159425 (Windows: add context when opening NUL for child stdio fails)
- rust-lang/rust#159467 (Add explicit `Iterator::count` impl for `str::EncodeUtf16`)
- rust-lang/rust#157860 (Move rustdoc run-make tests into new `tests/run-make/rustdoc/`)
- rust-lang/rust#158545 (Move `std::io::read_to_string` to `alloc::io`)
- rust-lang/rust#159328 (tests/assembly-llvm: pin frame pointer in issue-141649 aarch64 test)
- rust-lang/rust#159459 (Detect when trait bound requires closure to return itself)
- rust-lang/rust#159470 (Fix string indexing in diagnostic format strings)
- rust-lang/rust#159500 (Move compiletest CLI parsing to `cli.rs`)
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

S-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.

7 participants

@DeepeshWR@rustbot@jieyouxu@mati865@RalfJung@dianqk@nikic
, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

tests/assembly-llvm: pin frame pointer in issue-141649 aarch64 test - #159328

Merged
rust-bors[bot] merged 1 commit into
rust-lang:mainfrom
DeepeshWR:fix/issue-141649-relax-aarch64-stack-check
Jul 18, 2026
Merged

tests/assembly-llvm: pin frame pointer in issue-141649 aarch64 test#159328
rust-bors[bot] merged 1 commit into
rust-lang:mainfrom
DeepeshWR:fix/issue-141649-relax-aarch64-stack-check

Conversation

@DeepeshWR

@DeepeshWRDeepeshWR commented Jul 15, 2026

Copy link
Copy Markdown
Contributor

The scoped_two_small_structs test expects sub sp, sp, #48 on
aarch64, which assumes the frame pointer (x29) is saved. Custom targets
that don't set frame-pointer: non-leaf (e.g., OpenEmbedded/Yocto's
aarch64-poky-linux-gnu) omit x29, producing sub sp, sp, #32 instead.

Add -Cforce-frame-pointers=yes to the aarch64 revision so the test
produces consistent codegen regardless of the target's default frame
pointer policy.

@rustbotrustbot added 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 Jul 15, 2026
@rustbot

Copy link
Copy Markdown
Collaborator

r? @jieyouxu

rustbot has assigned @jieyouxu.
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: compiler
  • compiler expanded to 75 candidates
  • Random selection from 19 candidates

@rustbot

This comment has been minimized.

@jieyouxu

Copy link
Copy Markdown
Member

@rustbot reroll

@rustbotrustbot assigned mati865 and unassigned jieyouxuJul 15, 2026
@mati865

mati865 commented Jul 15, 2026

Copy link
Copy Markdown
Member

I believe the explanation is a pure hallucination but the test change might be sound (after ammending the other function's comment/assert). Perhaps @nikic or @dianqk could comment on that matter?

@nikicnikic left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The explanation in the PR description is completely nonsense. You're going to have to properly justify where the difference comes from.

View changes since this review

@rustbotrustbot added S-waiting-on-author Status: This is awaiting some action (such as code changes or more information) from the author. and removed S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. labels Jul 15, 2026
@rustbot

Copy link
Copy Markdown
Collaborator

Reminder, once the PR becomes ready for a review, use @rustbot ready.

@mati865

Copy link
Copy Markdown
Member

@rustbot author

@RalfJung

RalfJung commented Jul 15, 2026

Copy link
Copy Markdown
Member

Also please note that AI-generated PR descriptions are frowned upon in this project (and generally I think it is good etiquette to get explicit consent from people before confronting them with AI-generated text, or to hide all such text behind a "further LLVM-generated details you can freely skip"). The point of a PR description is for you to describe your motivation and understanding of this change. During the PR review process we expect to interact with a human who has a genuine interest in understanding how to fix this issue properly, and as part of that we expect the PR description to be written by said human.

@dianqk

Copy link
Copy Markdown
Member

I'm surprised that this is the root cause. LLVM should produce the same result regardless of the optimization level used to build it. Could you explaina bit more?

@DeepeshWR

Copy link
Copy Markdown
ContributorAuthor

Thank you all for the feedback. I apologize for the AI-generated description, that was a mistake on my part. Let me provide the proper explanation based on my investigation.

Root cause:

The failure occurs in OE-core (OpenEmbedded/Yocto) builds where Rust is compiled against an external system LLVM and tests are run against a custom target aarch64-poky-linux-gnu. This custom target JSON spec does not set "frame-pointer": "non-leaf".

The built-in aarch64-unknown-linux-gnu target in Rust has FramePointer::NonLeaf set (per AAPCS64), which forces x29 to be saved on the stack. This adds 16 bytes to the frame:

  • With frame pointer (rust built-in target): saves x29 + x30 + x19 = sub sp, sp, # 48
  • Without frame pointer (OE custom target): saves x30 + x19 only = sub sp, sp, # 32

I confirmed this by changing FramePointer::NonLeaf to FramePointer::MayOmit in compiler/rustc_target/src/spec/targets/aarch64_unknown_linux_gnu.rs this reproduces #32.

I think both the values are correct.

Please let me know what I need to do now. Whether I can update the commit message with the same fix what we have in this PR or shall I update the testcase with -Cforce-frame-pointers=yes for aarch64 revision.

Let me know which approach you'd prefer and I'll update the PR accordingly.

@nikic

Copy link
Copy Markdown
Contributor

I'd prefer the variant using -Cforce-frame-pointers=yes.

The `scoped_two_small_structs` test expects `sub sp, sp, rust-lang#48` on
aarch64, which assumes the frame pointer (x29) is saved. Custom targets
that don't set `frame-pointer: non-leaf` (e.g., OpenEmbedded/Yocto's
`aarch64-poky-linux-gnu`) omit x29, producing `sub sp, sp, rust-lang#32` instead.
Add `-Cforce-frame-pointers=yes` to the aarch64 revision so the test
produces consistent codegen regardless of the target's default frame
pointer policy.
Signed-off-by: Deepesh Varatharajan <Deepesh.Varatharajan@windriver.com>
@DeepeshWR
DeepeshWRforce-pushed the fix/issue-141649-relax-aarch64-stack-check branch from 0cb43cc to 9e0664aCompareJuly 16, 2026 14:52
@rustbot

Copy link
Copy Markdown
Collaborator

⚠️Warning⚠️

  • There are issue links (such as #123) in the commit messages of the following commits.
    Please move them to the PR description, to avoid spamming the issues with references to the commit, and so this bot can automatically canonicalize them to avoid issues with subtree.

@DeepeshWRDeepeshWR changed the title tests/assembly-llvm: relax aarch64 stack size check in issue-141649tests/assembly-llvm: pin frame pointer in issue-141649 aarch64 testJul 16, 2026
@DeepeshWR

Copy link
Copy Markdown
ContributorAuthor

@rustbot ready

@rustbotrustbot added S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. and removed S-waiting-on-author Status: This is awaiting some action (such as code changes or more information) from the author. labels Jul 16, 2026
@DeepeshWR
DeepeshWR requested a review from nikicJuly 17, 2026 02:01

@mati865mati865 left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@rust-bors

rust-borsBot commented Jul 18, 2026

Copy link
Copy Markdown
Contributor

📌 Commit 9e0664a has been approved by mati865

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-review Status: Awaiting review from the assignee but also interested parties. labels Jul 18, 2026
JonathanBrouwer added a commit to JonathanBrouwer/rust that referenced this pull request Jul 18, 2026
…arch64-stack-check, r=mati865
tests/assembly-llvm: pin frame pointer in issue-141649 aarch64 test
The `scoped_two_small_structs` test expects `sub sp, sp, rust-lang#48` on
aarch64, which assumes the frame pointer (x29) is saved. Custom targets
that don't set `frame-pointer: non-leaf` (e.g., OpenEmbedded/Yocto's
`aarch64-poky-linux-gnu`) omit x29, producing `sub sp, sp, rust-lang#32` instead.
Add `-Cforce-frame-pointers=yes` to the aarch64 revision so the test
produces consistent codegen regardless of the target's default frame
pointer policy.
rust-borsBot pushed a commit that referenced this pull request Jul 18, 2026
…uwer
Rollup of 5 pull requests
Successful merges:
- #159189 (Account for type alias projections in E0308 "expected/found" shortening logic)
- #158545 (Move `std::io::read_to_string` to `alloc::io`)
- #159328 (tests/assembly-llvm: pin frame pointer in issue-141649 aarch64 test)
- #159470 (Fix string indexing in diagnostic format strings)
- #159500 (Move compiletest CLI parsing to `cli.rs`)
JonathanBrouwer added a commit to JonathanBrouwer/rust that referenced this pull request Jul 18, 2026
…arch64-stack-check, r=mati865
tests/assembly-llvm: pin frame pointer in issue-141649 aarch64 test
The `scoped_two_small_structs` test expects `sub sp, sp, rust-lang#48` on
aarch64, which assumes the frame pointer (x29) is saved. Custom targets
that don't set `frame-pointer: non-leaf` (e.g., OpenEmbedded/Yocto's
`aarch64-poky-linux-gnu`) omit x29, producing `sub sp, sp, rust-lang#32` instead.
Add `-Cforce-frame-pointers=yes` to the aarch64 revision so the test
produces consistent codegen regardless of the target's default frame
pointer policy.
rust-borsBot pushed a commit that referenced this pull request Jul 18, 2026
…uwer
Rollup of 5 pull requests
Successful merges:
- #159467 (Add explicit `Iterator::count` impl for `str::EncodeUtf16`)
- #158545 (Move `std::io::read_to_string` to `alloc::io`)
- #159328 (tests/assembly-llvm: pin frame pointer in issue-141649 aarch64 test)
- #159470 (Fix string indexing in diagnostic format strings)
- #159500 (Move compiletest CLI parsing to `cli.rs`)
rust-borsBot pushed a commit that referenced this pull request Jul 18, 2026
…uwer
Rollup of 8 pull requests
Successful merges:
- #159425 (Windows: add context when opening NUL for child stdio fails)
- #159467 (Add explicit `Iterator::count` impl for `str::EncodeUtf16`)
- #157860 (Move rustdoc run-make tests into new `tests/run-make/rustdoc/`)
- #158545 (Move `std::io::read_to_string` to `alloc::io`)
- #159328 (tests/assembly-llvm: pin frame pointer in issue-141649 aarch64 test)
- #159459 (Detect when trait bound requires closure to return itself)
- #159470 (Fix string indexing in diagnostic format strings)
- #159500 (Move compiletest CLI parsing to `cli.rs`)
@rust-bors
rust-borsBot merged commit 823b135 into rust-lang:mainJul 18, 2026
13 checks passed
@rustbotrustbot added this to the 1.99.0 milestone Jul 18, 2026
rust-timer added a commit that referenced this pull request Jul 18, 2026
Rollup merge of #159328 - DeepeshWR:fix/issue-141649-relax-aarch64-stack-check, r=mati865
tests/assembly-llvm: pin frame pointer in issue-141649 aarch64 test
The `scoped_two_small_structs` test expects `sub sp, sp, #48` on
aarch64, which assumes the frame pointer (x29) is saved. Custom targets
that don't set `frame-pointer: non-leaf` (e.g., OpenEmbedded/Yocto's
`aarch64-poky-linux-gnu`) omit x29, producing `sub sp, sp, #32` instead.
Add `-Cforce-frame-pointers=yes` to the aarch64 revision so the test
produces consistent codegen regardless of the target's default frame
pointer policy.
github-actionsBot pushed a commit to rust-lang/rustc-dev-guide that referenced this pull request Jul 20, 2026
…uwer
Rollup of 8 pull requests
Successful merges:
- rust-lang/rust#159425 (Windows: add context when opening NUL for child stdio fails)
- rust-lang/rust#159467 (Add explicit `Iterator::count` impl for `str::EncodeUtf16`)
- rust-lang/rust#157860 (Move rustdoc run-make tests into new `tests/run-make/rustdoc/`)
- rust-lang/rust#158545 (Move `std::io::read_to_string` to `alloc::io`)
- rust-lang/rust#159328 (tests/assembly-llvm: pin frame pointer in issue-141649 aarch64 test)
- rust-lang/rust#159459 (Detect when trait bound requires closure to return itself)
- rust-lang/rust#159470 (Fix string indexing in diagnostic format strings)
- rust-lang/rust#159500 (Move compiletest CLI parsing to `cli.rs`)
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

S-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.

7 participants

@DeepeshWR@rustbot@jieyouxu@mati865@RalfJung@dianqk@nikic
, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

tests/assembly-llvm: pin frame pointer in issue-141649 aarch64 test - #159328

Merged
rust-bors[bot] merged 1 commit into
rust-lang:mainfrom
DeepeshWR:fix/issue-141649-relax-aarch64-stack-check
Jul 18, 2026
Merged

tests/assembly-llvm: pin frame pointer in issue-141649 aarch64 test#159328
rust-bors[bot] merged 1 commit into
rust-lang:mainfrom
DeepeshWR:fix/issue-141649-relax-aarch64-stack-check

Conversation

@DeepeshWR

@DeepeshWRDeepeshWR commented Jul 15, 2026

Copy link
Copy Markdown
Contributor

The scoped_two_small_structs test expects sub sp, sp, #48 on
aarch64, which assumes the frame pointer (x29) is saved. Custom targets
that don't set frame-pointer: non-leaf (e.g., OpenEmbedded/Yocto's
aarch64-poky-linux-gnu) omit x29, producing sub sp, sp, #32 instead.

Add -Cforce-frame-pointers=yes to the aarch64 revision so the test
produces consistent codegen regardless of the target's default frame
pointer policy.

@rustbotrustbot added 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 Jul 15, 2026
@rustbot

Copy link
Copy Markdown
Collaborator

r? @jieyouxu

rustbot has assigned @jieyouxu.
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: compiler
  • compiler expanded to 75 candidates
  • Random selection from 19 candidates

@rustbot

This comment has been minimized.

@jieyouxu

Copy link
Copy Markdown
Member

@rustbot reroll

@rustbotrustbot assigned mati865 and unassigned jieyouxuJul 15, 2026
@mati865

mati865 commented Jul 15, 2026

Copy link
Copy Markdown
Member

I believe the explanation is a pure hallucination but the test change might be sound (after ammending the other function's comment/assert). Perhaps @nikic or @dianqk could comment on that matter?

@nikicnikic left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The explanation in the PR description is completely nonsense. You're going to have to properly justify where the difference comes from.

View changes since this review

@rustbotrustbot added S-waiting-on-author Status: This is awaiting some action (such as code changes or more information) from the author. and removed S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. labels Jul 15, 2026
@rustbot

Copy link
Copy Markdown
Collaborator

Reminder, once the PR becomes ready for a review, use @rustbot ready.

@mati865

Copy link
Copy Markdown
Member

@rustbot author

@RalfJung

RalfJung commented Jul 15, 2026

Copy link
Copy Markdown
Member

Also please note that AI-generated PR descriptions are frowned upon in this project (and generally I think it is good etiquette to get explicit consent from people before confronting them with AI-generated text, or to hide all such text behind a "further LLVM-generated details you can freely skip"). The point of a PR description is for you to describe your motivation and understanding of this change. During the PR review process we expect to interact with a human who has a genuine interest in understanding how to fix this issue properly, and as part of that we expect the PR description to be written by said human.

@dianqk

Copy link
Copy Markdown
Member

I'm surprised that this is the root cause. LLVM should produce the same result regardless of the optimization level used to build it. Could you explaina bit more?

@DeepeshWR

Copy link
Copy Markdown
ContributorAuthor

Thank you all for the feedback. I apologize for the AI-generated description, that was a mistake on my part. Let me provide the proper explanation based on my investigation.

Root cause:

The failure occurs in OE-core (OpenEmbedded/Yocto) builds where Rust is compiled against an external system LLVM and tests are run against a custom target aarch64-poky-linux-gnu. This custom target JSON spec does not set "frame-pointer": "non-leaf".

The built-in aarch64-unknown-linux-gnu target in Rust has FramePointer::NonLeaf set (per AAPCS64), which forces x29 to be saved on the stack. This adds 16 bytes to the frame:

  • With frame pointer (rust built-in target): saves x29 + x30 + x19 = sub sp, sp, # 48
  • Without frame pointer (OE custom target): saves x30 + x19 only = sub sp, sp, # 32

I confirmed this by changing FramePointer::NonLeaf to FramePointer::MayOmit in compiler/rustc_target/src/spec/targets/aarch64_unknown_linux_gnu.rs this reproduces #32.

I think both the values are correct.

Please let me know what I need to do now. Whether I can update the commit message with the same fix what we have in this PR or shall I update the testcase with -Cforce-frame-pointers=yes for aarch64 revision.

Let me know which approach you'd prefer and I'll update the PR accordingly.

@nikic

Copy link
Copy Markdown
Contributor

I'd prefer the variant using -Cforce-frame-pointers=yes.

The `scoped_two_small_structs` test expects `sub sp, sp, rust-lang#48` on
aarch64, which assumes the frame pointer (x29) is saved. Custom targets
that don't set `frame-pointer: non-leaf` (e.g., OpenEmbedded/Yocto's
`aarch64-poky-linux-gnu`) omit x29, producing `sub sp, sp, rust-lang#32` instead.
Add `-Cforce-frame-pointers=yes` to the aarch64 revision so the test
produces consistent codegen regardless of the target's default frame
pointer policy.
Signed-off-by: Deepesh Varatharajan <Deepesh.Varatharajan@windriver.com>
@DeepeshWR
DeepeshWRforce-pushed the fix/issue-141649-relax-aarch64-stack-check branch from 0cb43cc to 9e0664aCompareJuly 16, 2026 14:52
@rustbot

Copy link
Copy Markdown
Collaborator

⚠️Warning⚠️

  • There are issue links (such as #123) in the commit messages of the following commits.
    Please move them to the PR description, to avoid spamming the issues with references to the commit, and so this bot can automatically canonicalize them to avoid issues with subtree.

@DeepeshWRDeepeshWR changed the title tests/assembly-llvm: relax aarch64 stack size check in issue-141649tests/assembly-llvm: pin frame pointer in issue-141649 aarch64 testJul 16, 2026
@DeepeshWR

Copy link
Copy Markdown
ContributorAuthor

@rustbot ready

@rustbotrustbot added S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. and removed S-waiting-on-author Status: This is awaiting some action (such as code changes or more information) from the author. labels Jul 16, 2026
@DeepeshWR
DeepeshWR requested a review from nikicJuly 17, 2026 02:01

@mati865mati865 left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@rust-bors

rust-borsBot commented Jul 18, 2026

Copy link
Copy Markdown
Contributor

📌 Commit 9e0664a has been approved by mati865

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-review Status: Awaiting review from the assignee but also interested parties. labels Jul 18, 2026
JonathanBrouwer added a commit to JonathanBrouwer/rust that referenced this pull request Jul 18, 2026
…arch64-stack-check, r=mati865
tests/assembly-llvm: pin frame pointer in issue-141649 aarch64 test
The `scoped_two_small_structs` test expects `sub sp, sp, rust-lang#48` on
aarch64, which assumes the frame pointer (x29) is saved. Custom targets
that don't set `frame-pointer: non-leaf` (e.g., OpenEmbedded/Yocto's
`aarch64-poky-linux-gnu`) omit x29, producing `sub sp, sp, rust-lang#32` instead.
Add `-Cforce-frame-pointers=yes` to the aarch64 revision so the test
produces consistent codegen regardless of the target's default frame
pointer policy.
rust-borsBot pushed a commit that referenced this pull request Jul 18, 2026
…uwer
Rollup of 5 pull requests
Successful merges:
- #159189 (Account for type alias projections in E0308 "expected/found" shortening logic)
- #158545 (Move `std::io::read_to_string` to `alloc::io`)
- #159328 (tests/assembly-llvm: pin frame pointer in issue-141649 aarch64 test)
- #159470 (Fix string indexing in diagnostic format strings)
- #159500 (Move compiletest CLI parsing to `cli.rs`)
JonathanBrouwer added a commit to JonathanBrouwer/rust that referenced this pull request Jul 18, 2026
…arch64-stack-check, r=mati865
tests/assembly-llvm: pin frame pointer in issue-141649 aarch64 test
The `scoped_two_small_structs` test expects `sub sp, sp, rust-lang#48` on
aarch64, which assumes the frame pointer (x29) is saved. Custom targets
that don't set `frame-pointer: non-leaf` (e.g., OpenEmbedded/Yocto's
`aarch64-poky-linux-gnu`) omit x29, producing `sub sp, sp, rust-lang#32` instead.
Add `-Cforce-frame-pointers=yes` to the aarch64 revision so the test
produces consistent codegen regardless of the target's default frame
pointer policy.
rust-borsBot pushed a commit that referenced this pull request Jul 18, 2026
…uwer
Rollup of 5 pull requests
Successful merges:
- #159467 (Add explicit `Iterator::count` impl for `str::EncodeUtf16`)
- #158545 (Move `std::io::read_to_string` to `alloc::io`)
- #159328 (tests/assembly-llvm: pin frame pointer in issue-141649 aarch64 test)
- #159470 (Fix string indexing in diagnostic format strings)
- #159500 (Move compiletest CLI parsing to `cli.rs`)
rust-borsBot pushed a commit that referenced this pull request Jul 18, 2026
…uwer
Rollup of 8 pull requests
Successful merges:
- #159425 (Windows: add context when opening NUL for child stdio fails)
- #159467 (Add explicit `Iterator::count` impl for `str::EncodeUtf16`)
- #157860 (Move rustdoc run-make tests into new `tests/run-make/rustdoc/`)
- #158545 (Move `std::io::read_to_string` to `alloc::io`)
- #159328 (tests/assembly-llvm: pin frame pointer in issue-141649 aarch64 test)
- #159459 (Detect when trait bound requires closure to return itself)
- #159470 (Fix string indexing in diagnostic format strings)
- #159500 (Move compiletest CLI parsing to `cli.rs`)
@rust-bors
rust-borsBot merged commit 823b135 into rust-lang:mainJul 18, 2026
13 checks passed
@rustbotrustbot added this to the 1.99.0 milestone Jul 18, 2026
rust-timer added a commit that referenced this pull request Jul 18, 2026
Rollup merge of #159328 - DeepeshWR:fix/issue-141649-relax-aarch64-stack-check, r=mati865
tests/assembly-llvm: pin frame pointer in issue-141649 aarch64 test
The `scoped_two_small_structs` test expects `sub sp, sp, #48` on
aarch64, which assumes the frame pointer (x29) is saved. Custom targets
that don't set `frame-pointer: non-leaf` (e.g., OpenEmbedded/Yocto's
`aarch64-poky-linux-gnu`) omit x29, producing `sub sp, sp, #32` instead.
Add `-Cforce-frame-pointers=yes` to the aarch64 revision so the test
produces consistent codegen regardless of the target's default frame
pointer policy.
github-actionsBot pushed a commit to rust-lang/rustc-dev-guide that referenced this pull request Jul 20, 2026
…uwer
Rollup of 8 pull requests
Successful merges:
- rust-lang/rust#159425 (Windows: add context when opening NUL for child stdio fails)
- rust-lang/rust#159467 (Add explicit `Iterator::count` impl for `str::EncodeUtf16`)
- rust-lang/rust#157860 (Move rustdoc run-make tests into new `tests/run-make/rustdoc/`)
- rust-lang/rust#158545 (Move `std::io::read_to_string` to `alloc::io`)
- rust-lang/rust#159328 (tests/assembly-llvm: pin frame pointer in issue-141649 aarch64 test)
- rust-lang/rust#159459 (Detect when trait bound requires closure to return itself)
- rust-lang/rust#159470 (Fix string indexing in diagnostic format strings)
- rust-lang/rust#159500 (Move compiletest CLI parsing to `cli.rs`)
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

S-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.

7 participants

@DeepeshWR@rustbot@jieyouxu@mati865@RalfJung@dianqk@nikic