diff options
author | Alex Bradbury <asb@lowrisc.org> | 2019-07-16 04:40:25 +0000 |
---|---|---|
committer | Alex Bradbury <asb@lowrisc.org> | 2019-07-16 04:40:25 +0000 |
commit | bb479ca311958120279cf2c21da3a9d8d06ceb17 (patch) | |
tree | 390c9ac810d655d3f6ec773744bef258ddecde08 | |
parent | e9ad0cf6cf79cfa5f8ce99db0f7161e110850011 (diff) | |
download | bcm5719-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.cpp | 8 | ||||
-rw-r--r-- | llvm/test/MC/RISCV/align.s | 7 |
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 |