+#include "disassembler/llvm/LLVMDisassembler.hxx"
+
+using namespace llvm;
+using namespace llvm::object;
+
+/*
+ * TODO: fallback code falls die Datei kein ELF/PE/COFF/MacO/.. binary
+ * ist sondern z.B. einfach nur Instruktionen oder ein Bootsektor oder
+ * foo
+ */
+
+LLVMDisassembler::LLVMDisassembler(const std::string& filename)
+ : Disassembler(filename)
+ , logger(log4cxx::Logger::getLogger("LLVMDisassembler"))
+ , triple("unknown-unknown-unknown")
+{
+ LOG4CXX_DEBUG(logger, "Handling file" << filename);
+ auto result = createBinary(filename);
+
+ error_code ec;
+ if ((ec = result.getError())) {
+ LOG4CXX_ERROR(logger, "Failed to load Binary" << ec.message());
+ binary = NULL;
+ return;
+ }
+
+ binary.reset(result.get());
+
+ o = dyn_cast<ObjectFile>(binary.get());
+
+ triple.setArch(Triple::ArchType(o->getArch()));
+ std::string tripleName(triple.getTriple());
+
+ LOG4CXX_INFO(logger, "Architecture " << tripleName);
+
+
+ std::string es;
+ target = TargetRegistry::lookupTarget("", triple, es);
+ if (!target) {
+ LOG4CXX_ERROR(logger, es);
+ return;
+ }
+
+ LOG4CXX_INFO(logger, "Target " << target->getName());
+
+ MRI.reset(target->createMCRegInfo(tripleName));
+ if (!MRI) {
+ LOG4CXX_ERROR(logger, "no register info for target " << tripleName);
+ return;
+ }
+
+ // Set up disassembler.
+ AsmInfo.reset(target->createMCAsmInfo(*MRI, tripleName));
+ if (!AsmInfo) {
+ LOG4CXX_ERROR(logger, "no assembly info for target " << tripleName);
+ return;
+ }
+
+ STI.reset(target->createMCSubtargetInfo(tripleName, "", ""));
+ if (!STI) {
+ LOG4CXX_ERROR(logger, "no subtarget info for target " << tripleName);
+ return;
+ }
+
+ MII.reset(target->createMCInstrInfo());
+ if (!MII) {
+ LOG4CXX_ERROR(logger, "no instruction info for target " << tripleName);
+ return;
+ }
+
+ DisAsm.reset(target->createMCDisassembler(*STI));
+ if (!DisAsm) {
+ LOG4CXX_ERROR(logger, "no disassembler for target " << tripleName);
+ return;
+ }
+
+ MOFI.reset(new MCObjectFileInfo);
+ Ctx.reset(new MCContext(AsmInfo.get(), MRI.get(), MOFI.get()));
+ RelInfo.reset(
+ target->createMCRelocationInfo(tripleName, *Ctx.get()));
+ if (RelInfo) {
+ Symzer.reset(
+ MCObjectSymbolizer::createObjectSymbolizer(*Ctx.get(), RelInfo, o));
+ if (Symzer)
+ DisAsm->setSymbolizer(Symzer);
+ }
+
+ MIA.reset(target->createMCInstrAnalysis(MII.get()));
+
+ int AsmPrinterVariant = AsmInfo->getAssemblerDialect();
+ IP.reset(target->createMCInstPrinter(AsmPrinterVariant, *AsmInfo, *MII, *MRI, *STI));
+ if (!IP) {
+ LOG4CXX_ERROR(logger, "no instruction printer for target " << tripleName);
+ return;
+ }
+
+ OwningPtr<MCObjectDisassembler> OD(
+ new MCObjectDisassembler(*o, *DisAsm, *MIA));
+ Mod.reset(OD->buildModule(false));
+}