summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlex Bradbury <asb@lowrisc.org>2019-07-16 04:40:25 +0000
committerAlex Bradbury <asb@lowrisc.org>2019-07-16 04:40:25 +0000
commitbb479ca311958120279cf2c21da3a9d8d06ceb17 (patch)
tree390c9ac810d655d3f6ec773744bef258ddecde08
parente9ad0cf6cf79cfa5f8ce99db0f7161e110850011 (diff)
downloadbcm5719-llvm-bb479ca311958120279cf2c21da3a9d8d06ceb17.tar.gz
bcm5719-llvm-bb479ca311958120279cf2c21da3a9d8d06ceb17.zip
[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
-rw-r--r--llvm/lib/Target/RISCV/MCTargetDesc/RISCVAsmBackend.cpp8
-rw-r--r--llvm/test/MC/RISCV/align.s7
2 files changed, 13 insertions, 2 deletions
diff --git a/llvm/lib/Target/RISCV/MCTargetDesc/RISCVAsmBackend.cpp b/llvm/lib/Target/RISCV/MCTargetDesc/RISCVAsmBackend.cpp
index 821ac2033c9..ee5f760ebcb 100644
--- a/llvm/lib/Target/RISCV/MCTargetDesc/RISCVAsmBackend.cpp
+++ b/llvm/lib/Target/RISCV/MCTargetDesc/RISCVAsmBackend.cpp
@@ -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
diff --git a/llvm/test/MC/RISCV/align.s b/llvm/test/MC/RISCV/align.s
index e62af931555..b4b3e6aa778 100644
--- a/llvm/test/MC/RISCV/align.s
+++ b/llvm/test/MC/RISCV/align.s
@@ -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
OpenPOWER on IntegriCloud