diff options
author | Prakhar Bahuguna <prakhar.bahuguna@arm.com> | 2016-08-15 07:57:44 +0000 |
---|---|---|
committer | Prakhar Bahuguna <prakhar.bahuguna@arm.com> | 2016-08-15 07:57:44 +0000 |
commit | a305a435a6568114022cd684675b4b2ca24cd2da (patch) | |
tree | a4ff195242f54a1fa22f035ace23e67787ae96c0 /llvm/lib/Target/ARM/AsmParser/ARMAsmParser.cpp | |
parent | 196ad0823e67bffef39983fbd9d7c13fb25911b6 (diff) | |
download | llvm-a305a435a6568114022cd684675b4b2ca24cd2da.zip llvm-a305a435a6568114022cd684675b4b2ca24cd2da.tar.gz llvm-a305a435a6568114022cd684675b4b2ca24cd2da.tar.bz2 |
[Thumb] Validate branch target for CBZ/CBNZ instructions.
Summary:
The assembler currently does not check the branch target for CBZ/CBNZ
instructions, which only permit branching forwards with a positive offset. This
adds validation for the branch target to ensure negative PC-relative offsets are
not encoded into the instruction, whether specified as a literal or as an
assembler symbol.
Reviewers: rengolin, t.p.northover
Subscribers: llvm-commits, rengolin
Differential Revision: https://reviews.llvm.org/D23312
llvm-svn: 278659
Diffstat (limited to 'llvm/lib/Target/ARM/AsmParser/ARMAsmParser.cpp')
-rw-r--r-- | llvm/lib/Target/ARM/AsmParser/ARMAsmParser.cpp | 6 |
1 files changed, 6 insertions, 0 deletions
diff --git a/llvm/lib/Target/ARM/AsmParser/ARMAsmParser.cpp b/llvm/lib/Target/ARM/AsmParser/ARMAsmParser.cpp index b9b665f..c011c79 100644 --- a/llvm/lib/Target/ARM/AsmParser/ARMAsmParser.cpp +++ b/llvm/lib/Target/ARM/AsmParser/ARMAsmParser.cpp @@ -6684,6 +6684,12 @@ bool ARMAsmParser::validateInstruction(MCInst &Inst, return Error(Operands[Op]->getStartLoc(), "branch target out of range"); break; } + case ARM::tCBZ: + case ARM::tCBNZ: { + if (!static_cast<ARMOperand &>(*Operands[2]).isUnsignedOffset<6, 1>()) + return Error(Operands[2]->getStartLoc(), "branch target out of range"); + break; + } case ARM::MOVi16: case ARM::t2MOVi16: case ARM::t2MOVTi16: |