mirror of
				https://github.com/c64scene-ar/llvm-6502.git
				synced 2025-10-30 16:17:05 +00:00 
			
		
		
		
	git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@78848 91177308-0d34-0410-b5e6-96231b3b80d8
		
			
				
	
	
		
			80 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			80 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| //===- lib/System/Disassembler.cpp ------------------------------*- C++ -*-===//
 | |
| //
 | |
| //                     The LLVM Compiler Infrastructure
 | |
| //
 | |
| // This file is distributed under the University of Illinois Open Source
 | |
| // License. See LICENSE.TXT for details.
 | |
| //
 | |
| //===----------------------------------------------------------------------===//
 | |
| //
 | |
| // This file implements the necessary glue to call external disassembler
 | |
| // libraries.
 | |
| //
 | |
| //===----------------------------------------------------------------------===//
 | |
| 
 | |
| #include "llvm/Config/config.h"
 | |
| #include "llvm/System/Disassembler.h"
 | |
| 
 | |
| #include <cassert>
 | |
| #include <iomanip>
 | |
| #include <string>
 | |
| #include <sstream>
 | |
| 
 | |
| #if USE_UDIS86
 | |
| #include <udis86.h>
 | |
| #endif
 | |
| 
 | |
| using namespace llvm;
 | |
| 
 | |
| bool llvm::sys::hasDisassembler()
 | |
| {
 | |
| #if defined (__i386__) || defined (__amd64__) || defined (__x86_64__)
 | |
|   // We have option to enable udis86 library.
 | |
| # if USE_UDIS86
 | |
|   return true;
 | |
| #else
 | |
|   return false;
 | |
| #endif
 | |
| #else
 | |
|   return false;
 | |
| #endif
 | |
| }
 | |
| 
 | |
| std::string llvm::sys::disassembleBuffer(uint8_t* start, size_t length,
 | |
|                                          uint64_t pc) {
 | |
|   std::stringstream res;
 | |
| 
 | |
| #if defined (__i386__) || defined (__amd64__) || defined (__x86_64__)
 | |
|   unsigned bits;
 | |
| # if defined(__i386__)
 | |
|   bits = 32;
 | |
| # else
 | |
|   bits = 64;
 | |
| # endif
 | |
|   
 | |
| # if USE_UDIS86
 | |
|   ud_t ud_obj;
 | |
|    
 | |
|   ud_init(&ud_obj);
 | |
|   ud_set_input_buffer(&ud_obj, start, length);
 | |
|   ud_set_mode(&ud_obj, bits);
 | |
|   ud_set_pc(&ud_obj, pc);
 | |
|   ud_set_syntax(&ud_obj, UD_SYN_ATT);
 | |
|   
 | |
|   res << std::setbase(16)
 | |
|       << std::setw(bits/4);
 | |
|   
 | |
|   while (ud_disassemble(&ud_obj)) {
 | |
|     res << ud_insn_off(&ud_obj) << ":\t" << ud_insn_asm(&ud_obj) << "\n";
 | |
|   }
 | |
| # else
 | |
|   res << "No disassembler available. See configure help for options.\n";
 | |
| # endif
 | |
|   
 | |
| #else
 | |
|   res << "No disassembler available. See configure help for options.\n";
 | |
| #endif
 | |
| 
 | |
|   return res.str();
 | |
| }
 |