This repository was archived by the owner on Nov 28, 2023. It is now read-only.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
The problem
See #75. and rust-lang/rust#86693.
I did the small experiment to illustrate the problem:
Generated code(target = riscv32imac-unknown-none-elf):
We can see that rustc/llvm is supposing that sp is 16-byte aligned to allocate _p(indeed, to do any stack allocations). But if sp is not 16-byte aligned(8 or smaller), _p will be allocated at incorrect location.
Fix
According to https://github.com/riscv-non-isa/riscv-eabi-spec/blob/master/EABI.adoc#4-eabi-stack-alignment, EABI requires that RV32 stack is 8-byte aligned and 16-byte for RV64. But to achieve max compatibility and to be correct, we could simply force 16-byte. It's small drawback is memory waste of a maximum of 8 bytes.
Fix this by forcing stack pointer to be 16-byte aligned.
Fixes #75.