1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-10-19 11:02:59 +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:
Alex Bradbury 2019-07-16 04:40:25 +00:00
parent 066798ae68
commit d36e380c67
2 changed files with 13 additions and 2 deletions

View File

@ -313,8 +313,12 @@ bool RISCVAsmBackend::shouldInsertExtraNopBytesForCodeAlign(
bool HasStdExtC = STI.getFeatureBits()[RISCV::FeatureStdExtC];
unsigned MinNopLen = HasStdExtC ? 2 : 4;
Size = AF.getAlignment() - MinNopLen;
return true;
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

View File

@ -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