Skip to content

Commit 1e28f73

Browse files
committed
[Xtensa] Improve fixup error messages in asm backend.
Add different diagnotstics messages for different branch relocations fixups.
1 parent 2989ff7 commit 1e28f73

File tree

3 files changed

+77
-9
lines changed

3 files changed

+77
-9
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
From c8f321e8f88802dd427bc9772da171d5c889a77d Mon Sep 17 00:00:00 2001
2+
From: Andrei Safronov <[email protected]>
3+
Date: Thu, 9 Mar 2023 10:30:04 +0300
4+
Subject: [PATCH] [Xtensa] Improve fixup error messages in asm backend.
5+
6+
---
7+
.../Xtensa/MCTargetDesc/XtensaAsmBackend.cpp | 14 +++++++-------
8+
1 file changed, 7 insertions(+), 7 deletions(-)
9+
10+
diff --git a/llvm/lib/Target/Xtensa/MCTargetDesc/XtensaAsmBackend.cpp b/llvm/lib/Target/Xtensa/MCTargetDesc/XtensaAsmBackend.cpp
11+
index 4039804b1b58..6981c82e768f 100644
12+
--- a/llvm/lib/Target/Xtensa/MCTargetDesc/XtensaAsmBackend.cpp
13+
+++ b/llvm/lib/Target/Xtensa/MCTargetDesc/XtensaAsmBackend.cpp
14+
@@ -93,7 +93,7 @@ static uint64_t adjustFixupValue(const MCFixup &Fixup, uint64_t Value,
15+
case Xtensa::fixup_xtensa_branch_6: {
16+
Value -= 4;
17+
if (!isInt<6>(Value))
18+
- Ctx.reportError(Fixup.getLoc(), "fixup value out of range");
19+
+ Ctx.reportError(Fixup.getLoc(), "branch 6-bit fixup value out is of range");
20+
unsigned Hi2 = (Value >> 4) & 0x3;
21+
unsigned Lo4 = Value & 0xf;
22+
return (Hi2 << 4) | (Lo4 << 12);
23+
@@ -101,36 +101,36 @@ static uint64_t adjustFixupValue(const MCFixup &Fixup, uint64_t Value,
24+
case Xtensa::fixup_xtensa_branch_8:
25+
Value -= 4;
26+
if (!isInt<8>(Value))
27+
- Ctx.reportError(Fixup.getLoc(), "fixup value out of range");
28+
+ Ctx.reportError(Fixup.getLoc(), "branch 8-bit fixup value out of range");
29+
return (Value & 0xff);
30+
case Xtensa::fixup_xtensa_branch_12:
31+
Value -= 4;
32+
if (!isInt<12>(Value))
33+
- Ctx.reportError(Fixup.getLoc(), "fixup value out of range");
34+
+ Ctx.reportError(Fixup.getLoc(), "branch 12-bit fixup value out of range");
35+
return (Value & 0xfff);
36+
case Xtensa::fixup_xtensa_jump_18:
37+
Value -= 4;
38+
if (!isInt<18>(Value))
39+
- Ctx.reportError(Fixup.getLoc(), "fixup value out of range");
40+
+ Ctx.reportError(Fixup.getLoc(), "jump fixup value out of range");
41+
return (Value & 0x3ffff);
42+
case Xtensa::fixup_xtensa_call_18:
43+
Value -= 4;
44+
if (!isInt<20>(Value))
45+
- Ctx.reportError(Fixup.getLoc(), "fixup value out of range");
46+
+ Ctx.reportError(Fixup.getLoc(), "call fixup value out of range");
47+
if (Value & 0x3)
48+
Ctx.reportError(Fixup.getLoc(), "fixup value must be 4-byte aligned");
49+
return (Value & 0xffffc) >> 2;
50+
case Xtensa::fixup_xtensa_loop_8:
51+
Value -= 4;
52+
if (!isUInt<8>(Value))
53+
- Ctx.reportError(Fixup.getLoc(), "fixup value out of range");
54+
+ Ctx.reportError(Fixup.getLoc(), "loop fixup value out of range");
55+
return (Value & 0xff);
56+
case Xtensa::fixup_xtensa_l32r_16:
57+
unsigned Offset = Fixup.getOffset();
58+
if (Offset & 0x3)
59+
Value -= 4;
60+
if (!isInt<18>(Value) && (Value & 0x20000))
61+
- Ctx.reportError(Fixup.getLoc(), "fixup value out of range");
62+
+ Ctx.reportError(Fixup.getLoc(), "l32r fixup value out of range");
63+
if (Value & 0x3)
64+
Ctx.reportError(Fixup.getLoc(), "fixup value must be 4-byte aligned");
65+
return (Value & 0x3fffc) >> 2;
66+
--
67+
2.25.1
68+

llvm/lib/Target/Xtensa/MCTargetDesc/XtensaAsmBackend.cpp

+7-7
Original file line numberDiff line numberDiff line change
@@ -93,44 +93,44 @@ static uint64_t adjustFixupValue(const MCFixup &Fixup, uint64_t Value,
9393
case Xtensa::fixup_xtensa_branch_6: {
9494
Value -= 4;
9595
if (!isInt<6>(Value))
96-
Ctx.reportError(Fixup.getLoc(), "fixup value out of range");
96+
Ctx.reportError(Fixup.getLoc(), "branch 6-bit fixup value out is of range");
9797
unsigned Hi2 = (Value >> 4) & 0x3;
9898
unsigned Lo4 = Value & 0xf;
9999
return (Hi2 << 4) | (Lo4 << 12);
100100
}
101101
case Xtensa::fixup_xtensa_branch_8:
102102
Value -= 4;
103103
if (!isInt<8>(Value))
104-
Ctx.reportError(Fixup.getLoc(), "fixup value out of range");
104+
Ctx.reportError(Fixup.getLoc(), "branch 8-bit fixup value out of range");
105105
return (Value & 0xff);
106106
case Xtensa::fixup_xtensa_branch_12:
107107
Value -= 4;
108108
if (!isInt<12>(Value))
109-
Ctx.reportError(Fixup.getLoc(), "fixup value out of range");
109+
Ctx.reportError(Fixup.getLoc(), "branch 12-bit fixup value out of range");
110110
return (Value & 0xfff);
111111
case Xtensa::fixup_xtensa_jump_18:
112112
Value -= 4;
113113
if (!isInt<18>(Value))
114-
Ctx.reportError(Fixup.getLoc(), "fixup value out of range");
114+
Ctx.reportError(Fixup.getLoc(), "jump fixup value out of range");
115115
return (Value & 0x3ffff);
116116
case Xtensa::fixup_xtensa_call_18:
117117
Value -= 4;
118118
if (!isInt<20>(Value))
119-
Ctx.reportError(Fixup.getLoc(), "fixup value out of range");
119+
Ctx.reportError(Fixup.getLoc(), "call fixup value out of range");
120120
if (Value & 0x3)
121121
Ctx.reportError(Fixup.getLoc(), "fixup value must be 4-byte aligned");
122122
return (Value & 0xffffc) >> 2;
123123
case Xtensa::fixup_xtensa_loop_8:
124124
Value -= 4;
125125
if (!isUInt<8>(Value))
126-
Ctx.reportError(Fixup.getLoc(), "fixup value out of range");
126+
Ctx.reportError(Fixup.getLoc(), "loop fixup value out of range");
127127
return (Value & 0xff);
128128
case Xtensa::fixup_xtensa_l32r_16:
129129
unsigned Offset = Fixup.getOffset();
130130
if (Offset & 0x3)
131131
Value -= 4;
132132
if (!isInt<18>(Value) && (Value & 0x20000))
133-
Ctx.reportError(Fixup.getLoc(), "fixup value out of range");
133+
Ctx.reportError(Fixup.getLoc(), "l32r fixup value out of range");
134134
if (Value & 0x3)
135135
Ctx.reportError(Fixup.getLoc(), "fixup value must be 4-byte aligned");
136136
return (Value & 0x3fffc) >> 2;

llvm/test/MC/Xtensa/fixups-diagnostics.s

+2-2
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,9 @@
22

33
.align 4
44

5-
beq a0, a1, LBL1 # CHECK: :[[@LINE]]:3: error: fixup value out of range
5+
beq a0, a1, LBL1 # CHECK: :[[@LINE]]:3: error: branch 8-bit fixup value out of range
66
LBL0:
7-
beqz a0, LBL2 # CHECK: :[[@LINE]]:3: error: fixup value out of range
7+
beqz a0, LBL2 # CHECK: :[[@LINE]]:3: error: branch 12-bit fixup value out of range
88

99
call0 LBL0 # CHECK: :[[@LINE]]:3: error: fixup value must be 4-byte aligned
1010

0 commit comments

Comments
 (0)