]> CyberLeo.Net >> Repos - FreeBSD/releng/10.0.git/blob - contrib/llvm/tools/lldb/include/lldb/Core/EmulateInstruction.h
- Copy stable/10 (r259064) to releng/10.0 as part of the
[FreeBSD/releng/10.0.git] / contrib / llvm / tools / lldb / include / lldb / Core / EmulateInstruction.h
1 //===-- EmulateInstruction.h ------------------------------------*- C++ -*-===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9
10 #ifndef lldb_EmulateInstruction_h_
11 #define lldb_EmulateInstruction_h_
12
13 #include <string>
14
15 #include "lldb/lldb-private.h"
16 #include "lldb/lldb-public.h"
17 #include "lldb/Core/ArchSpec.h"
18 #include "lldb/Core/PluginInterface.h"
19 #include "lldb/Core/Opcode.h"
20 #include "lldb/Core/RegisterValue.h"
21
22 //----------------------------------------------------------------------
23 /// @class EmulateInstruction EmulateInstruction.h "lldb/Core/EmulateInstruction.h"
24 /// @brief A class that allows emulation of CPU opcodes.
25 ///
26 /// This class is a plug-in interface that is accessed through the 
27 /// standard static FindPlugin function call in the EmulateInstruction
28 /// class. The FindPlugin takes a target triple and returns a new object
29 /// if there is a plug-in that supports the architecture and OS. Four
30 /// callbacks and a baton are provided. The four callbacks are read 
31 /// register, write register, read memory and write memory.
32 ///
33 /// This class is currently designed for these main use cases:
34 /// - Auto generation of Call Frame Information (CFI) from assembly code
35 /// - Predicting single step breakpoint locations
36 /// - Emulating instructions for breakpoint traps
37 ///
38 /// Objects can be asked to read an instruction which will cause a call
39 /// to the read register callback to get the PC, followed by a read 
40 /// memory call to read the opcode. If ReadInstruction () returns true, 
41 /// then a call to EmulateInstruction::EvaluateInstruction () can be 
42 /// made. At this point the EmulateInstruction subclass will use all of
43 /// the callbacks to emulate an instruction.
44 ///
45 /// Clients that provide the callbacks can either do the read/write 
46 /// registers/memory to actually emulate the instruction on a real or
47 /// virtual CPU, or watch for the EmulateInstruction::Context which
48 /// is context for the read/write register/memory which explains why
49 /// the callback is being called. Examples of a context are:
50 /// "pushing register 3 onto the stack at offset -12", or "adjusting
51 /// stack pointer by -16". This extra context allows the generation of
52 /// CFI information from assembly code without having to actually do
53 /// the read/write register/memory.
54 ///
55 /// Clients must be prepared that not all instructions for an 
56 /// Instruction Set Architecture (ISA) will be emulated. 
57 ///
58 /// Subclasses at the very least should implement the instructions that
59 /// save and restore registers onto the stack and adjustment to the stack
60 /// pointer. By just implementing a few instructions for an ISA that are
61 /// the typical prologue opcodes, you can then generate CFI using a 
62 /// class that will soon be available.
63 /// 
64 /// Implementing all of the instructions that affect the PC can then
65 /// allow single step prediction support.
66 ///
67 /// Implementing all of the instructions allows for emulation of opcodes
68 /// for breakpoint traps and will pave the way for "thread centric"
69 /// debugging. The current debugging model is "process centric" where
70 /// all threads must be stopped when any thread is stopped; when
71 /// hitting software breakpoints we must disable the breakpoint by
72 /// restoring the original breakpoint opcde, single stepping and 
73 /// restoring the breakpoint trap. If all threads were allowed to run
74 /// then other threads could miss the breakpoint. 
75 ///
76 /// This class centralizes the code that usually is done in separate 
77 /// code paths in a debugger (single step prediction, finding save
78 /// restore locations of registers for unwinding stack frame variables)
79 /// and emulating the intruction is just a bonus.
80 //----------------------------------------------------------------------
81
82 namespace lldb_private {
83
84 class EmulateInstruction :
85     public PluginInterface
86 {
87 public:
88
89     static EmulateInstruction*
90     FindPlugin (const ArchSpec &arch, 
91                 InstructionType supported_inst_type,
92                 const char *plugin_name);
93
94     enum ContextType
95     {
96         eContextInvalid = 0,
97         // Read an instruciton opcode from memory
98         eContextReadOpcode,
99         
100         // Usually used for writing a register value whose source value is an 
101         // immediate
102         eContextImmediate,
103
104         // Exclusively used when saving a register to the stack as part of the 
105         // prologue
106         eContextPushRegisterOnStack,
107
108         // Exclusively used when restoring a register off the stack as part of 
109         // the epilogue
110         eContextPopRegisterOffStack,
111
112         // Add or subtract a value from the stack
113         eContextAdjustStackPointer,
114         
115         // Adjust the frame pointer for the current frame
116         eContextSetFramePointer,
117         
118         // Add or subtract a value from a base address register (other than SP)
119         eContextAdjustBaseRegister,
120
121         // Add or subtract a value from the PC or store a value to the PC.
122         eContextAdjustPC,
123         
124         // Used in WriteRegister callbacks to indicate where the 
125         eContextRegisterPlusOffset,
126
127         // Used in WriteMemory callback to indicate where the data came from
128         eContextRegisterStore,
129         
130         eContextRegisterLoad,
131         
132         // Used when performing a PC-relative branch where the
133         eContextRelativeBranchImmediate,
134
135         // Used when performing an absolute branch where the
136         eContextAbsoluteBranchRegister,
137
138         // Used when performing a supervisor call to an operating system to
139         // provide a service:
140         eContextSupervisorCall,
141
142         // Used when performing a MemU operation to read the PC-relative offset
143         // from an address.
144         eContextTableBranchReadMemory,
145         
146         // Used when random bits are written into a register
147         eContextWriteRegisterRandomBits,
148         
149         // Used when random bits are written to memory
150         eContextWriteMemoryRandomBits,
151         
152         eContextArithmetic,
153         
154         eContextAdvancePC,
155
156         eContextReturnFromException
157     };
158     
159     enum InfoType {
160         eInfoTypeRegisterPlusOffset,
161         eInfoTypeRegisterPlusIndirectOffset,
162         eInfoTypeRegisterToRegisterPlusOffset,
163         eInfoTypeRegisterToRegisterPlusIndirectOffset,
164         eInfoTypeRegisterRegisterOperands,
165         eInfoTypeOffset,
166         eInfoTypeRegister,
167         eInfoTypeImmediate,
168         eInfoTypeImmediateSigned,
169         eInfoTypeAddress,
170         eInfoTypeISAAndImmediate,
171         eInfoTypeISAAndImmediateSigned,
172         eInfoTypeISA,
173         eInfoTypeNoArgs
174     } InfoType;
175         
176     struct Context
177     {
178         ContextType type;
179         enum InfoType info_type;
180         union
181         {
182             struct RegisterPlusOffset 
183             {
184                 RegisterInfo reg;          // base register
185                 int64_t signed_offset; // signed offset added to base register
186             } RegisterPlusOffset;
187             
188             struct RegisterPlusIndirectOffset 
189             {
190                 RegisterInfo base_reg;      // base register number
191                 RegisterInfo offset_reg;    // offset register kind
192             } RegisterPlusIndirectOffset;
193             
194             struct RegisterToRegisterPlusOffset 
195             {
196                 RegisterInfo data_reg;      // source/target register for data
197                 RegisterInfo base_reg;      // base register for address calculation
198                 int64_t offset;         // offset for address calculation
199             } RegisterToRegisterPlusOffset;
200             
201             struct RegisterToRegisterPlusIndirectOffset
202             {
203                 RegisterInfo base_reg;      // base register for address calculation
204                 RegisterInfo offset_reg;    // offset register for address calculation
205                 RegisterInfo data_reg;      // source/target register for data
206             } RegisterToRegisterPlusIndirectOffset;
207             
208             struct RegisterRegisterOperands
209             {
210                 RegisterInfo operand1;      // register containing first operand for binary op
211                 RegisterInfo operand2;      // register containing second operand for binary op
212             } RegisterRegisterOperands;
213             
214             int64_t signed_offset;      // signed offset by which to adjust self (for registers only)
215             
216             RegisterInfo reg;               // plain register
217             
218             uint64_t unsigned_immediate;// unsigned immediate value
219             int64_t signed_immediate;   // signed immediate value
220             
221             lldb::addr_t address;       // direct address
222             
223             struct ISAAndImmediate 
224             {
225                 uint32_t isa;           
226                 uint32_t unsigned_data32;   // immdiate data
227             } ISAAndImmediate;
228             
229             struct ISAAndImmediateSigned 
230             {
231                 uint32_t isa;
232                 int32_t signed_data32;      // signed immdiate data
233             } ISAAndImmediateSigned;
234             
235             uint32_t isa;
236                         
237         } info;
238         
239         Context () :
240             type (eContextInvalid),
241             info_type (eInfoTypeNoArgs)
242         {
243         }
244
245         void 
246         SetRegisterPlusOffset (RegisterInfo base_reg,
247                                int64_t signed_offset)
248         {
249             info_type = eInfoTypeRegisterPlusOffset;
250             info.RegisterPlusOffset.reg = base_reg;
251             info.RegisterPlusOffset.signed_offset = signed_offset;
252         }
253
254         void
255         SetRegisterPlusIndirectOffset (RegisterInfo base_reg,
256                                        RegisterInfo offset_reg)
257         {
258             info_type = eInfoTypeRegisterPlusIndirectOffset;
259             info.RegisterPlusIndirectOffset.base_reg   = base_reg;
260             info.RegisterPlusIndirectOffset.offset_reg = offset_reg;
261         }
262         
263         void
264         SetRegisterToRegisterPlusOffset (RegisterInfo data_reg,
265                                          RegisterInfo base_reg,
266                                          int64_t offset)
267         {
268             info_type = eInfoTypeRegisterToRegisterPlusOffset;
269             info.RegisterToRegisterPlusOffset.data_reg = data_reg;
270             info.RegisterToRegisterPlusOffset.base_reg = base_reg;
271             info.RegisterToRegisterPlusOffset.offset   = offset;
272         }
273         
274         void
275         SetRegisterToRegisterPlusIndirectOffset (RegisterInfo base_reg,
276                                                  RegisterInfo offset_reg,
277                                                  RegisterInfo data_reg)
278         {
279             info_type = eInfoTypeRegisterToRegisterPlusIndirectOffset;
280             info.RegisterToRegisterPlusIndirectOffset.base_reg   = base_reg;
281             info.RegisterToRegisterPlusIndirectOffset.offset_reg = offset_reg;
282             info.RegisterToRegisterPlusIndirectOffset.data_reg   = data_reg;
283         }
284         
285         void
286         SetRegisterRegisterOperands (RegisterInfo op1_reg,
287                                      RegisterInfo op2_reg)
288         {
289             info_type = eInfoTypeRegisterRegisterOperands;
290             info.RegisterRegisterOperands.operand1 = op1_reg;
291             info.RegisterRegisterOperands.operand2 = op2_reg;
292         }
293         
294         void
295         SetOffset (int64_t signed_offset)
296         {
297             info_type = eInfoTypeOffset;
298             info.signed_offset = signed_offset;
299         }
300         
301         void
302         SetRegister (RegisterInfo reg)
303         {
304             info_type = eInfoTypeRegister;
305             info.reg = reg;
306         }
307         
308         void
309         SetImmediate (uint64_t immediate)
310         {
311             info_type = eInfoTypeImmediate;
312             info.unsigned_immediate = immediate;
313         }
314         
315         void
316         SetImmediateSigned (int64_t signed_immediate)
317         {
318             info_type = eInfoTypeImmediateSigned;
319             info.signed_immediate = signed_immediate;
320         }
321         
322         void
323         SetAddress (lldb::addr_t address)
324         {
325             info_type = eInfoTypeAddress;
326             info.address = address;
327         }
328         void
329         SetISAAndImmediate (uint32_t isa, uint32_t data)
330         {
331             info_type = eInfoTypeISAAndImmediate;
332             info.ISAAndImmediate.isa = isa;
333             info.ISAAndImmediate.unsigned_data32 = data;
334         }
335         
336         void
337         SetISAAndImmediateSigned (uint32_t isa, int32_t data)
338         {
339             info_type = eInfoTypeISAAndImmediateSigned;
340             info.ISAAndImmediateSigned.isa = isa;
341             info.ISAAndImmediateSigned.signed_data32 = data;
342         }
343         
344         void
345         SetISA (uint32_t isa)
346         {
347             info_type = eInfoTypeISA;
348             info.isa = isa;
349         }
350         
351         void
352         SetNoArgs ()
353         {
354             info_type = eInfoTypeNoArgs;
355         }
356
357         void
358         Dump (Stream &s,
359               EmulateInstruction *instruction) const;
360
361     };
362
363     typedef size_t (*ReadMemoryCallback) (EmulateInstruction *instruction,
364                                           void *baton,
365                                           const Context &context, 
366                                           lldb::addr_t addr, 
367                                           void *dst,
368                                           size_t length);
369     
370     typedef size_t (*WriteMemoryCallback) (EmulateInstruction *instruction,
371                                            void *baton,
372                                            const Context &context, 
373                                            lldb::addr_t addr, 
374                                            const void *dst,
375                                            size_t length);
376     
377     typedef bool   (*ReadRegisterCallback)  (EmulateInstruction *instruction,
378                                              void *baton,
379                                              const RegisterInfo *reg_info,
380                                              RegisterValue &reg_value);
381
382     typedef bool   (*WriteRegisterCallback) (EmulateInstruction *instruction,
383                                              void *baton,
384                                              const Context &context, 
385                                              const RegisterInfo *reg_info,
386                                              const RegisterValue &reg_value);
387
388     EmulateInstruction (const ArchSpec &arch);
389
390     virtual ~EmulateInstruction()
391     {
392     }
393     //----------------------------------------------------------------------
394     // Mandatory overrides
395     //----------------------------------------------------------------------    
396     virtual bool
397     SupportsEmulatingIntructionsOfType (InstructionType inst_type) = 0;
398     
399     virtual bool
400     SetTargetTriple (const ArchSpec &arch) = 0;
401     
402     virtual bool 
403     ReadInstruction () = 0;
404
405     virtual bool
406     EvaluateInstruction (uint32_t evaluate_options) = 0;
407     
408     virtual bool
409     TestEmulation (Stream *out_stream, ArchSpec &arch, OptionValueDictionary *test_data) = 0;
410
411     virtual bool
412     GetRegisterInfo (uint32_t reg_kind, uint32_t reg_num, RegisterInfo &reg_info) = 0;
413
414     //----------------------------------------------------------------------
415     // Optional overrides
416     //----------------------------------------------------------------------
417     virtual bool
418     SetInstruction (const Opcode &insn_opcode, const Address &inst_addr, Target *target);
419
420     virtual bool
421     CreateFunctionEntryUnwind (UnwindPlan &unwind_plan);    
422
423     static const char *
424     TranslateRegister (uint32_t reg_kind, uint32_t reg_num, std::string &reg_name);
425     
426     //----------------------------------------------------------------------
427     // RegisterInfo variants
428     //----------------------------------------------------------------------
429     bool
430     ReadRegister (const RegisterInfo *reg_info, 
431                   RegisterValue& reg_value);
432
433     uint64_t
434     ReadRegisterUnsigned (const RegisterInfo *reg_info,
435                           uint64_t fail_value, 
436                           bool *success_ptr);
437     
438     bool
439     WriteRegister (const Context &context, 
440                    const RegisterInfo *ref_info, 
441                    const RegisterValue& reg_value);
442
443     bool
444     WriteRegisterUnsigned (const Context &context,
445                            const RegisterInfo *reg_info,
446                            uint64_t reg_value);
447
448     //----------------------------------------------------------------------
449     // Register kind and number variants
450     //----------------------------------------------------------------------
451     bool
452     ReadRegister (uint32_t reg_kind, 
453                   uint32_t reg_num, 
454                   RegisterValue& reg_value);
455
456     bool
457     WriteRegister (const Context &context, 
458                    uint32_t reg_kind, 
459                    uint32_t reg_num, 
460                    const RegisterValue& reg_value);
461
462     uint64_t
463     ReadRegisterUnsigned (uint32_t reg_kind, 
464                           uint32_t reg_num,
465                           uint64_t fail_value, 
466                           bool *success_ptr);
467
468     bool
469     WriteRegisterUnsigned (const Context &context,
470                            uint32_t reg_kind, 
471                            uint32_t reg_num,
472                            uint64_t reg_value);
473
474
475     size_t
476     ReadMemory (const Context &context, 
477                 lldb::addr_t addr, 
478                 void *dst,
479                 size_t dst_len);
480
481     uint64_t
482     ReadMemoryUnsigned (const Context &context, 
483                         lldb::addr_t addr, 
484                         size_t byte_size, 
485                         uint64_t fail_value, 
486                         bool *success_ptr);
487
488     bool
489     WriteMemory (const Context &context, 
490                  lldb::addr_t addr, 
491                  const void *src,
492                  size_t src_len);
493
494     bool
495     WriteMemoryUnsigned (const Context &context, 
496                          lldb::addr_t addr, 
497                          uint64_t uval,
498                          size_t uval_byte_size);
499
500     uint32_t
501     GetAddressByteSize () const
502     {
503         return m_arch.GetAddressByteSize();
504     }
505
506     lldb::ByteOrder
507     GetByteOrder () const
508     {
509         return m_arch.GetByteOrder();
510     }
511
512     const Opcode &
513     GetOpcode () const
514     {
515         return m_opcode;
516     }
517     
518     lldb::addr_t
519     GetAddress () const
520     {
521         return m_addr;
522     }
523     
524     const ArchSpec &
525     GetArchitecture () const
526     {
527         return m_arch;
528     }
529
530
531     static size_t 
532     ReadMemoryFrame (EmulateInstruction *instruction,
533                      void *baton,
534                      const Context &context, 
535                      lldb::addr_t addr, 
536                      void *dst,
537                      size_t length);
538     
539     static size_t 
540     WriteMemoryFrame (EmulateInstruction *instruction,
541                       void *baton,
542                       const Context &context, 
543                       lldb::addr_t addr, 
544                       const void *dst,
545                       size_t length);
546     
547     static bool   
548     ReadRegisterFrame  (EmulateInstruction *instruction,
549                         void *baton,
550                         const RegisterInfo *reg_info,
551                         RegisterValue &reg_value);
552     
553     
554     static bool   
555     WriteRegisterFrame (EmulateInstruction *instruction,
556                         void *baton,
557                         const Context &context, 
558                         const RegisterInfo *reg_info,
559                         const RegisterValue &reg_value);
560                           
561     static size_t 
562     ReadMemoryDefault (EmulateInstruction *instruction,
563                        void *baton,
564                        const Context &context, 
565                        lldb::addr_t addr, 
566                        void *dst,
567                        size_t length);
568     
569     static size_t 
570     WriteMemoryDefault (EmulateInstruction *instruction,
571                         void *baton,
572                         const Context &context, 
573                         lldb::addr_t addr, 
574                         const void *dst,
575                         size_t length);
576     
577     static bool   
578     ReadRegisterDefault  (EmulateInstruction *instruction,
579                           void *baton,
580                           const RegisterInfo *reg_info,
581                           RegisterValue &reg_value);
582     
583     
584     static bool   
585     WriteRegisterDefault (EmulateInstruction *instruction,
586                           void *baton,
587                           const Context &context, 
588                           const RegisterInfo *reg_info,
589                           const RegisterValue &reg_value);
590    
591     void
592     SetBaton (void *baton);
593     
594     void
595     SetCallbacks (ReadMemoryCallback read_mem_callback,
596                   WriteMemoryCallback write_mem_callback,
597                   ReadRegisterCallback read_reg_callback,
598                   WriteRegisterCallback write_reg_callback);
599                   
600     void
601     SetReadMemCallback (ReadMemoryCallback read_mem_callback);
602     
603     void
604     SetWriteMemCallback (WriteMemoryCallback write_mem_callback);
605     
606     void
607     SetReadRegCallback (ReadRegisterCallback read_reg_callback);
608     
609     void
610     SetWriteRegCallback (WriteRegisterCallback write_reg_callback);
611
612     static bool
613     GetBestRegisterKindAndNumber (const RegisterInfo *reg_info, 
614                                   uint32_t &reg_kind,
615                                   uint32_t &reg_num);
616     
617     static uint32_t
618     GetInternalRegisterNumber (RegisterContext *reg_ctx,
619                                const RegisterInfo &reg_info);
620
621 protected:
622     ArchSpec                m_arch;
623     void *                  m_baton;
624     ReadMemoryCallback      m_read_mem_callback;
625     WriteMemoryCallback     m_write_mem_callback;
626     ReadRegisterCallback    m_read_reg_callback;
627     WriteRegisterCallback   m_write_reg_callback;
628     lldb::addr_t            m_addr;
629     Opcode                  m_opcode;
630     
631
632 private:
633     //------------------------------------------------------------------
634     // For EmulateInstruction only
635     //------------------------------------------------------------------
636     DISALLOW_COPY_AND_ASSIGN (EmulateInstruction);
637 };
638
639 }   // namespace lldb_private
640
641 #endif  // lldb_EmulateInstruction_h_