Skip to content

Commit 4b44cee

Browse files
Romaric JODINjchauzi
Romaric JODIN
authored and
jchauzi
committed
dpu: llvm: use symbolizer when we know that the offset in a pc address
1 parent e91cd3b commit 4b44cee

File tree

1 file changed

+26
-6
lines changed

1 file changed

+26
-6
lines changed

llvm/lib/Target/DPU/Disassembler/DPUOperandDecoder.cpp

+26-6
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,10 @@
2727

2828
using namespace llvm;
2929

30-
#define GET_REGINFO_ENUM
30+
#define GET_INSTRINFO_ENUM
31+
#include "DPUGenInstrInfo.inc"
3132

33+
#define GET_REGINFO_ENUM
3234
#include "DPUGenRegisterInfo.inc"
3335

3436
// Decoded registers, with respect to their indexing in the DPU. See
@@ -176,12 +178,30 @@ MCDisassembler::DecodeStatus DPUOperandDecoder::Decode_false_cc(MCInst &MI) {
176178
return MCDisassembler::Success;
177179
}
178180

181+
#define FIXUP_PC(pc) (0x80000000 | (unsigned)((pc) * 8))
182+
179183
MCDisassembler::DecodeStatus DPUOperandDecoder::Decode_pc(llvm::MCInst &MI,
180184
uint64_t Value) {
181185
LLVM_DEBUG(dbgs() << "PC << " << Value << "\n");
182-
// Re-adjust PC to linker fixup
183-
unsigned fixedUp = 0x80000000 | (unsigned)(Value * 8);
184-
DecodePC(MI, fixedUp, Address, Decoder);
186+
DecodePC(MI, FIXUP_PC(Value), Address, Decoder);
187+
return MCDisassembler::Success;
188+
}
189+
190+
static MCDisassembler::DecodeStatus DecodeOff(MCInst &MI, int32_t Value,
191+
const MCDisassembler *Decoder) {
192+
switch (MI.getOpcode()) {
193+
case DPU::CALLrri:
194+
case DPU::JUMPri:
195+
case DPU::CALLzri: {
196+
const MCOperand &lastOperand = MI.getOperand(MI.getNumOperands() - 1);
197+
if (lastOperand.isReg() && lastOperand.getReg() == DPU::ZERO &&
198+
tryAddingSymbolicOperand(FIXUP_PC(Value), true, 0, 2, 23, MI, Decoder))
199+
return MCDisassembler::Success;
200+
}
201+
default:
202+
break;
203+
}
204+
MI.addOperand(MCOperand::createImm(Value));
185205
return MCDisassembler::Success;
186206
}
187207

@@ -190,14 +210,14 @@ MCDisassembler::DecodeStatus DPUOperandDecoder::Decode_off(llvm::MCInst &MI,
190210
int32_t ValueSize) {
191211
LLVM_DEBUG(dbgs() << "off << " << Value << "\n");
192212
Value = Value | ((-(Value >> (ValueSize - 1))) << ValueSize);
193-
MI.addOperand(MCOperand::createImm(Value));
213+
DecodeOff(MI, Value, Decoder);
194214
return MCDisassembler::Success;
195215
}
196216

197217
MCDisassembler::DecodeStatus DPUOperandDecoder::Decode_off(llvm::MCInst &MI,
198218
int32_t Value) {
199219
LLVM_DEBUG(dbgs() << "off << " << Value << "\n");
200-
MI.addOperand(MCOperand::createImm(Value));
220+
DecodeOff(MI, Value, Decoder);
201221
return MCDisassembler::Success;
202222
}
203223

0 commit comments

Comments
 (0)