-
Notifications
You must be signed in to change notification settings - Fork 15.4k
[NFC][MC][Sparc] Rearrange decode functions in Sparc disassembler #154973
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[NFC][MC][Sparc] Rearrange decode functions in Sparc disassembler #154973
Conversation
Some of the decode function were previously declared before including `SparcGenDisassemblerTables.inc` and then defined later on because the generated code in `SparcGenDisassemblerTables.inc` references these functions and these functions reference `fieldFromInstruction` which used to be generated. Now that `fieldFromInstruction` has moved to MCDecoder.h, we can move these definitions to before including the generated code without any circular references.
|
@llvm/pr-subscribers-backend-sparc Author: Rahul Joshi (jurahul) ChangesSome of the decode function were previously declared before including Now that Full diff: https://github.com/llvm/llvm-project/pull/154973.diff 1 Files Affected:
diff --git a/llvm/lib/Target/Sparc/Disassembler/SparcDisassembler.cpp b/llvm/lib/Target/Sparc/Disassembler/SparcDisassembler.cpp
index f1cd9b1ab07ca..ceb0ad0ddfb0d 100644
--- a/llvm/lib/Target/Sparc/Disassembler/SparcDisassembler.cpp
+++ b/llvm/lib/Target/Sparc/Disassembler/SparcDisassembler.cpp
@@ -266,16 +266,48 @@ DecodeCoprocPairRegisterClass(MCInst &Inst, unsigned RegNo, uint64_t Address,
return MCDisassembler::Success;
}
-static DecodeStatus DecodeCall(MCInst &Inst, unsigned insn, uint64_t Address,
- const MCDisassembler *Decoder);
-static DecodeStatus DecodeSIMM5(MCInst &Inst, unsigned insn, uint64_t Address,
- const MCDisassembler *Decoder);
-static DecodeStatus DecodeSIMM13(MCInst &Inst, unsigned insn, uint64_t Address,
- const MCDisassembler *Decoder);
+static bool tryAddingSymbolicOperand(int64_t Value, bool isBranch,
+ uint64_t Address, uint64_t Offset,
+ uint64_t Width, MCInst &MI,
+ const MCDisassembler *Decoder) {
+ return Decoder->tryAddingSymbolicOperand(MI, Value, Address, isBranch, Offset,
+ Width, /*InstSize=*/4);
+}
+
+static DecodeStatus DecodeCall(MCInst &MI, unsigned insn, uint64_t Address,
+ const MCDisassembler *Decoder) {
+ int64_t CallOffset = SignExtend64(fieldFromInstruction(insn, 0, 30), 30) * 4;
+ if (!tryAddingSymbolicOperand(Address + CallOffset, false, Address, 0, 30, MI,
+ Decoder))
+ MI.addOperand(MCOperand::createImm(CallOffset));
+ return MCDisassembler::Success;
+}
+
+static DecodeStatus DecodeSIMM5(MCInst &MI, unsigned insn, uint64_t Address,
+ const MCDisassembler *Decoder) {
+ assert(isUInt<5>(insn));
+ MI.addOperand(MCOperand::createImm(SignExtend64<5>(insn)));
+ return MCDisassembler::Success;
+}
+
+static DecodeStatus DecodeSIMM13(MCInst &MI, unsigned insn, uint64_t Address,
+ const MCDisassembler *Decoder) {
+ assert(isUInt<13>(insn));
+ MI.addOperand(MCOperand::createImm(SignExtend64<13>(insn)));
+ return MCDisassembler::Success;
+}
+
template <unsigned N>
constexpr static DecodeStatus DecodeDisp(MCInst &MI, uint32_t ImmVal,
uint64_t Address,
- const MCDisassembler *Decoder);
+ const MCDisassembler *Decoder) {
+ int64_t BranchOffset = SignExtend64(ImmVal, N) * 4;
+ if (!tryAddingSymbolicOperand(Address + BranchOffset, true, Address, 0, N, MI,
+ Decoder))
+ MI.addOperand(MCOperand::createImm(BranchOffset));
+ return MCDisassembler::Success;
+}
+
#include "SparcGenDisassemblerTables.inc"
/// Read four bytes from the ArrayRef and return 32 bit word.
@@ -321,45 +353,3 @@ DecodeStatus SparcDisassembler::getInstruction(MCInst &Instr, uint64_t &Size,
return Result;
}
-
-static bool tryAddingSymbolicOperand(int64_t Value, bool isBranch,
- uint64_t Address, uint64_t Offset,
- uint64_t Width, MCInst &MI,
- const MCDisassembler *Decoder) {
- return Decoder->tryAddingSymbolicOperand(MI, Value, Address, isBranch, Offset,
- Width, /*InstSize=*/4);
-}
-
-static DecodeStatus DecodeCall(MCInst &MI, unsigned insn, uint64_t Address,
- const MCDisassembler *Decoder) {
- int64_t CallOffset = SignExtend64(fieldFromInstruction(insn, 0, 30), 30) * 4;
- if (!tryAddingSymbolicOperand(Address + CallOffset, false, Address, 0, 30, MI,
- Decoder))
- MI.addOperand(MCOperand::createImm(CallOffset));
- return MCDisassembler::Success;
-}
-
-static DecodeStatus DecodeSIMM5(MCInst &MI, unsigned insn, uint64_t Address,
- const MCDisassembler *Decoder) {
- assert(isUInt<5>(insn));
- MI.addOperand(MCOperand::createImm(SignExtend64<5>(insn)));
- return MCDisassembler::Success;
-}
-
-static DecodeStatus DecodeSIMM13(MCInst &MI, unsigned insn, uint64_t Address,
- const MCDisassembler *Decoder) {
- assert(isUInt<13>(insn));
- MI.addOperand(MCOperand::createImm(SignExtend64<13>(insn)));
- return MCDisassembler::Success;
-}
-
-template <unsigned N>
-constexpr static DecodeStatus DecodeDisp(MCInst &MI, uint32_t ImmVal,
- uint64_t Address,
- const MCDisassembler *Decoder) {
- int64_t BranchOffset = SignExtend64(ImmVal, N) * 4;
- if (!tryAddingSymbolicOperand(Address + BranchOffset, true, Address, 0, N, MI,
- Decoder))
- MI.addOperand(MCOperand::createImm(BranchOffset));
- return MCDisassembler::Success;
-}
|
s-barannikov
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM
Some of the decode function were previously declared before including
SparcGenDisassemblerTables.incand then defined later on because the generated code inSparcGenDisassemblerTables.increferences these functions and these functions referencefieldFromInstructionwhich used to be generated.Now that
fieldFromInstructionhas moved to MCDecoder.h, we can move these definitions to before including the generated code without any circular references.