[PATCH] D63847: [MC] Add MCInstrAnalysis::evaluateMemoryOperandAddress
Seiya Nuta via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Wed Jun 26 15:32:17 PDT 2019
seiya created this revision.
Herald added subscribers: llvm-commits, hiraditya.
Herald added a project: LLVM.
Add a new method which tries to compute the target address referenced by an operand.
This patch supports x86_64 RIP-relative addressing for now.
It is necessary to print referenced symbol names in llvm-objdump.
https://reviews.llvm.org/D63847
Files:
llvm/include/llvm/MC/MCInstrAnalysis.h
llvm/lib/MC/MCInstrAnalysis.cpp
llvm/lib/Target/X86/MCTargetDesc/X86MCTargetDesc.cpp
Index: llvm/lib/Target/X86/MCTargetDesc/X86MCTargetDesc.cpp
===================================================================
--- llvm/lib/Target/X86/MCTargetDesc/X86MCTargetDesc.cpp
+++ llvm/lib/Target/X86/MCTargetDesc/X86MCTargetDesc.cpp
@@ -399,6 +399,8 @@
findPltEntries(uint64_t PltSectionVA, ArrayRef<uint8_t> PltContents,
uint64_t GotSectionVA,
const Triple &TargetTriple) const override;
+ bool evaluateMemoryOperandAddress(const MCInst &Inst, uint64_t Addr,
+ uint64_t Size, uint64_t &Target) const override;
};
#define GET_STIPREDICATE_DEFS_FOR_MC_ANALYSIS
@@ -514,6 +516,30 @@
}
}
+bool X86MCInstrAnalysis::evaluateMemoryOperandAddress(const MCInst &Inst, uint64_t Addr,
+ uint64_t Size, uint64_t &Target) const {
+ MCInstrDesc Opcode = Info->get(Inst.getOpcode());
+ int MemOpStart = X86II::getMemoryOperandNo(Opcode.TSFlags);
+ if (MemOpStart == -1)
+ return false;
+ MemOpStart += X86II::getOperandBias(Opcode);
+
+ const MCOperand &BaseReg = Inst.getOperand(MemOpStart + X86::AddrBaseReg);
+ const MCOperand &IndexReg = Inst.getOperand(MemOpStart + X86::AddrIndexReg);
+ const MCOperand &ScaleAmt = Inst.getOperand(MemOpStart + X86::AddrScaleAmt);
+ const MCOperand &Disp = Inst.getOperand(MemOpStart + X86::AddrDisp);
+ if (IndexReg.getReg() != 0 || ScaleAmt.getImm() != 1 || !Disp.isImm())
+ return false;
+
+ // RIP-relative addressing
+ if (BaseReg.getReg() == X86::RIP) {
+ Target = Addr + Size + Disp.getImm();
+ return true;
+ }
+
+ return false;
+}
+
} // end of namespace X86_MC
} // end of namespace llvm
Index: llvm/lib/MC/MCInstrAnalysis.cpp
===================================================================
--- llvm/lib/MC/MCInstrAnalysis.cpp
+++ llvm/lib/MC/MCInstrAnalysis.cpp
@@ -33,3 +33,8 @@
Target = Addr+Size+Imm;
return true;
}
+
+bool MCInstrAnalysis::evaluateMemoryOperandAddress(const MCInst &Inst, uint64_t Addr,
+ uint64_t Size, uint64_t &Target) const {
+ return false;
+}
Index: llvm/include/llvm/MC/MCInstrAnalysis.h
===================================================================
--- llvm/include/llvm/MC/MCInstrAnalysis.h
+++ llvm/include/llvm/MC/MCInstrAnalysis.h
@@ -152,6 +152,12 @@
evaluateBranch(const MCInst &Inst, uint64_t Addr, uint64_t Size,
uint64_t &Target) const;
+ /// Given an instruction tries to get the address of a memory operand. Returns
+ /// true on success, and the address in Target.
+ virtual bool
+ evaluateMemoryOperandAddress(const MCInst &Inst, uint64_t Addr, uint64_t Size,
+ uint64_t &Target) const;
+
/// Returns (PLT virtual address, GOT virtual address) pairs for PLT entries.
virtual std::vector<std::pair<uint64_t, uint64_t>>
findPltEntries(uint64_t PltSectionVA, ArrayRef<uint8_t> PltContents,
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D63847.206755.patch
Type: text/x-patch
Size: 2978 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20190626/84e7ca68/attachment.bin>
More information about the llvm-commits
mailing list