added new MC classes for richer disassembling functionality
This commit is contained in:
parent
78be6a7f5f
commit
4eab936224
3 changed files with 75 additions and 10 deletions
|
|
@ -36,17 +36,41 @@ class BadInstr(Instr):
|
|||
|
||||
class Disassembler:
|
||||
|
||||
def __init__(self, mcdisasm):
|
||||
def __init__(self, mcdisasm, mri, mai, mii, mia, mip):
|
||||
self.mcdisasm = mcdisasm
|
||||
if not self.mcdisasm:
|
||||
raise llvm.LLVMException("null MCDisassembler argument")
|
||||
|
||||
self.mri = mri
|
||||
self.mai = mai
|
||||
self.mii = mii
|
||||
self.mia = mia
|
||||
self.mip = mip
|
||||
|
||||
def __repr__(self):
|
||||
return repr(self.mcdisasm)
|
||||
|
||||
@staticmethod
|
||||
def new_from_target(target, subtargetinfo):
|
||||
return Disassembler(target.createMCDisassembler(subtargetinfo))
|
||||
def new_from_target(target, triple, cpu, features):
|
||||
def raise_on_false(name, obj):
|
||||
if not obj:
|
||||
raise llvm.LLVMException("Could not create %s" % name)
|
||||
|
||||
sti = target.createMCSubtargetInfo(triple, cpu, features)
|
||||
raise_on_false("subtarget info", sti)
|
||||
mri = target.createMCRegInfo(triple)
|
||||
raise_on_false("register info", mri)
|
||||
mai = target.createMCAsmInfo(mri, triple)
|
||||
raise_on_false("asm info", mai)
|
||||
mii = target.createMCInstrInfo()
|
||||
raise_on_false("instr info", mii)
|
||||
mia = target.createMCInstrAnalysis(mii)
|
||||
raise_on_false("instr analysis", mia)
|
||||
mip = target.createMCInstPrinter(mai.getAssemblerDialect(),
|
||||
mai, mii, mri, sti)
|
||||
|
||||
return Disassembler(target.createMCDisassembler(sti),
|
||||
mri, mai, mii, mia, mip)
|
||||
|
||||
@staticmethod
|
||||
def new_from_triple(triple='', cpu='', features=''):
|
||||
|
|
@ -61,19 +85,14 @@ class Disassembler:
|
|||
if not target.hasMCDisassembler():
|
||||
raise llvm.LLVMException(target, "No disassembler provided for %s." % triple)
|
||||
|
||||
sti = target.createMCSubtargetInfo(triple, cpu, features)
|
||||
if not sti:
|
||||
raise llvm.LLVMException("Could not create sub target info")
|
||||
|
||||
return Disassembler.new_from_target(target, sti)
|
||||
return Disassembler.new_from_target(target, triple, cpu, features)
|
||||
|
||||
@staticmethod
|
||||
def new_from_name(name, cpu='', features=''):
|
||||
name = name.strip()
|
||||
for target in api.llvm.TargetRegistry.targetsList():
|
||||
if name == target.getName():
|
||||
sti = target.createMCSubtargetInfo(name, cpu, features)
|
||||
return Disassembler.new_from_target(target, sti)
|
||||
return Disassembler.new_from_target(target, name, cpu, features)
|
||||
|
||||
raise llvm.LLVMException("failed to find target with name %s" % name)
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue