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: class Disassembler:
def __init__(self, mcdisasm): def __init__(self, mcdisasm, mri, mai, mii, mia, mip):
self.mcdisasm = mcdisasm self.mcdisasm = mcdisasm
if not self.mcdisasm: if not self.mcdisasm:
raise llvm.LLVMException("null MCDisassembler argument") raise llvm.LLVMException("null MCDisassembler argument")
self.mri = mri
self.mai = mai
self.mii = mii
self.mia = mia
self.mip = mip
def __repr__(self): def __repr__(self):
return repr(self.mcdisasm) return repr(self.mcdisasm)
@staticmethod @staticmethod
def new_from_target(target, subtargetinfo): def new_from_target(target, triple, cpu, features):
return Disassembler(target.createMCDisassembler(subtargetinfo)) 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 @staticmethod
def new_from_triple(triple='', cpu='', features=''): def new_from_triple(triple='', cpu='', features=''):
@ -61,19 +85,14 @@ class Disassembler:
if not target.hasMCDisassembler(): if not target.hasMCDisassembler():
raise llvm.LLVMException(target, "No disassembler provided for %s." % triple) raise llvm.LLVMException(target, "No disassembler provided for %s." % triple)
sti = target.createMCSubtargetInfo(triple, cpu, features) return Disassembler.new_from_target(target, triple, cpu, features)
if not sti:
raise llvm.LLVMException("Could not create sub target info")
return Disassembler.new_from_target(target, sti)
@staticmethod @staticmethod
def new_from_name(name, cpu='', features=''): def new_from_name(name, cpu='', features=''):
name = name.strip() name = name.strip()
for target in api.llvm.TargetRegistry.targetsList(): for target in api.llvm.TargetRegistry.targetsList():
if name == target.getName(): if name == target.getName():
sti = target.createMCSubtargetInfo(name, cpu, features) return Disassembler.new_from_target(target, name, cpu, features)
return Disassembler.new_from_target(target, sti)
raise llvm.LLVMException("failed to find target with name %s" % name) raise llvm.LLVMException("failed to find target with name %s" % name)

View file

@ -9,6 +9,10 @@ MCInst = llvm.Class()
MCOperand = llvm.Class() MCOperand = llvm.Class()
MCExpr = llvm.Class() MCExpr = llvm.Class()
MCAsmInfo = llvm.Class() MCAsmInfo = llvm.Class()
MCRegisterInfo = llvm.Class()
MCInstrInfo = llvm.Class()
MCInstrAnalysis = llvm.Class()
MCInstPrinter = llvm.Class()
@MCSubtargetInfo @MCSubtargetInfo
class MCSubtargetInfo: class MCSubtargetInfo:
@ -49,6 +53,24 @@ class MCInst:
class MCAsmInfo: class MCAsmInfo:
_include_ = "llvm/MC/MCAsmInfo.h" _include_ = "llvm/MC/MCAsmInfo.h"
getAssemblerDialect = Method(cast(Unsigned, int))
@MCRegisterInfo
class MCRegisterInfo:
_include_ = "llvm/MC/MCRegisterInfo.h"
@MCInstrInfo
class MCInstrInfo:
_include_ = "llvm/MC/MCInstrInfo.h"
@MCInstrAnalysis
class MCInstrAnalysis:
_include_ = "llvm/MC/MCInstrAnalysis.h"
@MCInstPrinter
class MCInstPrinter:
_include_ = "llvm/MC/MCInstPrinter.h"
@MCDisassembler @MCDisassembler
class MCDisassembler: class MCDisassembler:
_include_ = "llvm/MC/MCDisassembler.h" _include_ = "llvm/MC/MCDisassembler.h"

View file

@ -15,6 +15,11 @@ from src.Support.CodeGen import Reloc, CodeModel, CodeGenOpt
if LLVM_VERSION >= (3, 4): if LLVM_VERSION >= (3, 4):
from src.MC import MCSubtargetInfo from src.MC import MCSubtargetInfo
from src.MC import MCDisassembler from src.MC import MCDisassembler
from src.MC import MCRegisterInfo
from src.MC import MCAsmInfo
from src.MC import MCInstrInfo
from src.MC import MCInstrAnalysis
from src.MC import MCInstPrinter
@Target @Target
class Target: class Target:
@ -56,7 +61,26 @@ class Target:
createMCDisassembler = Method(ptr(MCDisassembler), ref(MCSubtargetInfo)) createMCDisassembler = Method(ptr(MCDisassembler), ref(MCSubtargetInfo))
createMCRegInfo = Method(ptr(MCRegisterInfo),
cast(str, StringRef) #Triple
)
createMCAsmInfo = Method(ptr(MCAsmInfo),
const(ref(MCRegisterInfo)), #MRI
cast(str, StringRef) #Triple
)
createMCInstrInfo = Method(ptr(MCInstrInfo))
createMCInstrAnalysis = Method(ptr(MCInstrAnalysis), const(ptr(MCInstrInfo)))
createMCInstPrinter = Method(ptr(MCInstPrinter),
cast(int, Unsigned), #SyntaxVariant
const(ref(MCAsmInfo)), #MAI
const(ref(MCInstrInfo)), #MII
const(ref(MCRegisterInfo)), #MRI
const(ref(MCSubtargetInfo)) #STI
)
@TargetRegistry @TargetRegistry
class TargetRegistry: class TargetRegistry:
printRegisteredTargetsForVersion = StaticMethod() printRegisteredTargetsForVersion = StaticMethod()