Skip to content

Commit 6e57f68

Browse files
committed
[AVR] Reject invalid LDD instruction with explicit error
We should reject "ldd Rn, X" with explicit error message rather than "llvm_unreachable" in llvm's release build. Fixes llvm#62012 Reviewed By: Miss_Grape Differential Revision: https://reviews.llvm.org/D147877
1 parent a3d5ec5 commit 6e57f68

File tree

2 files changed

+11
-3
lines changed

2 files changed

+11
-3
lines changed

llvm/lib/Target/AVR/MCTargetDesc/AVRMCCodeEmitter.cpp

+3-2
Original file line numberDiff line numberDiff line change
@@ -146,7 +146,8 @@ unsigned AVRMCCodeEmitter::encodeMemri(const MCInst &MI, unsigned OpNo,
146146

147147
switch (RegOp.getReg()) {
148148
default:
149-
llvm_unreachable("Expected either Y or Z register");
149+
Ctx.reportError(MI.getLoc(), "Expected either Y or Z register");
150+
return 0;
150151
case AVR::R31R30:
151152
RegBit = 0;
152153
break; // Z register
@@ -164,7 +165,7 @@ unsigned AVRMCCodeEmitter::encodeMemri(const MCInst &MI, unsigned OpNo,
164165
Fixups.push_back(MCFixup::create(0, OffsetOp.getExpr(),
165166
MCFixupKind(AVR::fixup_6), MI.getLoc()));
166167
} else {
167-
llvm_unreachable("invalid value for offset");
168+
llvm_unreachable("Invalid value for offset");
168169
}
169170

170171
return (RegBit << 6) | OffsetBits;

llvm/test/CodeGen/AVR/inline-asm/inline-asm-invalid.ll

+8-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
; RUN: not llc < %s -march=avr -no-integrated-as 2>&1 | FileCheck %s
1+
; RUN: not llc < %s -march=avr -mcpu=avr6 -filetype=obj -no-integrated-as 2>&1 \
2+
; RUN: | FileCheck %s
23

34
define void @foo(i16 %a) {
45
; CHECK: error: invalid operand in inline asm: 'jl ${0:l}'
@@ -13,3 +14,9 @@ define void @foo1() {
1314
call i16 asm sideeffect ";; ${0:C}", "=d"()
1415
ret void
1516
}
17+
18+
define void @foo2() {
19+
; CHECK: error: expected either Y or Z register
20+
call void asm sideeffect "ldd r24, X+2", ""()
21+
ret void
22+
}

0 commit comments

Comments
 (0)