Skip to content

Commit

Permalink
[MC][RISCV] Check hasEmitNops before call shouldInsertExtraNopBytesFo…
Browse files Browse the repository at this point in the history
…rCodeAlign (llvm#77236)

The shouldInsertExtraNopBytesForCodeAlign() need STI to check whether
relax is enabled or not. It is initialized when call setEmitNops. The
setEmitNops may not be called in a section which has instructions but is
not executable. In this case uninitialized STI will cause problems.
Thus, check hasEmitNops before call it.

Fixes:
llvm#76552 (comment)
  • Loading branch information
MQ-mengqing authored Jan 9, 2024
1 parent b57159c commit 7b45c54
Show file tree
Hide file tree
Showing 2 changed files with 26 additions and 1 deletion.
2 changes: 1 addition & 1 deletion llvm/lib/MC/MCExpr.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -708,7 +708,7 @@ static void AttemptToFoldSymbolOffsetDifference(
if (DF) {
Displacement += DF->getContents().size();
} else if (auto *AF = dyn_cast<MCAlignFragment>(FI);
AF && Layout &&
AF && Layout && AF->hasEmitNops() &&
!Asm->getBackend().shouldInsertExtraNopBytesForCodeAlign(
*AF, Count)) {
Displacement += Asm->computeFragmentSize(*Layout, *AF);
Expand Down
25 changes: 25 additions & 0 deletions llvm/test/MC/RISCV/align-non-executable.s
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
## A label difference separated by an alignment directive, when the
## referenced symbols are in a non-executable section with instructions,
## should generate ADD/SUB relocations.
## https://github.com/llvm/llvm-project/pull/76552

# RUN: llvm-mc --filetype=obj --triple=riscv64 --mattr=+relax %s \
# RUN: | llvm-readobj -r - | FileCheck --check-prefixes=CHECK,RELAX %s
# RUN: llvm-mc --filetype=obj --triple=riscv64 --mattr=-relax %s \
# RUN: | llvm-readobj -r - | FileCheck %s

.section ".dummy", "a"
.L1:
call func
.p2align 3
.L2:
.dword .L2 - .L1

# CHECK: Relocations [
# CHECK-NEXT: Section ({{.*}}) .rela.dummy {
# CHECK-NEXT: 0x0 R_RISCV_CALL_PLT func 0x0
# RELAX-NEXT: 0x0 R_RISCV_RELAX - 0x0
# CHECK-NEXT: 0x8 R_RISCV_ADD64 .L2 0x0
# CHECK-NEXT: 0x8 R_RISCV_SUB64 .L1 0x0
# CHECK-NEXT: }
# CHECK-NEXT: ]

0 comments on commit 7b45c54

Please sign in to comment.