retdec
arm_impl.h
Go to the documentation of this file.
1 
7 #ifndef CAPSTONE2LLVMIR_ARM_ARM_IMPL_H
8 #define CAPSTONE2LLVMIR_ARM_ARM_IMPL_H
9 
12 
13 namespace retdec {
14 namespace capstone2llvmir {
15 
17  public Capstone2LlvmIrTranslator_impl<cs_arm, cs_arm_op>,
19 {
20  public:
22  llvm::Module* m,
23  cs_mode basic = CS_MODE_ARM,
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 // ARM-specific methods.
55 //==============================================================================
56 //
57  protected:
58  llvm::Value* getCurrentPc(cs_insn* i);
59 
60  virtual llvm::Value* loadRegister(
61  uint32_t r,
62  llvm::IRBuilder<>& irb,
63  llvm::Type* dstType = nullptr,
64  eOpConv ct = eOpConv::THROW) override;
65  virtual llvm::Value* loadOp(
66  cs_arm_op& op,
67  llvm::IRBuilder<>& irb,
68  llvm::Type* ty = nullptr,
69  bool lea = false) override;
70 
71  virtual llvm::Instruction* storeRegister(
72  uint32_t r,
73  llvm::Value* val,
74  llvm::IRBuilder<>& irb,
75  eOpConv ct = eOpConv::SEXT_TRUNC_OR_BITCAST) override;
76  virtual llvm::Instruction* storeOp(
77  cs_arm_op& op,
78  llvm::Value* val,
79  llvm::IRBuilder<>& irb,
80  eOpConv ct = eOpConv::SEXT_TRUNC_OR_BITCAST) override;
81 
82  llvm::Value* generateInsnConditionCode(
83  llvm::IRBuilder<>& irb,
84  cs_arm* ai);
85 
86  llvm::Value* generateOperandShift(
87  llvm::IRBuilder<>& irb,
88  cs_arm_op& op,
89  llvm::Value* val);
90  llvm::Value* generateShiftAsr(
91  llvm::IRBuilder<>& irb,
92  llvm::Value* val,
93  llvm::Value* n);
94  llvm::Value* generateShiftLsl(
95  llvm::IRBuilder<>& irb,
96  llvm::Value* val,
97  llvm::Value* n);
98  llvm::Value* generateShiftLsr(
99  llvm::IRBuilder<>& irb,
100  llvm::Value* val,
101  llvm::Value* n);
102  llvm::Value* generateShiftRor(
103  llvm::IRBuilder<>& irb,
104  llvm::Value* val,
105  llvm::Value* n);
106  llvm::Value* generateShiftRrx(
107  llvm::IRBuilder<>& irb,
108  llvm::Value* val,
109  llvm::Value* n);
110 
111  uint32_t sysregNumberTranslation(uint32_t r);
112 //
113 //==============================================================================
114 // Helper methods.
115 //==============================================================================
116 //
117  protected:
118  virtual bool isOperandRegister(cs_arm_op& op) override;
119  virtual uint8_t getOperandAccess(cs_arm_op& op) override;
120 //
121 //==============================================================================
122 // ARM implementation data.
123 //==============================================================================
124 //
125  protected:
126  static std::map<
127  std::size_t,
129  cs_insn* i,
130  cs_arm*,
131  llvm::IRBuilder<>&)> _i2fm;
132 //
133 //==============================================================================
134 // ARM instruction translation methods.
135 //==============================================================================
136 //
137  protected:
138  void translateAdc(cs_insn* i, cs_arm* ai, llvm::IRBuilder<>& irb);
139  void translateAdd(cs_insn* i, cs_arm* ai, llvm::IRBuilder<>& irb);
140  void translateAnd(cs_insn* i, cs_arm* ai, llvm::IRBuilder<>& irb);
141  void translateB(cs_insn* i, cs_arm* ai, llvm::IRBuilder<>& irb);
142  void translateBl(cs_insn* i, cs_arm* ai, llvm::IRBuilder<>& irb);
143  void translateCbnz(cs_insn* i, cs_arm* ai, llvm::IRBuilder<>& irb);
144  void translateCbz(cs_insn* i, cs_arm* ai, llvm::IRBuilder<>& irb);
145  void translateClz(cs_insn* i, cs_arm* ai, llvm::IRBuilder<>& irb);
146  void translateEor(cs_insn* i, cs_arm* ai, llvm::IRBuilder<>& irb);
147  void translateLdmStm(cs_insn* i, cs_arm* ai, llvm::IRBuilder<>& irb);
148  void translateLdr(cs_insn* i, cs_arm* ai, llvm::IRBuilder<>& irb);
149  void translateLdrd(cs_insn* i, cs_arm* ai, llvm::IRBuilder<>& irb);
150  void translateMla(cs_insn* i, cs_arm* ai, llvm::IRBuilder<>& irb);
151  void translateMls(cs_insn* i, cs_arm* ai, llvm::IRBuilder<>& irb);
152  void translateMov(cs_insn* i, cs_arm* ai, llvm::IRBuilder<>& irb);
153  void translateMovt(cs_insn* i, cs_arm* ai, llvm::IRBuilder<>& irb);
154  void translateMovw(cs_insn* i, cs_arm* ai, llvm::IRBuilder<>& irb);
155  void translateMul(cs_insn* i, cs_arm* ai, llvm::IRBuilder<>& irb);
156  void translateNop(cs_insn* i, cs_arm* ai, llvm::IRBuilder<>& irb);
157  void translateOrr(cs_insn* i, cs_arm* ai, llvm::IRBuilder<>& irb);
158  void translateRev(cs_insn* i, cs_arm* ai, llvm::IRBuilder<>& irb);
159  void translateSbc(cs_insn* i, cs_arm* ai, llvm::IRBuilder<>& irb);
160  void translateShifts(cs_insn* i, cs_arm* ai, llvm::IRBuilder<>& irb);
161  void translateStr(cs_insn* i, cs_arm* ai, llvm::IRBuilder<>& irb);
162  void translateSub(cs_insn* i, cs_arm* ai, llvm::IRBuilder<>& irb);
163  void translateUmlal(cs_insn* i, cs_arm* ai, llvm::IRBuilder<>& irb);
164  void translateUmull(cs_insn* i, cs_arm* ai, llvm::IRBuilder<>& irb);
165  void translateUxtah(cs_insn* i, cs_arm* ai, llvm::IRBuilder<>& irb);
166  void translateUxtb(cs_insn* i, cs_arm* ai, llvm::IRBuilder<>& irb);
167  void translateUxtb16(cs_insn* i, cs_arm* ai, llvm::IRBuilder<>& irb);
168  void translateUxth(cs_insn* i, cs_arm* ai, llvm::IRBuilder<>& irb);
169 };
170 
171 } // namespace capstone2llvmir
172 } // namespace retdec
173 
174 #endif
ARM specialization of translator's abstract public interface.
Common private implementation for translators converting bytes to LLVM IR.
static std::map< std::size_t, void(Capstone2LlvmIrTranslatorArm_impl::*)(cs_insn *i, cs_arm *, llvm::IRBuilder<> &)> _i2fm
Definition: arm_impl.h:131
void translateBl(cs_insn *i, cs_arm *ai, llvm::IRBuilder<> &irb)
Definition: arm.cpp:907
virtual void generateRegisters() override
Definition: arm.cpp:65
void translateAdd(cs_insn *i, cs_arm *ai, llvm::IRBuilder<> &irb)
Definition: arm.cpp:807
void translateUxtah(cs_insn *i, cs_arm *ai, llvm::IRBuilder<> &irb)
Definition: arm.cpp:1896
llvm::Value * getCurrentPc(cs_insn *i)
Definition: arm.cpp:159
void translateB(cs_insn *i, cs_arm *ai, llvm::IRBuilder<> &irb)
Definition: arm.cpp:881
void translateMls(cs_insn *i, cs_arm *ai, llvm::IRBuilder<> &irb)
Definition: arm.cpp:1025
void translateAdc(cs_insn *i, cs_arm *ai, llvm::IRBuilder<> &irb)
Definition: arm.cpp:785
llvm::Value * generateShiftLsl(llvm::IRBuilder<> &irb, llvm::Value *val, llvm::Value *n)
Definition: arm.cpp:276
virtual llvm::Instruction * storeOp(cs_arm_op &op, llvm::Value *val, llvm::IRBuilder<> &irb, eOpConv ct=eOpConv::SEXT_TRUNC_OR_BITCAST) override
Definition: arm.cpp:546
virtual bool isAllowedExtraMode(cs_mode m) override
Definition: arm.cpp:38
void translateUxth(cs_insn *i, cs_arm *ai, llvm::IRBuilder<> &irb)
Definition: arm.cpp:1934
void translateUmlal(cs_insn *i, cs_arm *ai, llvm::IRBuilder<> &irb)
Definition: arm.cpp:1819
virtual bool isOperandRegister(cs_arm_op &op) override
Definition: arm.cpp:764
virtual llvm::Instruction * storeRegister(uint32_t r, llvm::Value *val, llvm::IRBuilder<> &irb, eOpConv ct=eOpConv::SEXT_TRUNC_OR_BITCAST) override
Definition: arm.cpp:495
llvm::Value * generateShiftRrx(llvm::IRBuilder<> &irb, llvm::Value *val, llvm::Value *n)
Definition: arm.cpp:324
void translateEor(cs_insn *i, cs_arm *ai, llvm::IRBuilder<> &irb)
Definition: arm.cpp:975
void translateMla(cs_insn *i, cs_arm *ai, llvm::IRBuilder<> &irb)
Definition: arm.cpp:1000
virtual void initializeArchSpecific() override
Definition: arm_init.cpp:18
llvm::Value * generateOperandShift(llvm::IRBuilder<> &irb, cs_arm_op &op, llvm::Value *val)
Definition: arm.cpp:193
void translateMovw(cs_insn *i, cs_arm *ai, llvm::IRBuilder<> &irb)
Definition: arm.cpp:1153
void translateAnd(cs_insn *i, cs_arm *ai, llvm::IRBuilder<> &irb)
Definition: arm.cpp:852
llvm::Value * generateShiftAsr(llvm::IRBuilder<> &irb, llvm::Value *val, llvm::Value *n)
Definition: arm.cpp:262
void translateRev(cs_insn *i, cs_arm *ai, llvm::IRBuilder<> &irb)
Definition: arm.cpp:1369
virtual uint32_t getCarryRegister() override
Definition: arm.cpp:73
llvm::Value * generateShiftLsr(llvm::IRBuilder<> &irb, llvm::Value *val, llvm::Value *n)
Definition: arm.cpp:291
void translateShifts(cs_insn *i, cs_arm *ai, llvm::IRBuilder<> &irb)
Definition: arm.cpp:1074
void translateCbnz(cs_insn *i, cs_arm *ai, llvm::IRBuilder<> &irb)
Definition: arm.cpp:927
void translateCbz(cs_insn *i, cs_arm *ai, llvm::IRBuilder<> &irb)
Definition: arm.cpp:943
virtual uint8_t getOperandAccess(cs_arm_op &op) override
Definition: arm.cpp:769
void translateOrr(cs_insn *i, cs_arm *ai, llvm::IRBuilder<> &irb)
Definition: arm.cpp:1207
virtual llvm::Value * loadOp(cs_arm_op &op, llvm::IRBuilder<> &irb, llvm::Type *ty=nullptr, bool lea=false) override
Definition: arm.cpp:379
void translateClz(cs_insn *i, cs_arm *ai, llvm::IRBuilder<> &irb)
Definition: arm.cpp:959
void translateSub(cs_insn *i, cs_arm *ai, llvm::IRBuilder<> &irb)
Definition: arm.cpp:1782
void translateMul(cs_insn *i, cs_arm *ai, llvm::IRBuilder<> &irb)
Definition: arm.cpp:1177
virtual void initializePseudoCallInstructionIDs() override
Definition: arm_init.cpp:338
Capstone2LlvmIrTranslatorArm_impl(llvm::Module *m, cs_mode basic=CS_MODE_ARM, cs_mode extra=CS_MODE_LITTLE_ENDIAN)
Definition: arm.cpp:14
virtual void generateEnvironmentArchSpecific() override
Definition: arm.cpp:55
void translateUxtb(cs_insn *i, cs_arm *ai, llvm::IRBuilder<> &irb)
Definition: arm.cpp:1910
void translateLdrd(cs_insn *i, cs_arm *ai, llvm::IRBuilder<> &irb)
Definition: arm.cpp:1548
virtual uint32_t getArchByteSize() override
Definition: arm.cpp:44
virtual llvm::Value * loadRegister(uint32_t r, llvm::IRBuilder<> &irb, llvm::Type *dstType=nullptr, eOpConv ct=eOpConv::THROW) override
Definition: arm.cpp:166
llvm::Value * generateShiftRor(llvm::IRBuilder<> &irb, llvm::Value *val, llvm::Value *n)
Definition: arm.cpp:305
virtual void initializeRegTypeMap() override
Definition: arm_init.cpp:113
void translateLdmStm(cs_insn *i, cs_arm *ai, llvm::IRBuilder<> &irb)
Definition: arm.cpp:1249
virtual void initializeRegNameMap() override
Definition: arm_init.cpp:23
void translateLdr(cs_insn *i, cs_arm *ai, llvm::IRBuilder<> &irb)
Definition: arm.cpp:1435
llvm::Value * generateInsnConditionCode(llvm::IRBuilder<> &irb, cs_arm *ai)
Definition: arm.cpp:649
void translateUxtb16(cs_insn *i, cs_arm *ai, llvm::IRBuilder<> &irb)
Definition: arm.cpp:1922
void translateStr(cs_insn *i, cs_arm *ai, llvm::IRBuilder<> &irb)
Definition: arm.cpp:1648
void translateSbc(cs_insn *i, cs_arm *ai, llvm::IRBuilder<> &irb)
Definition: arm.cpp:1386
void translateUmull(cs_insn *i, cs_arm *ai, llvm::IRBuilder<> &irb)
Definition: arm.cpp:1862
virtual void generateDataLayout() override
Definition: arm.cpp:60
virtual void translateInstruction(cs_insn *i, llvm::IRBuilder<> &irb) override
Definition: arm.cpp:78
void translateMovt(cs_insn *i, cs_arm *ai, llvm::IRBuilder<> &irb)
Definition: arm.cpp:1127
virtual bool isAllowedBasicMode(cs_mode m) override
Definition: arm.cpp:32
void translateMov(cs_insn *i, cs_arm *ai, llvm::IRBuilder<> &irb)
Definition: arm.cpp:1038
uint32_t sysregNumberTranslation(uint32_t r)
Definition: arm.cpp:361
void translateNop(cs_insn *i, cs_arm *ai, llvm::IRBuilder<> &irb)
Definition: arm.cpp:1199
Definition: capstone2llvmir_impl.h:32
Definition: archive_wrapper.h:19