retdec
powerpc_impl.h
Go to the documentation of this file.
1 
7 #ifndef CAPSTONE2LLVMIR_POWERPC_POWERPC_IMPL_H
8 #define CAPSTONE2LLVMIR_POWERPC_POWERPC_IMPL_H
9 
12 
13 namespace retdec {
14 namespace capstone2llvmir {
15 
17  public Capstone2LlvmIrTranslator_impl<cs_ppc, cs_ppc_op>,
19 {
20  public:
22  llvm::Module* m,
23  cs_mode basic = CS_MODE_32,
24  cs_mode extra = CS_MODE_LITTLE_ENDIAN);
25 //
26 //==============================================================================
27 // Mode query & modification methods - from Capstone2LlvmIrTranslator.
28 //==============================================================================
29 //
30  public:
31  virtual bool isAllowedBasicMode(cs_mode m) override;
32  virtual bool isAllowedExtraMode(cs_mode m) override;
33  virtual uint32_t getArchByteSize() override;
34 //
35 //==============================================================================
36 // Pure virtual methods from Capstone2LlvmIrTranslator_impl
37 //==============================================================================
38 //
39  protected:
40  virtual void initializeArchSpecific() override;
41  virtual void initializeRegNameMap() override;
42  virtual void initializeRegTypeMap() override;
43  virtual void initializePseudoCallInstructionIDs() override;
44  virtual void generateEnvironmentArchSpecific() override;
45  virtual void generateDataLayout() override;
46  virtual void generateRegisters() override;
47  virtual uint32_t getCarryRegister() override;
48 
49  virtual void translateInstruction(
50  cs_insn* i,
51  llvm::IRBuilder<>& irb) override;
52 //
53 //==============================================================================
54 // PowerPC-specific methods.
55 //==============================================================================
56 //
57  protected:
58  virtual llvm::Value* loadRegister(
59  uint32_t r,
60  llvm::IRBuilder<>& irb,
61  llvm::Type* dstType = nullptr,
62  eOpConv ct = eOpConv::THROW) override;
63  virtual llvm::Value* loadOp(
64  cs_ppc_op& op,
65  llvm::IRBuilder<>& irb,
66  llvm::Type* ty = nullptr,
67  bool lea = false) override;
68 
69  virtual llvm::StoreInst* storeRegister(
70  uint32_t r,
71  llvm::Value* val,
72  llvm::IRBuilder<>& irb,
73  eOpConv ct = eOpConv::SEXT_TRUNC_OR_BITCAST) override;
74  virtual llvm::Instruction* storeOp(
75  cs_ppc_op& op,
76  llvm::Value* val,
77  llvm::IRBuilder<>& irb,
78  eOpConv ct = eOpConv::SEXT_TRUNC_OR_BITCAST) override;
79 
80  void storeCrX(
81  llvm::IRBuilder<>& irb,
82  uint32_t crReg,
83  llvm::Value* op0,
84  llvm::Value* op1 = nullptr,
85  bool signedCmp = true);
86  void storeCr0(llvm::IRBuilder<>& irb, cs_ppc* pi, llvm::Value* val);
87 
88  std::tuple<llvm::Value*, llvm::Value*, llvm::Value*, llvm::Value*> loadCrX(
89  llvm::IRBuilder<>& irb,
90  uint32_t crReg);
91  llvm::Value* loadCrX(
92  llvm::IRBuilder<>& irb,
93  uint32_t crReg,
94  ppc_cr_types type);
95 
96  bool isGeneralPurposeRegister(uint32_t r);
97  uint32_t getGeneralPurposeRegisterIndex(uint32_t r);
98  uint32_t crBitIndexToCrRegister(uint32_t idx);
99  bool isCrRegister(uint32_t r);
100  bool isCrRegister(cs_ppc_op& op);
101 
102  virtual bool isOperandRegister(cs_ppc_op& op) override;
103 //
104 //==============================================================================
105 // PowerPC implementation data.
106 //==============================================================================
107 //
108  protected:
109  static std::map<
110  std::size_t,
112  cs_insn* i,
113  cs_ppc*,
114  llvm::IRBuilder<>&)> _i2fm;
115 //
116 //==============================================================================
117 // PowerPC instruction translation methods.
118 //==============================================================================
119 //
120  protected:
121  void translateAdd(cs_insn* i, cs_ppc* pi, llvm::IRBuilder<>& irb);
122  void translateAddc(cs_insn* i, cs_ppc* pi, llvm::IRBuilder<>& irb);
123  void translateAdde(cs_insn* i, cs_ppc* pi, llvm::IRBuilder<>& irb);
124  void translateAddis(cs_insn* i, cs_ppc* pi, llvm::IRBuilder<>& irb);
125  void translateAddme(cs_insn* i, cs_ppc* pi, llvm::IRBuilder<>& irb);
126  void translateAddze(cs_insn* i, cs_ppc* pi, llvm::IRBuilder<>& irb);
127  void translateAnd(cs_insn* i, cs_ppc* pi, llvm::IRBuilder<>& irb);
128  void translateAndc(cs_insn* i, cs_ppc* pi, llvm::IRBuilder<>& irb);
129  void translateAndis(cs_insn* i, cs_ppc* pi, llvm::IRBuilder<>& irb);
130  void translateB(cs_insn* i, cs_ppc* pi, llvm::IRBuilder<>& irb);
131  void translateClrlwi(cs_insn* i, cs_ppc* pi, llvm::IRBuilder<>& irb);
132  void translateCmp(cs_insn* i, cs_ppc* pi, llvm::IRBuilder<>& irb);
133  void translateCntlzw(cs_insn* i, cs_ppc* pi, llvm::IRBuilder<>& irb);
134  void translateCrModifTernary(cs_insn* i, cs_ppc* pi, llvm::IRBuilder<>& irb);
135  void translateCrNotMove(cs_insn* i, cs_ppc* pi, llvm::IRBuilder<>& irb);
136  void translateCrSetClr(cs_insn* i, cs_ppc* pi, llvm::IRBuilder<>& irb);
137  void translateDivw(cs_insn* i, cs_ppc* pi, llvm::IRBuilder<>& irb);
138  void translateEqv(cs_insn* i, cs_ppc* pi, llvm::IRBuilder<>& irb);
139  void translateExtendSign(cs_insn* i, cs_ppc* pi, llvm::IRBuilder<>& irb);
140  void translateLhbrx(cs_insn* i, cs_ppc* pi, llvm::IRBuilder<>& irb);
141  void translateLi(cs_insn* i, cs_ppc* pi, llvm::IRBuilder<>& irb);
142  void translateLis(cs_insn* i, cs_ppc* pi, llvm::IRBuilder<>& irb);
143  void translateLoad(cs_insn* i, cs_ppc* pi, llvm::IRBuilder<>& irb);
144  void translateLoadIndexed(cs_insn* i, cs_ppc* pi, llvm::IRBuilder<>& irb);
145  void translateMcrf(cs_insn* i, cs_ppc* pi, llvm::IRBuilder<>& irb);
146  void translateMfctr(cs_insn* i, cs_ppc* pi, llvm::IRBuilder<>& irb);
147  void translateMflr(cs_insn* i, cs_ppc* pi, llvm::IRBuilder<>& irb);
148  void translateMr(cs_insn* i, cs_ppc* pi, llvm::IRBuilder<>& irb);
149  void translateMtcrf(cs_insn* i, cs_ppc* pi, llvm::IRBuilder<>& irb);
150  void translateMtcr(cs_insn* i, cs_ppc* pi, llvm::IRBuilder<>& irb);
151  void translateMtctr(cs_insn* i, cs_ppc* pi, llvm::IRBuilder<>& irb);
152  void translateMtlr(cs_insn* i, cs_ppc* pi, llvm::IRBuilder<>& irb);
153  void translateMulhw(cs_insn* i, cs_ppc* pi, llvm::IRBuilder<>& irb);
154  void translateMullw(cs_insn* i, cs_ppc* pi, llvm::IRBuilder<>& irb);
155  void translateNand(cs_insn* i, cs_ppc* pi, llvm::IRBuilder<>& irb);
156  void translateNeg(cs_insn* i, cs_ppc* pi, llvm::IRBuilder<>& irb);
157  void translateNop(cs_insn* i, cs_ppc* pi, llvm::IRBuilder<>& irb);
158  void translateNor(cs_insn* i, cs_ppc* pi, llvm::IRBuilder<>& irb);
159  void translateNot(cs_insn* i, cs_ppc* pi, llvm::IRBuilder<>& irb);
160  void translateOr(cs_insn* i, cs_ppc* pi, llvm::IRBuilder<>& irb);
161  void translateOrc(cs_insn* i, cs_ppc* pi, llvm::IRBuilder<>& irb);
162  void translateOris(cs_insn* i, cs_ppc* pi, llvm::IRBuilder<>& irb);
163  void translateRotateComplex5op(cs_insn* i, cs_ppc* pi, llvm::IRBuilder<>& irb);
164  void translateRotlw(cs_insn* i, cs_ppc* pi, llvm::IRBuilder<>& irb);
165  void translateShiftLeft(cs_insn* i, cs_ppc* pi, llvm::IRBuilder<>& irb);
166  void translateShiftRight(cs_insn* i, cs_ppc* pi, llvm::IRBuilder<>& irb);
167  void translateSlwi(cs_insn* i, cs_ppc* pi, llvm::IRBuilder<>& irb);
168  void translateSrwi(cs_insn* i, cs_ppc* pi, llvm::IRBuilder<>& irb);
169  void translateSraw(cs_insn* i, cs_ppc* pi, llvm::IRBuilder<>& irb);
170  void translateStore(cs_insn* i, cs_ppc* pi, llvm::IRBuilder<>& irb);
171  void translateStoreIndexed(cs_insn* i, cs_ppc* pi, llvm::IRBuilder<>& irb);
172  void translateSubf(cs_insn* i, cs_ppc* pi, llvm::IRBuilder<>& irb);
173  void translateSubfc(cs_insn* i, cs_ppc* pi, llvm::IRBuilder<>& irb);
174  void translateSubfe(cs_insn* i, cs_ppc* pi, llvm::IRBuilder<>& irb);
175  void translateSubfme(cs_insn* i, cs_ppc* pi, llvm::IRBuilder<>& irb);
176  void translateSubfze(cs_insn* i, cs_ppc* pi, llvm::IRBuilder<>& irb);
177  void translateXor(cs_insn* i, cs_ppc* pi, llvm::IRBuilder<>& irb);
178  void translateXoris(cs_insn* i, cs_ppc* pi, llvm::IRBuilder<>& irb);
179 };
180 
181 } // namespace capstone2llvmir
182 } // namespace retdec
183 
184 #endif
PowerPC specialization of translator's abstract public interface.
Common private implementation for translators converting bytes to LLVM IR.
virtual void initializeRegNameMap() override
Definition: powerpc_init.cpp:66
virtual void generateRegisters() override
Definition: powerpc.cpp:89
void translateCrNotMove(cs_insn *i, cs_ppc *pi, llvm::IRBuilder<> &irb)
Definition: powerpc.cpp:1307
virtual bool isAllowedExtraMode(cs_mode m) override
Definition: powerpc.cpp:37
void translateCrModifTernary(cs_insn *i, cs_ppc *pi, llvm::IRBuilder<> &irb)
Definition: powerpc.cpp:1270
void translateMfctr(cs_insn *i, cs_ppc *pi, llvm::IRBuilder<> &irb)
Definition: powerpc.cpp:1448
std::tuple< llvm::Value *, llvm::Value *, llvm::Value *, llvm::Value * > loadCrX(llvm::IRBuilder<> &irb, uint32_t crReg)
Definition: powerpc.cpp:376
virtual void initializeArchSpecific() override
Definition: powerpc_init.cpp:18
void translateSubfme(cs_insn *i, cs_ppc *pi, llvm::IRBuilder<> &irb)
Definition: powerpc.cpp:1855
void translateLhbrx(cs_insn *i, cs_ppc *pi, llvm::IRBuilder<> &irb)
Definition: powerpc.cpp:1099
virtual bool isOperandRegister(cs_ppc_op &op) override
Definition: powerpc.cpp:587
void translateClrlwi(cs_insn *i, cs_ppc *pi, llvm::IRBuilder<> &irb)
Definition: powerpc.cpp:748
virtual uint32_t getCarryRegister() override
Definition: powerpc.cpp:97
static std::map< std::size_t, void(Capstone2LlvmIrTranslatorPowerpc_impl::*)(cs_insn *i, cs_ppc *, llvm::IRBuilder<> &)> _i2fm
Definition: powerpc_impl.h:114
virtual llvm::Value * loadOp(cs_ppc_op &op, llvm::IRBuilder<> &irb, llvm::Type *ty=nullptr, bool lea=false) override
Definition: powerpc.cpp:150
void translateNop(cs_insn *i, cs_ppc *pi, llvm::IRBuilder<> &irb)
Definition: powerpc.cpp:1535
void translateAddis(cs_insn *i, cs_ppc *pi, llvm::IRBuilder<> &irb)
Definition: powerpc.cpp:649
void translateAndc(cs_insn *i, cs_ppc *pi, llvm::IRBuilder<> &irb)
Definition: powerpc.cpp:720
void translateMullw(cs_insn *i, cs_ppc *pi, llvm::IRBuilder<> &irb)
Definition: powerpc.cpp:1495
virtual void generateDataLayout() override
Definition: powerpc.cpp:70
virtual llvm::StoreInst * storeRegister(uint32_t r, llvm::Value *val, llvm::IRBuilder<> &irb, eOpConv ct=eOpConv::SEXT_TRUNC_OR_BITCAST) override
Definition: powerpc.cpp:215
void translateNor(cs_insn *i, cs_ppc *pi, llvm::IRBuilder<> &irb)
Definition: powerpc.cpp:1543
virtual void translateInstruction(cs_insn *i, llvm::IRBuilder<> &irb) override
Definition: powerpc.cpp:102
void translateCmp(cs_insn *i, cs_ppc *pi, llvm::IRBuilder<> &irb)
Definition: powerpc.cpp:771
virtual void initializePseudoCallInstructionIDs() override
Definition: powerpc_init.cpp:381
virtual void initializeRegTypeMap() override
Definition: powerpc_init.cpp:71
void storeCr0(llvm::IRBuilder<> &irb, cs_ppc *pi, llvm::Value *val)
Definition: powerpc.cpp:526
void translateSubfze(cs_insn *i, cs_ppc *pi, llvm::IRBuilder<> &irb)
Definition: powerpc.cpp:1877
void translateStore(cs_insn *i, cs_ppc *pi, llvm::IRBuilder<> &irb)
Definition: powerpc.cpp:1000
void translateMtcr(cs_insn *i, cs_ppc *pi, llvm::IRBuilder<> &irb)
Definition: powerpc.cpp:1196
uint32_t getGeneralPurposeRegisterIndex(uint32_t r)
Definition: powerpc.cpp:556
void translateAddme(cs_insn *i, cs_ppc *pi, llvm::IRBuilder<> &irb)
Definition: powerpc.cpp:663
void translateOris(cs_insn *i, cs_ppc *pi, llvm::IRBuilder<> &irb)
Definition: powerpc.cpp:1599
virtual llvm::Value * loadRegister(uint32_t r, llvm::IRBuilder<> &irb, llvm::Type *dstType=nullptr, eOpConv ct=eOpConv::THROW) override
Definition: powerpc.cpp:128
virtual bool isAllowedBasicMode(cs_mode m) override
Definition: powerpc.cpp:32
void translateCntlzw(cs_insn *i, cs_ppc *pi, llvm::IRBuilder<> &irb)
Definition: powerpc.cpp:818
void translateRotateComplex5op(cs_insn *i, cs_ppc *pi, llvm::IRBuilder<> &irb)
Definition: powerpc.cpp:1613
void translateAdd(cs_insn *i, cs_ppc *pi, llvm::IRBuilder<> &irb)
Definition: powerpc.cpp:603
void translateXoris(cs_insn *i, cs_ppc *pi, llvm::IRBuilder<> &irb)
Definition: powerpc.cpp:1909
void translateB(cs_insn *i, cs_ppc *pi, llvm::IRBuilder<> &irb)
Definition: powerpc.cpp:2027
void translateEqv(cs_insn *i, cs_ppc *pi, llvm::IRBuilder<> &irb)
Definition: powerpc.cpp:850
void translateSubfc(cs_insn *i, cs_ppc *pi, llvm::IRBuilder<> &irb)
Definition: powerpc.cpp:1800
void translateMulhw(cs_insn *i, cs_ppc *pi, llvm::IRBuilder<> &irb)
Definition: powerpc.cpp:1470
Capstone2LlvmIrTranslatorPowerpc_impl(llvm::Module *m, cs_mode basic=CS_MODE_32, cs_mode extra=CS_MODE_LITTLE_ENDIAN)
Definition: powerpc.cpp:14
void translateSrwi(cs_insn *i, cs_ppc *pi, llvm::IRBuilder<> &irb)
Definition: powerpc.cpp:1709
virtual uint32_t getArchByteSize() override
Definition: powerpc.cpp:42
void translateAndis(cs_insn *i, cs_ppc *pi, llvm::IRBuilder<> &irb)
Definition: powerpc.cpp:734
void translateMr(cs_insn *i, cs_ppc *pi, llvm::IRBuilder<> &irb)
Definition: powerpc.cpp:1151
virtual llvm::Instruction * storeOp(cs_ppc_op &op, llvm::Value *val, llvm::IRBuilder<> &irb, eOpConv ct=eOpConv::SEXT_TRUNC_OR_BITCAST) override
Definition: powerpc.cpp:236
void translateSlwi(cs_insn *i, cs_ppc *pi, llvm::IRBuilder<> &irb)
Definition: powerpc.cpp:1696
void translateMcrf(cs_insn *i, cs_ppc *pi, llvm::IRBuilder<> &irb)
Definition: powerpc.cpp:1379
void translateAdde(cs_insn *i, cs_ppc *pi, llvm::IRBuilder<> &irb)
Definition: powerpc.cpp:630
void translateShiftLeft(cs_insn *i, cs_ppc *pi, llvm::IRBuilder<> &irb)
Definition: powerpc.cpp:1662
void translateSraw(cs_insn *i, cs_ppc *pi, llvm::IRBuilder<> &irb)
Definition: powerpc.cpp:1723
void translateShiftRight(cs_insn *i, cs_ppc *pi, llvm::IRBuilder<> &irb)
Definition: powerpc.cpp:1679
virtual void generateEnvironmentArchSpecific() override
Definition: powerpc.cpp:65
bool isCrRegister(uint32_t r)
Definition: powerpc.cpp:577
uint32_t crBitIndexToCrRegister(uint32_t idx)
Definition: powerpc.cpp:572
void translateNeg(cs_insn *i, cs_ppc *pi, llvm::IRBuilder<> &irb)
Definition: powerpc.cpp:1522
void translateMflr(cs_insn *i, cs_ppc *pi, llvm::IRBuilder<> &irb)
Definition: powerpc.cpp:1459
void translateNand(cs_insn *i, cs_ppc *pi, llvm::IRBuilder<> &irb)
Definition: powerpc.cpp:1508
void translateSubf(cs_insn *i, cs_ppc *pi, llvm::IRBuilder<> &irb)
Definition: powerpc.cpp:1780
void translateOr(cs_insn *i, cs_ppc *pi, llvm::IRBuilder<> &irb)
Definition: powerpc.cpp:1572
void translateLoadIndexed(cs_insn *i, cs_ppc *pi, llvm::IRBuilder<> &irb)
Definition: powerpc.cpp:946
void translateXor(cs_insn *i, cs_ppc *pi, llvm::IRBuilder<> &irb)
Definition: powerpc.cpp:1896
void translateOrc(cs_insn *i, cs_ppc *pi, llvm::IRBuilder<> &irb)
Definition: powerpc.cpp:1585
void translateCrSetClr(cs_insn *i, cs_ppc *pi, llvm::IRBuilder<> &irb)
Definition: powerpc.cpp:1348
void translateNot(cs_insn *i, cs_ppc *pi, llvm::IRBuilder<> &irb)
Definition: powerpc.cpp:1557
void translateDivw(cs_insn *i, cs_ppc *pi, llvm::IRBuilder<> &irb)
Definition: powerpc.cpp:835
void translateMtlr(cs_insn *i, cs_ppc *pi, llvm::IRBuilder<> &irb)
Definition: powerpc.cpp:1258
void translateLis(cs_insn *i, cs_ppc *pi, llvm::IRBuilder<> &irb)
Definition: powerpc.cpp:1138
void translateMtcrf(cs_insn *i, cs_ppc *pi, llvm::IRBuilder<> &irb)
Definition: powerpc.cpp:1163
void translateAddze(cs_insn *i, cs_ppc *pi, llvm::IRBuilder<> &irb)
Definition: powerpc.cpp:686
void translateExtendSign(cs_insn *i, cs_ppc *pi, llvm::IRBuilder<> &irb)
Definition: powerpc.cpp:864
void translateAnd(cs_insn *i, cs_ppc *pi, llvm::IRBuilder<> &irb)
Definition: powerpc.cpp:707
void translateLi(cs_insn *i, cs_ppc *pi, llvm::IRBuilder<> &irb)
Definition: powerpc.cpp:1126
void translateMtctr(cs_insn *i, cs_ppc *pi, llvm::IRBuilder<> &irb)
Definition: powerpc.cpp:1247
void translateAddc(cs_insn *i, cs_ppc *pi, llvm::IRBuilder<> &irb)
Definition: powerpc.cpp:616
void translateLoad(cs_insn *i, cs_ppc *pi, llvm::IRBuilder<> &irb)
Definition: powerpc.cpp:894
void storeCrX(llvm::IRBuilder<> &irb, uint32_t crReg, llvm::Value *op0, llvm::Value *op1=nullptr, bool signedCmp=true)
Definition: powerpc.cpp:286
void translateSubfe(cs_insn *i, cs_ppc *pi, llvm::IRBuilder<> &irb)
Definition: powerpc.cpp:1833
void translateStoreIndexed(cs_insn *i, cs_ppc *pi, llvm::IRBuilder<> &irb)
Definition: powerpc.cpp:1052
void translateRotlw(cs_insn *i, cs_ppc *pi, llvm::IRBuilder<> &irb)
Definition: powerpc.cpp:1640
bool isGeneralPurposeRegister(uint32_t r)
Definition: powerpc.cpp:551
Definition: capstone2llvmir_impl.h:32
llvm::Value * op1
Definition: capstone2llvmir_impl.h:659
llvm::Value * op0
Definition: capstone2llvmir_impl.h:658
Definition: archive_wrapper.h:19
ppc_cr_types
Definition: powerpc_defs.h:58