blob: 7b9930efd6d2803d66047d91cdfb5f23d55e7b72 [file] [log] [blame]
Sean Callanan32a56ec2012-02-17 00:53:45 +00001//===-- DisassemblerLLVMC.cpp -----------------------------------*- 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#include "DisassemblerLLVMC.h"
11
12#include "llvm-c/Disassembler.h"
13#include "llvm/Support/TargetSelect.h"
14
15#include "lldb/Core/Address.h"
16#include "lldb/Core/DataExtractor.h"
17#include "lldb/Core/Stream.h"
18#include "lldb/Symbol/SymbolContext.h"
19#include "lldb/Target/ExecutionContext.h"
20#include "lldb/Target/Process.h"
21#include "lldb/Target/RegisterContext.h"
22#include "lldb/Target/Target.h"
23#include "lldb/Target/StackFrame.h"
24
25#include <regex.h>
26
27using namespace lldb;
28using namespace lldb_private;
29
30class InstructionLLVMC : public lldb_private::Instruction
31{
32public:
33 InstructionLLVMC (DisassemblerLLVMC &disasm,
34 const lldb_private::Address &address,
Greg Clayton7fb14302012-04-13 00:07:34 +000035 AddressClass addr_class) :
Sean Callanan32a56ec2012-02-17 00:53:45 +000036 Instruction(address, addr_class),
Sean Callanan32a56ec2012-02-17 00:53:45 +000037 m_is_valid(false),
Bill Wendling432fe102012-04-06 00:09:59 +000038 m_disasm(disasm),
Sean Callanan5f1b66c2012-03-02 23:22:53 +000039 m_does_branch(eLazyBoolCalculate)
Sean Callanan32a56ec2012-02-17 00:53:45 +000040 {
41 }
42
43 virtual
44 ~InstructionLLVMC ()
45 {
46 }
47
48 static void
49 PadToWidth (lldb_private::StreamString &ss,
50 int new_width)
51 {
52 int old_width = ss.GetSize();
53
54 if (old_width < new_width)
55 {
56 ss.Printf("%*s", new_width - old_width, "");
57 }
58 }
Sean Callanan32a56ec2012-02-17 00:53:45 +000059
Sean Callanan32a56ec2012-02-17 00:53:45 +000060 virtual bool
61 DoesBranch () const
62 {
Sean Callanan5f1b66c2012-03-02 23:22:53 +000063 return m_does_branch == eLazyBoolYes;
Sean Callanan32a56ec2012-02-17 00:53:45 +000064 }
65
66 virtual size_t
67 Decode (const lldb_private::Disassembler &disassembler,
68 const lldb_private::DataExtractor &data,
69 uint32_t data_offset)
70 {
Greg Clayton0fef9682012-05-10 02:52:23 +000071 // All we have to do is read the opcode which can be easy for some
72 // architetures
73 bool got_op = false;
74 const ArchSpec &arch = m_disasm.GetArchitecture();
Sean Callanan32a56ec2012-02-17 00:53:45 +000075
Greg Clayton0fef9682012-05-10 02:52:23 +000076 const uint32_t min_op_byte_size = arch.GetMinimumOpcodeByteSize();
77 const uint32_t max_op_byte_size = arch.GetMaximumOpcodeByteSize();
78 if (min_op_byte_size == max_op_byte_size)
79 {
80 // Fixed size instructions, just read that amount of data.
81 if (!data.ValidOffsetForDataOfSize(data_offset, min_op_byte_size))
82 return false;
83
84 switch (min_op_byte_size)
85 {
86 case 1:
87 m_opcode.SetOpcode8 (data.GetU8 (&data_offset));
88 got_op = true;
89 break;
90
91 case 2:
92 m_opcode.SetOpcode16 (data.GetU16 (&data_offset));
93 got_op = true;
94 break;
95
96 case 4:
97 m_opcode.SetOpcode32 (data.GetU32 (&data_offset));
98 got_op = true;
99 break;
100
101 case 8:
102 m_opcode.SetOpcode64 (data.GetU64 (&data_offset));
103 got_op = true;
104 break;
105
106 default:
107 m_opcode.SetOpcodeBytes(data.PeekData(data_offset, min_op_byte_size), min_op_byte_size);
108 got_op = true;
109 break;
110 }
111 }
112 if (!got_op)
113 {
114 ::LLVMDisasmContextRef disasm_context = m_disasm.m_disasm_context;
115
116 bool is_altnernate_isa = false;
117 if (m_disasm.m_alternate_disasm_context)
118 {
119 const AddressClass address_class = GetAddressClass ();
120
121 if (address_class == eAddressClassCodeAlternateISA)
122 {
123 disasm_context = m_disasm.m_alternate_disasm_context;
124 is_altnernate_isa = true;
125 }
126 }
127 const llvm::Triple::ArchType machine = arch.GetMachine();
128 if (machine == llvm::Triple::arm || machine == llvm::Triple::thumb)
129 {
130 if (machine == llvm::Triple::thumb || is_altnernate_isa)
131 {
132 uint32_t thumb_opcode = data.GetU16(&data_offset);
133 if ((thumb_opcode & 0xe000) != 0xe000 || ((thumb_opcode & 0x1800u) == 0))
134 {
135 m_opcode.SetOpcode16 (thumb_opcode);
136 }
137 else
138 {
139 thumb_opcode <<= 16;
140 thumb_opcode |= data.GetU16(&data_offset);
141 m_opcode.SetOpcode32 (thumb_opcode);
142 m_is_valid = true;
143 }
144 }
145 else
146 {
147 m_opcode.SetOpcode32 (data.GetU32(&data_offset));
148 }
149 }
150 else
151 {
152 // The opcode isn't evenly sized, so we need to actually use the llvm
153 // disassembler to parse it and get the size.
154 char out_string[512];
155 m_disasm.Lock(this, NULL);
156 uint8_t *opcode_data = const_cast<uint8_t *>(data.PeekData (data_offset, 1));
157 const size_t opcode_data_len = data.GetByteSize() - data_offset;
158 const addr_t pc = m_address.GetFileAddress();
159 const size_t inst_size = ::LLVMDisasmInstruction (disasm_context,
160 opcode_data,
161 opcode_data_len,
162 pc, // PC value
163 out_string,
164 sizeof(out_string));
165 // The address lookup function could have caused us to fill in our comment
166 m_comment.clear();
167 m_disasm.Unlock();
168 if (inst_size == 0)
169 m_opcode.Clear();
170 else
171 {
172 m_opcode.SetOpcodeBytes(opcode_data, inst_size);
173 m_is_valid = true;
174 }
175 }
176 }
Sean Callanan32a56ec2012-02-17 00:53:45 +0000177 return m_opcode.GetByteSize();
178 }
179
180 void
Greg Clayton0fef9682012-05-10 02:52:23 +0000181 AppendComment (std::string &description)
Sean Callanan32a56ec2012-02-17 00:53:45 +0000182 {
Greg Clayton0fef9682012-05-10 02:52:23 +0000183 if (m_comment.empty())
184 m_comment.swap (description);
Sean Callanan32a56ec2012-02-17 00:53:45 +0000185 else
Greg Clayton0fef9682012-05-10 02:52:23 +0000186 {
187 m_comment.append(", ");
188 m_comment.append(description);
189 }
Sean Callanan32a56ec2012-02-17 00:53:45 +0000190 }
191
192 virtual void
Greg Clayton0fef9682012-05-10 02:52:23 +0000193 CalculateMnemonicOperandsAndComment (const lldb_private::ExecutionContext *exe_ctx)
Sean Callanan32a56ec2012-02-17 00:53:45 +0000194 {
Greg Clayton0fef9682012-05-10 02:52:23 +0000195 DataExtractor data;
196 const AddressClass address_class = GetAddressClass ();
197
198 if (m_opcode.GetData(data, address_class))
199 {
200 char out_string[512];
201
202 ::LLVMDisasmContextRef disasm_context;
203
204 if (address_class == eAddressClassCodeAlternateISA)
205 disasm_context = m_disasm.m_alternate_disasm_context;
206 else
207 disasm_context = m_disasm.m_disasm_context;
208
209 lldb::addr_t pc = LLDB_INVALID_ADDRESS;
210
211 if (exe_ctx)
212 {
213 Target *target = exe_ctx->GetTargetPtr();
214 if (target)
215 pc = m_address.GetLoadAddress(target);
216 }
217
218 if (pc == LLDB_INVALID_ADDRESS)
219 pc = m_address.GetFileAddress();
220
221 m_disasm.Lock(this, exe_ctx);
222 uint8_t *opcode_data = const_cast<uint8_t *>(data.PeekData (0, 1));
223 const size_t opcode_data_len = data.GetByteSize();
224 size_t inst_size = ::LLVMDisasmInstruction (disasm_context,
225 opcode_data,
226 opcode_data_len,
227 pc,
228 out_string,
229 sizeof(out_string));
230
231 m_disasm.Unlock();
232
233 if (inst_size == 0)
234 {
235 m_comment.assign ("unknown opcode");
236 inst_size = m_opcode.GetByteSize();
237 StreamString mnemonic_strm;
238 uint32_t offset = 0;
239 switch (inst_size)
240 {
241 case 1:
242 {
243 const uint8_t uval8 = data.GetU8 (&offset);
244 m_opcode.SetOpcode8 (uval8);
245 m_opcode_name.assign (".byte");
246 mnemonic_strm.Printf("0x%2.2x", uval8);
247 }
248 break;
249 case 2:
250 {
251 const uint16_t uval16 = data.GetU16(&offset);
252 m_opcode.SetOpcode16(uval16);
253 m_opcode_name.assign (".short");
254 mnemonic_strm.Printf("0x%4.4x", uval16);
255 }
256 break;
257 case 4:
258 {
259 const uint32_t uval32 = data.GetU32(&offset);
260 m_opcode.SetOpcode32(uval32);
261 m_opcode_name.assign (".long");
262 mnemonic_strm.Printf("0x%8.8x", uval32);
263 }
264 break;
265 case 8:
266 {
267 const uint64_t uval64 = data.GetU64(&offset);
268 m_opcode.SetOpcode64(uval64);
269 m_opcode_name.assign (".quad");
270 mnemonic_strm.Printf("0x%16.16llx", uval64);
271 }
272 break;
273 default:
274 if (inst_size == 0)
275 return;
276 else
277 {
278 const uint8_t *bytes = data.PeekData(offset, inst_size);
279 if (bytes == NULL)
280 return;
281 m_opcode_name.assign (".byte");
282 m_opcode.SetOpcodeBytes(bytes, inst_size);
283 mnemonic_strm.Printf("0x%2.2x", bytes[0]);
284 for (uint32_t i=1; i<inst_size; ++i)
285 mnemonic_strm.Printf(" 0x%2.2x", bytes[i]);
286 }
287 break;
288 }
289 m_mnemocics.swap(mnemonic_strm.GetString());
290 return;
291 }
292 else
293 {
294 if (m_does_branch == eLazyBoolCalculate)
295 {
296 if (StringRepresentsBranch (out_string, strlen(out_string)))
297 m_does_branch = eLazyBoolYes;
298 else
299 m_does_branch = eLazyBoolNo;
300 }
301 }
302
303 if (!s_regex_compiled)
304 {
305 ::regcomp(&s_regex, "[ \t]*([^ ^\t]+)[ \t]*([^ ^\t].*)?", REG_EXTENDED);
306 s_regex_compiled = true;
307 }
308
309 ::regmatch_t matches[3];
310
311 if (!::regexec(&s_regex, out_string, sizeof(matches) / sizeof(::regmatch_t), matches, 0))
312 {
313 if (matches[1].rm_so != -1)
314 m_opcode_name.assign(out_string + matches[1].rm_so, matches[1].rm_eo - matches[1].rm_so);
315 if (matches[2].rm_so != -1)
316 m_mnemocics.assign(out_string + matches[2].rm_so, matches[2].rm_eo - matches[2].rm_so);
317 }
318 }
Sean Callanan32a56ec2012-02-17 00:53:45 +0000319 }
320
321 bool
322 IsValid ()
323 {
324 return m_is_valid;
325 }
326
327 size_t
328 GetByteSize ()
329 {
330 return m_opcode.GetByteSize();
331 }
332protected:
Sean Callanan32a56ec2012-02-17 00:53:45 +0000333
Sean Callanan5f1b66c2012-03-02 23:22:53 +0000334 bool StringRepresentsBranch (const char *data, size_t size)
335 {
336 const char *cursor = data;
337
338 bool inWhitespace = true;
339
340 while (inWhitespace && cursor < data + size)
341 {
342 switch (*cursor)
343 {
344 default:
345 inWhitespace = false;
346 break;
347 case ' ':
348 break;
349 case '\t':
350 break;
351 }
352
353 if (inWhitespace)
354 ++cursor;
355 }
356
357 if (cursor >= data + size)
358 return false;
359
360 llvm::Triple::ArchType arch = m_disasm.GetArchitecture().GetMachine();
361
362 switch (arch)
363 {
364 default:
365 return false;
366 case llvm::Triple::x86:
367 case llvm::Triple::x86_64:
368 switch (cursor[0])
369 {
370 default:
371 return false;
372 case 'j':
373 return true;
374 case 'c':
375 if (cursor[1] == 'a' &&
376 cursor[2] == 'l' &&
377 cursor[3] == 'l')
378 return true;
379 else
380 return false;
381 }
382 case llvm::Triple::arm:
383 case llvm::Triple::thumb:
384 switch (cursor[0])
385 {
386 default:
387 return false;
388 case 'b':
389 {
390 switch (cursor[1])
391 {
392 default:
Sean Callanan5f1b66c2012-03-02 23:22:53 +0000393 return true;
Sean Callanan561bf582012-04-10 21:51:12 +0000394 case 'f':
395 case 'i':
396 case 'k':
397 return false;
Sean Callanan5f1b66c2012-03-02 23:22:53 +0000398 }
Sean Callanan5f1b66c2012-03-02 23:22:53 +0000399 }
400 case 'c':
401 {
402 switch (cursor[1])
403 {
404 default:
405 return false;
406 case 'b':
407 return true;
408 }
409 }
410 }
411 }
412
413 return false;
414 }
415
Sean Callanan32a56ec2012-02-17 00:53:45 +0000416 bool m_is_valid;
417 DisassemblerLLVMC &m_disasm;
Sean Callanan5f1b66c2012-03-02 23:22:53 +0000418 LazyBool m_does_branch;
Sean Callanan32a56ec2012-02-17 00:53:45 +0000419
420 static bool s_regex_compiled;
421 static ::regex_t s_regex;
422};
423
424bool InstructionLLVMC::s_regex_compiled = false;
425::regex_t InstructionLLVMC::s_regex;
426
427Disassembler *
428DisassemblerLLVMC::CreateInstance (const ArchSpec &arch)
429{
430 std::auto_ptr<DisassemblerLLVMC> disasm_ap (new DisassemblerLLVMC(arch));
431
432 if (disasm_ap.get() && disasm_ap->IsValid())
433 return disasm_ap.release();
434
435 return NULL;
436}
437
438DisassemblerLLVMC::DisassemblerLLVMC (const ArchSpec &arch) :
439 Disassembler(arch),
Greg Clayton0fef9682012-05-10 02:52:23 +0000440 m_exe_ctx (NULL),
441 m_inst (NULL),
442 m_disasm_context (NULL),
443 m_alternate_disasm_context (NULL)
Sean Callanan32a56ec2012-02-17 00:53:45 +0000444{
445 m_disasm_context = ::LLVMCreateDisasm(arch.GetTriple().getTriple().c_str(),
446 (void*)this,
447 /*TagType=*/1,
Sean Callananaa12be42012-02-23 23:43:28 +0000448 NULL,
Sean Callanan32a56ec2012-02-17 00:53:45 +0000449 DisassemblerLLVMC::SymbolLookupCallback);
450
451 if (arch.GetTriple().getArch() == llvm::Triple::arm)
452 {
Greg Clayton0fef9682012-05-10 02:52:23 +0000453 ArchSpec thumb_arch(arch);
454 thumb_arch.GetTriple().setArchName(llvm::StringRef("thumbv7"));
455 std::string thumb_triple(thumb_arch.GetTriple().getTriple());
456
457 m_alternate_disasm_context = ::LLVMCreateDisasm(thumb_triple.c_str(),
Sean Callanan32a56ec2012-02-17 00:53:45 +0000458 (void*)this,
459 /*TagType=*/1,
Sean Callananaa12be42012-02-23 23:43:28 +0000460 NULL,
Sean Callanan32a56ec2012-02-17 00:53:45 +0000461 DisassemblerLLVMC::SymbolLookupCallback);
462 }
463}
464
465DisassemblerLLVMC::~DisassemblerLLVMC()
466{
Sean Callananeec2f082012-04-06 17:59:49 +0000467 if (m_disasm_context)
468 {
469 ::LLVMDisasmDispose(m_disasm_context);
470 m_disasm_context = NULL;
471 }
472 if (m_alternate_disasm_context)
473 {
474 ::LLVMDisasmDispose(m_alternate_disasm_context);
475 m_alternate_disasm_context = NULL;
476 }
Sean Callanan32a56ec2012-02-17 00:53:45 +0000477}
478
479size_t
480DisassemblerLLVMC::DecodeInstructions (const Address &base_addr,
481 const DataExtractor& data,
482 uint32_t data_offset,
483 uint32_t num_instructions,
484 bool append)
485{
486 if (!append)
487 m_instruction_list.Clear();
488
489 if (!IsValid())
490 return 0;
491
492 uint32_t data_cursor = data_offset;
Greg Clayton0fef9682012-05-10 02:52:23 +0000493 const size_t data_byte_size = data.GetByteSize();
Sean Callanan32a56ec2012-02-17 00:53:45 +0000494 uint32_t instructions_parsed = 0;
Greg Clayton0fef9682012-05-10 02:52:23 +0000495 Address inst_addr(base_addr);
Sean Callanan32a56ec2012-02-17 00:53:45 +0000496
Greg Clayton0fef9682012-05-10 02:52:23 +0000497 while (data_cursor < data_byte_size && instructions_parsed < num_instructions)
Sean Callanan32a56ec2012-02-17 00:53:45 +0000498 {
Sean Callanan32a56ec2012-02-17 00:53:45 +0000499
Greg Clayton0fef9682012-05-10 02:52:23 +0000500 AddressClass address_class = eAddressClassCode;
Sean Callanan32a56ec2012-02-17 00:53:45 +0000501
502 if (m_alternate_disasm_context)
Greg Clayton0fef9682012-05-10 02:52:23 +0000503 address_class = inst_addr.GetAddressClass ();
Sean Callanan32a56ec2012-02-17 00:53:45 +0000504
505 InstructionSP inst_sp(new InstructionLLVMC(*this,
Greg Clayton0fef9682012-05-10 02:52:23 +0000506 inst_addr,
Sean Callanan32a56ec2012-02-17 00:53:45 +0000507 address_class));
508
509 if (!inst_sp)
Greg Clayton0fef9682012-05-10 02:52:23 +0000510 break;
511
Sean Callanan32a56ec2012-02-17 00:53:45 +0000512 uint32_t inst_size = inst_sp->Decode(*this, data, data_cursor);
513
Greg Clayton0fef9682012-05-10 02:52:23 +0000514 if (inst_size == 0)
515 break;
516
Sean Callanan32a56ec2012-02-17 00:53:45 +0000517 m_instruction_list.Append(inst_sp);
Sean Callanan32a56ec2012-02-17 00:53:45 +0000518 data_cursor += inst_size;
Greg Clayton0fef9682012-05-10 02:52:23 +0000519 inst_addr.Slide(inst_size);
Sean Callanan32a56ec2012-02-17 00:53:45 +0000520 instructions_parsed++;
521 }
522
523 return data_cursor - data_offset;
524}
525
526void
527DisassemblerLLVMC::Initialize()
528{
529 PluginManager::RegisterPlugin (GetPluginNameStatic(),
530 GetPluginDescriptionStatic(),
531 CreateInstance);
532
533 llvm::InitializeAllTargetInfos();
534 llvm::InitializeAllTargetMCs();
535 llvm::InitializeAllAsmParsers();
536 llvm::InitializeAllDisassemblers();
537}
538
539void
540DisassemblerLLVMC::Terminate()
541{
542 PluginManager::UnregisterPlugin (CreateInstance);
543}
544
545
546const char *
547DisassemblerLLVMC::GetPluginNameStatic()
548{
Greg Clayton34814d62012-03-22 00:49:15 +0000549 return "llvm-mc";
Sean Callanan32a56ec2012-02-17 00:53:45 +0000550}
551
552const char *
553DisassemblerLLVMC::GetPluginDescriptionStatic()
554{
Greg Clayton34814d62012-03-22 00:49:15 +0000555 return "Disassembler that uses LLVM MC to disassemble i386, x86_64 and ARM.";
Sean Callanan32a56ec2012-02-17 00:53:45 +0000556}
557
Greg Clayton0fef9682012-05-10 02:52:23 +0000558int DisassemblerLLVMC::OpInfoCallback (void *disassembler,
559 uint64_t pc,
560 uint64_t offset,
561 uint64_t size,
562 int tag_type,
563 void *tag_bug)
Sean Callanan32a56ec2012-02-17 00:53:45 +0000564{
Greg Clayton0fef9682012-05-10 02:52:23 +0000565 return static_cast<DisassemblerLLVMC*>(disassembler)->OpInfo (pc,
566 offset,
567 size,
568 tag_type,
569 tag_bug);
Sean Callanan32a56ec2012-02-17 00:53:45 +0000570}
571
Greg Clayton0fef9682012-05-10 02:52:23 +0000572const char *DisassemblerLLVMC::SymbolLookupCallback (void *disassembler,
573 uint64_t value,
574 uint64_t *type,
575 uint64_t pc,
576 const char **name)
Sean Callanan32a56ec2012-02-17 00:53:45 +0000577{
Greg Clayton0fef9682012-05-10 02:52:23 +0000578 return static_cast<DisassemblerLLVMC*>(disassembler)->SymbolLookup(value,
579 type,
580 pc,
581 name);
Sean Callanan32a56ec2012-02-17 00:53:45 +0000582}
583
584int DisassemblerLLVMC::OpInfo (uint64_t PC,
585 uint64_t Offset,
586 uint64_t Size,
Greg Clayton0fef9682012-05-10 02:52:23 +0000587 int tag_type,
588 void *tag_bug)
Sean Callanan32a56ec2012-02-17 00:53:45 +0000589{
Greg Clayton0fef9682012-05-10 02:52:23 +0000590 switch (tag_type)
Sean Callanan32a56ec2012-02-17 00:53:45 +0000591 {
592 default:
593 break;
594 case 1:
Greg Clayton0fef9682012-05-10 02:52:23 +0000595 bzero (tag_bug, sizeof(::LLVMOpInfo1));
Sean Callanan32a56ec2012-02-17 00:53:45 +0000596 break;
597 }
598 return 0;
599}
600
Greg Clayton0fef9682012-05-10 02:52:23 +0000601const char *DisassemblerLLVMC::SymbolLookup (uint64_t value,
602 uint64_t *type_ptr,
603 uint64_t pc,
604 const char **name)
Sean Callanan32a56ec2012-02-17 00:53:45 +0000605{
Greg Clayton0fef9682012-05-10 02:52:23 +0000606 if (*type_ptr)
607 {
608 if (m_exe_ctx && m_inst)
609 {
610 //std::string remove_this_prior_to_checkin;
611 Address reference_address;
Sean Callanan32a56ec2012-02-17 00:53:45 +0000612
Greg Clayton0fef9682012-05-10 02:52:23 +0000613 Target *target = m_exe_ctx ? m_exe_ctx->GetTargetPtr() : NULL;
614
615 if (target && !target->GetSectionLoadList().IsEmpty())
616 target->GetSectionLoadList().ResolveLoadAddress(value, reference_address);
617 else
618 {
619 ModuleSP module_sp(m_inst->GetAddress().GetModule());
620 if (module_sp)
621 module_sp->ResolveFileAddress(value, reference_address);
622 }
623
Sean Callananaa12be42012-02-23 23:43:28 +0000624 if (reference_address.IsValid() && reference_address.GetSection())
Sean Callanan32a56ec2012-02-17 00:53:45 +0000625 {
Sean Callanan32a56ec2012-02-17 00:53:45 +0000626 StreamString ss;
627
Sean Callananaa12be42012-02-23 23:43:28 +0000628 reference_address.Dump (&ss,
629 target,
630 Address::DumpStyleResolvedDescriptionNoModule,
631 Address::DumpStyleSectionNameOffset);
Sean Callanan32a56ec2012-02-17 00:53:45 +0000632
Sean Callanan685099b2012-03-22 20:04:23 +0000633 if (!ss.GetString().empty())
Greg Clayton0fef9682012-05-10 02:52:23 +0000634 {
635 //remove_this_prior_to_checkin = ss.GetString();
636 //if (*type_ptr)
637 m_inst->AppendComment(ss.GetString());
638 }
Sean Callanan32a56ec2012-02-17 00:53:45 +0000639 }
Greg Clayton0fef9682012-05-10 02:52:23 +0000640 //printf ("DisassemblerLLVMC::SymbolLookup (value=0x%16.16llx, type=%llu, pc=0x%16.16llx, name=\"%s\") m_exe_ctx=%p, m_inst=%p\n", value, *type_ptr, pc, remove_this_prior_to_checkin.c_str(), m_exe_ctx, m_inst);
Sean Callanan32a56ec2012-02-17 00:53:45 +0000641 }
642 }
Greg Clayton0fef9682012-05-10 02:52:23 +0000643
644 *type_ptr = LLVMDisassembler_ReferenceType_InOut_None;
645 *name = NULL;
646 return NULL;
Sean Callanan32a56ec2012-02-17 00:53:45 +0000647}
648
649//------------------------------------------------------------------
650// PluginInterface protocol
651//------------------------------------------------------------------
652const char *
653DisassemblerLLVMC::GetPluginName()
654{
655 return "DisassemblerLLVMC";
656}
657
658const char *
659DisassemblerLLVMC::GetShortPluginName()
660{
661 return GetPluginNameStatic();
662}
663
664uint32_t
665DisassemblerLLVMC::GetPluginVersion()
666{
667 return 1;
668}
669