-
Notifications
You must be signed in to change notification settings - Fork 14.8k
[RISCV] Track Linker Relaxable through Assembly Relaxation #152602
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
Merged
Changes from all commits
Commits
Show all changes
11 commits
Select commit
Hold shift + click to select a range
20f900d
[RISCV] Track Linker Relaxable through Assembly Relaxation
lenary fcc304e
The JAL in Long Branches cannot be relaxed further
lenary 439939e
Mark TPREL_ADD as needing R_RISCV_RELAX
lenary a7f2d1e
More tests
lenary f99df26
clang-format
lenary f27ddf3
Merge remote-tracking branch 'origin/main' into pr/riscv-relax-asm-bug
lenary f66017f
Update MCSection debug output
lenary 7f28a2f
Merge remote-tracking branch 'origin/main' into pr/riscv-relax-asm-bug
lenary 751cb18
Address review feedback
lenary a489820
clang-format
lenary 2a7d435
Test comment
lenary File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,84 @@ | ||
# RUN: llvm-mc --triple=riscv32 -mattr=+relax,+experimental-xqcilb,+experimental-xqcibi \ | ||
# RUN: %s -filetype=obj -o - -riscv-add-build-attributes \ | ||
# RUN: | llvm-objdump -dr -M no-aliases - \ | ||
# RUN: | FileCheck %s | ||
|
||
## This tests that we correctly emit relocations for linker relaxation when | ||
## relaxing `JAL` to `QC.E.JAL`. | ||
|
||
## PR150071 | ||
|
||
.global foo | ||
|
||
# CHECK-LABEL: <branch_over_relaxable>: | ||
branch_over_relaxable: | ||
jal x1, foo | ||
# CHECK: qc.e.jal 0x0 <branch_over_relaxable> | ||
# CHECK-NEXT: R_RISCV_VENDOR QUALCOMM | ||
# CHECK-NEXT: R_RISCV_CUSTOM195 foo | ||
# CHECK-NEXT: R_RISCV_RELAX *ABS* | ||
bne a0, a1, branch_over_relaxable | ||
# CHECK-NEXT: bne a0, a1, 0x6 <branch_over_relaxable+0x6> | ||
# CHECK-NEXT: R_RISCV_BRANCH branch_over_relaxable | ||
# CHECK-NOT: R_RISCV_RELAX | ||
qc.e.bnei a0, 0x21, branch_over_relaxable | ||
# CHECK-NEXT: qc.e.bnei a0, 0x21, 0xa <branch_over_relaxable+0xa> | ||
# CHECK-NEXT: R_RISCV_VENDOR QUALCOMM | ||
# CHECK-NEXT: R_RISCV_CUSTOM193 branch_over_relaxable | ||
# CHECK-NOT: R_RISCV_RELAX | ||
ret | ||
# CHECK-NEXT: c.jr ra | ||
|
||
# CHECK-LABEL: <short_jump_over_fixed>: | ||
short_jump_over_fixed: | ||
nop | ||
# CHECK: c.nop | ||
j short_jump_over_fixed | ||
# CHECK-NEXT: c.j 0x12 <short_jump_over_fixed> | ||
# CHECK-NOT: R_RISCV_RVC_JUMP | ||
# CHECK-NOT: R_RISCV_RELAX | ||
ret | ||
# CHECK-NEXT: c.jr ra | ||
|
||
# CHECK-LABEL: <short_jump_over_relaxable>: | ||
short_jump_over_relaxable: | ||
call foo | ||
# CHECK: auipc ra, 0x0 | ||
# CHECK-NEXT: R_RISCV_CALL_PLT foo | ||
# CHECK-NEXT: R_RISCV_RELAX *ABS* | ||
# CHECK-NEXT: jalr ra, 0x0(ra) <short_jump_over_relaxable> | ||
j short_jump_over_relaxable | ||
# CHECK-NEXT: c.j 0x20 <short_jump_over_relaxable+0x8> | ||
# CHECK-NEXT: R_RISCV_RVC_JUMP short_jump_over_relaxable | ||
# CHECK-NOT: R_RISCV_RELAX | ||
ret | ||
# CHECK-NEXT: c.jr ra | ||
|
||
# CHECK-LABEL: <mid_jump_over_fixed>: | ||
mid_jump_over_fixed: | ||
nop | ||
# CHECK: c.nop | ||
.space 0x1000 | ||
# CHECK-NEXT: ... | ||
j mid_jump_over_fixed | ||
# CHECK-NEXT: jal zero, 0x24 <mid_jump_over_fixed> | ||
# CHECK-NOT: R_RISCV_JAL | ||
# CHECK-NOT: R_RISCV_RELAX | ||
ret | ||
# CHECK-NEXT: c.jr ra | ||
|
||
# CHECK-LABEL: <mid_jump_over_relaxable>: | ||
mid_jump_over_relaxable: | ||
call foo | ||
# CHECK: auipc ra, 0x0 | ||
# CHECK-NEXT: R_RISCV_CALL_PLT foo | ||
# CHECK-NEXT: R_RISCV_RELAX *ABS* | ||
# CHECK-NEXT: jalr ra, 0x0(ra) <mid_jump_over_relaxable> | ||
.space 0x1000 | ||
# CHECK-NEXT: ... | ||
j mid_jump_over_relaxable | ||
# CHECK-NEXT: jal zero, 0x2034 <mid_jump_over_relaxable+0x1008> | ||
# CHECK-NEXT: R_RISCV_JAL mid_jump_over_relaxable | ||
# CHECK-NOT: R_RISCV_RELAX | ||
ret | ||
# CHECK-NEXT: c.jr ra |
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.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Why does any fixup need special treatment? check-llvm-mc still passes if fixupGetsRelaxRelocation returns false.
Uh oh!
There was an error while loading. Please reload this page.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
if we don't have this, we'll end up with R_RISCV_RELAX on compressed instructions which are in-range but require a relocation (i.e. reference something close but the other side of something relaxable).I'll make a testcase for this tomorrow.There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I added more to the linker-relaxation-pr150071.s test which will fail if this either always returns
true
orfalse
.The problem is about the over-approximation of
RelaxCandidate = true
in the MCCodeEmitter. Now, many more relocations are marked as linkerrelaxable, which is good, but those might be pc-relative resolvable, like a jump over non-relaxable data. In these cases we want to allow the fixup itself to resolve if possible (these will only be left if they are in range, when xqcilb is enabled).And then we want to make sure, if a fixup is not resolved, that only fixups expecting R_RISCV_RELAX get that relocation, even if the fixup is marked linker relaxable.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Encoding the complement set is clearer.
We are essentially listing short-range fixups that suppress RELAX relocations. Perhaps a function name like
fixupSuppressRelax
is clearer.There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Done. Renamed to
relaxableFixupNeedsRelocation
which was clearer to me thanfixupSuppressRelax
.