mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-10-19 19:12:56 +02:00
[RISCV] Avoid overflow when determining number of nops for code align
RISCVAsmBackend::shouldInsertExtraNopBytesForCodeAlign() assumed that the align specified would be greater than or equal to the minimum nop length, but that is not always the case - for example if a user specifies ".align 0" in assembly. Differential Revision: https://reviews.llvm.org/D63274 Patch by Edward Jones. llvm-svn: 366176
This commit is contained in:
parent
066798ae68
commit
d36e380c67
@ -313,8 +313,12 @@ bool RISCVAsmBackend::shouldInsertExtraNopBytesForCodeAlign(
|
||||
bool HasStdExtC = STI.getFeatureBits()[RISCV::FeatureStdExtC];
|
||||
unsigned MinNopLen = HasStdExtC ? 2 : 4;
|
||||
|
||||
if (AF.getAlignment() <= MinNopLen) {
|
||||
return false;
|
||||
} else {
|
||||
Size = AF.getAlignment() - MinNopLen;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
// We need to insert R_RISCV_ALIGN relocation type to indicate the
|
||||
|
@ -90,6 +90,13 @@ test:
|
||||
ret
|
||||
# NORELAX-RELOC-NOT: R_RISCV
|
||||
# C-EXT-NORELAX-RELOC-NOT: R_RISCV
|
||||
# Code alignment of a byte size less than the size of a nop must be treated
|
||||
# as no alignment. This used to trigger a fatal error with relaxation enabled
|
||||
# as the calculation to emit the worst-case sequence of nops would overflow.
|
||||
.p2align 1
|
||||
add a0, a0, a1
|
||||
.p2align 0
|
||||
add a0, a0, a1
|
||||
# We only need to insert R_RISCV_ALIGN for code section
|
||||
# when the linker relaxation enabled.
|
||||
.data
|
||||
|
Loading…
Reference in New Issue
Block a user