added new MC classes for richer disassembling functionality

This commit is contained in:
anthony cantor 2013-08-16 18:43:09 -06:00 • committed by Siu Kwan Lam
commit 4eab936224
3 changed files with 75 additions and 10 deletions

View file

@ -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)