From: Christoph Egger Date: Tue, 6 Jan 2015 21:26:57 +0000 (+0100) Subject: Whitespace cleanup X-Git-Tag: v0.1~144 X-Git-Url: https://git.siccegge.de//index.cgi?a=commitdiff_plain;h=9e283567ac56a6433e832d0fa38cf534a0cb8f9f;p=frida%2Ffrida.git Whitespace cleanup --- diff --git a/src/disassembler/BasicBlock.hxx b/src/disassembler/BasicBlock.hxx index 1952f2b..6d623d0 100644 --- a/src/disassembler/BasicBlock.hxx +++ b/src/disassembler/BasicBlock.hxx @@ -5,18 +5,18 @@ class BasicBlock { public: - BasicBlock() { + BasicBlock() { next_blocks[0] = 0; next_blocks[1] = 0; } - uint64_t getStartAddress() const { - return start_address; - } + uint64_t getStartAddress() const { + return start_address; + } - uint64_t getEndAddress() const { - return end_address; - } + uint64_t getEndAddress() const { + return end_address; + } uint64_t getNextBlock(size_t index) const { assert(index < 2); @@ -37,10 +37,10 @@ public: } private: - uint64_t start_address; - uint64_t end_address; + uint64_t start_address; + uint64_t end_address; - uint64_t next_blocks[2]; + uint64_t next_blocks[2]; }; #endif diff --git a/src/disassembler/Disassembler.hxx b/src/disassembler/Disassembler.hxx index c88bfd5..4636ed9 100644 --- a/src/disassembler/Disassembler.hxx +++ b/src/disassembler/Disassembler.hxx @@ -1,4 +1,4 @@ - #ifndef INCLUDE__Disassembler_hxx +#ifndef INCLUDE__Disassembler_hxx #define INCLUDE__Disassembler_hxx #include @@ -11,7 +11,7 @@ class Disassembler { public: Disassembler(const std::string& filename, InformationManager* manager) {} - virtual ~Disassembler() {} + virtual ~Disassembler() {} virtual void start() = 0; virtual void getSymbols() = 0; @@ -20,10 +20,10 @@ public: virtual void forEachFunction(std::function callback) = 0; virtual void printEachInstruction(uint64_t start, uint64_t end, - std::function fun) = 0; + std::function fun) = 0; protected: - virtual bool isFunctionCall(uint64_t address) = 0; - virtual bool isJump(uint64_t address) = 0; + virtual bool isFunctionCall(uint64_t address) = 0; + virtual bool isJump(uint64_t address) = 0; }; #endif diff --git a/src/disassembler/llvm/LLVMDisassembler.cxx b/src/disassembler/llvm/LLVMDisassembler.cxx index 7f87b80..79c7a54 100644 --- a/src/disassembler/llvm/LLVMDisassembler.cxx +++ b/src/disassembler/llvm/LLVMDisassembler.cxx @@ -17,387 +17,387 @@ using std::error_code; LLVMDisassembler::LLVMDisassembler(const std::string& filename, InformationManager* manager) : Disassembler(filename, manager) - , logger(log4cxx::Logger::getLogger("LLVMDisassembler")) - , triple("unknown-unknown-unknown") - , manager(manager) + , logger(log4cxx::Logger::getLogger("LLVMDisassembler")) + , triple("unknown-unknown-unknown") + , manager(manager) { - 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(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; - } - - MOFI.reset(new MCObjectFileInfo); - MCContext Ctx(AsmInfo.get(), MRI.get(), MOFI.get()); - - DisAsm.reset(target->createMCDisassembler(*STI, Ctx)); - if (!DisAsm) { - LOG4CXX_ERROR(logger, "no disassembler for target " << tripleName); - return; - } - RelInfo.reset( - target->createMCRelocationInfo(tripleName, Ctx)); - if (RelInfo) { - Symzer.reset( - MCObjectSymbolizer::createObjectSymbolizer(Ctx, std::move(RelInfo), o)); - if (Symzer) - DisAsm->setSymbolizer(std::move(Symzer)); - } - RelInfo.release(); - Symzer.release(); - - MIA.reset(target->createMCInstrAnalysis(MII.get())); - if (!MIA) { - LOG4CXX_ERROR(logger, "no instruction analysis for target " << tripleName); - return; - } - - 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; - } - - IP->setPrintImmHex(llvm::HexStyle::C); - IP->setPrintImmHex(true); - - std::unique_ptr OD( - new MCObjectDisassembler(*o, *DisAsm, *MIA)); - Mod.reset(OD->buildModule(false)); + 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(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; + } + + MOFI.reset(new MCObjectFileInfo); + MCContext Ctx(AsmInfo.get(), MRI.get(), MOFI.get()); + + DisAsm.reset(target->createMCDisassembler(*STI, Ctx)); + if (!DisAsm) { + LOG4CXX_ERROR(logger, "no disassembler for target " << tripleName); + return; + } + RelInfo.reset( + target->createMCRelocationInfo(tripleName, Ctx)); + if (RelInfo) { + Symzer.reset( + MCObjectSymbolizer::createObjectSymbolizer(Ctx, std::move(RelInfo), o)); + if (Symzer) + DisAsm->setSymbolizer(std::move(Symzer)); + } + RelInfo.release(); + Symzer.release(); + + MIA.reset(target->createMCInstrAnalysis(MII.get())); + if (!MIA) { + LOG4CXX_ERROR(logger, "no instruction analysis for target " << tripleName); + return; + } + + 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; + } + + IP->setPrintImmHex(llvm::HexStyle::C); + IP->setPrintImmHex(true); + + std::unique_ptr OD( + new MCObjectDisassembler(*o, *DisAsm, *MIA)); + Mod.reset(OD->buildModule(false)); } void LLVMDisassembler::start() { - readSymbols(); - readSections(); - disassemble(); + readSymbols(); + readSections(); + disassemble(); } LLVMDisassembler::~LLVMDisassembler() { - std::for_each(functions.begin(), functions.end(), - [](std::pair it) { - delete it.second; - }); - std::for_each(blocks.begin(), blocks.end(), - [](std::pair it) { - delete it.second; - }); + std::for_each(functions.begin(), functions.end(), + [](std::pair it) { + delete it.second; + }); + std::for_each(blocks.begin(), blocks.end(), + [](std::pair it) { + delete it.second; + }); } Function* LLVMDisassembler::disassembleFunctionAt(uint64_t address, const std::string& name) { - SectionRef text_section = sections[".text"]; + SectionRef text_section = sections[".text"]; uint64_t base_address, size; text_section.getAddress(base_address); text_section.getSize(size); if (address < base_address || - address >= base_address + size) { + address >= base_address + size) { return NULL; } - if (functions.find(address) != functions.end()) { - return functions[address]; - } + if (functions.find(address) != functions.end()) { + return functions[address]; + } - LLVMFunction * function; - if (name == "") { - std::stringstream s; - s << ""; - function = new LLVMFunction(s.str(), address); - } else { - function = new LLVMFunction(name, address); - } - functions.insert(std::make_pair(address, function)); + LLVMFunction * function; + if (name == "") { + std::stringstream s; + s << ""; + function = new LLVMFunction(s.str(), address); + } else { + function = new LLVMFunction(name, address); + } + functions.insert(std::make_pair(address, function)); - disassembleFunction(function); + disassembleFunction(function); - return function; + return function; } void LLVMDisassembler::disassembleFunction(LLVMFunction* function) { - std::stack remaining_blocks; - SectionRef text_section = sections[".text"]; - StringRef bytes; - text_section.getContents(bytes); - StringRefMemoryObject ref(bytes); - - LOG4CXX_DEBUG(logger, "Handling function " << function->getName()); - - LLVMBasicBlock * block = new LLVMBasicBlock(function->getStartAddress(), this); - remaining_blocks.push(block); - blocks.insert(std::make_pair(block->getStartAddress(), block)); - - while (remaining_blocks.size()) { - LLVMBasicBlock * current_block = remaining_blocks.top(); - remaining_blocks.pop(); - - LOG4CXX_DEBUG(logger, "Handling Block starting at " << std::hex << current_block->getStartAddress()); - - uint64_t inst_size; - uint64_t base_address; - text_section.getAddress(base_address); - uint64_t current_address = current_block->getStartAddress() - base_address; - while(true) { - MCInst inst; - std::string buf; - llvm::raw_string_ostream s(buf); - - if(llvm::MCDisassembler::Success == - DisAsm->getInstruction(inst, inst_size, ref, current_address, nulls(), nulls())) { - uint64_t jmptarget; - - if (MIA->evaluateBranch(inst, current_address, inst_size, jmptarget)) { - jmptarget += base_address; - if (!MIA->isIndirectBranch(inst)) { - if (MIA->isCall(inst)) { - if (functions.find(jmptarget) == functions.end()) { - disassembleFunctionAt(jmptarget); - } - } else { - current_block->setNextBlock(0, jmptarget); - if (blocks.find(jmptarget) == blocks.end()) { - LLVMBasicBlock * block = new LLVMBasicBlock(jmptarget, this); - blocks.insert(std::make_pair(block->getStartAddress(), block)); - remaining_blocks.push(block); - } - if (MIA->isConditionalBranch(inst)) { - jmptarget = base_address + current_address + inst_size; - current_block->setNextBlock(1, jmptarget); - if (blocks.find(jmptarget) == blocks.end()) { - LLVMBasicBlock * block = new LLVMBasicBlock(jmptarget, this); - blocks.insert(std::make_pair(block->getStartAddress(), block)); - remaining_blocks.push(block); - } - } - } - } - } - } else { - inst_size = 0; - } - - - if (inst_size == 0 || MIA->isTerminator(inst) || MIA->isBranch(inst)) { - current_block->setEndAddress(current_address + base_address + inst_size); - LOG4CXX_DEBUG(logger, "Finished Block at " << std::hex << - current_block->getEndAddress()); - break; - } - current_address += inst_size; - } - } - LOG4CXX_DEBUG(logger, "Finished function " << function->getName()); - manager->signal_new_function(function); + std::stack remaining_blocks; + SectionRef text_section = sections[".text"]; + StringRef bytes; + text_section.getContents(bytes); + StringRefMemoryObject ref(bytes); + + LOG4CXX_DEBUG(logger, "Handling function " << function->getName()); + + LLVMBasicBlock * block = new LLVMBasicBlock(function->getStartAddress(), this); + remaining_blocks.push(block); + blocks.insert(std::make_pair(block->getStartAddress(), block)); + + while (remaining_blocks.size()) { + LLVMBasicBlock * current_block = remaining_blocks.top(); + remaining_blocks.pop(); + + LOG4CXX_DEBUG(logger, "Handling Block starting at " << std::hex << current_block->getStartAddress()); + + uint64_t inst_size; + uint64_t base_address; + text_section.getAddress(base_address); + uint64_t current_address = current_block->getStartAddress() - base_address; + while(true) { + MCInst inst; + std::string buf; + llvm::raw_string_ostream s(buf); + + if(llvm::MCDisassembler::Success == + DisAsm->getInstruction(inst, inst_size, ref, current_address, nulls(), nulls())) { + uint64_t jmptarget; + + if (MIA->evaluateBranch(inst, current_address, inst_size, jmptarget)) { + jmptarget += base_address; + if (!MIA->isIndirectBranch(inst)) { + if (MIA->isCall(inst)) { + if (functions.find(jmptarget) == functions.end()) { + disassembleFunctionAt(jmptarget); + } + } else { + current_block->setNextBlock(0, jmptarget); + if (blocks.find(jmptarget) == blocks.end()) { + LLVMBasicBlock * block = new LLVMBasicBlock(jmptarget, this); + blocks.insert(std::make_pair(block->getStartAddress(), block)); + remaining_blocks.push(block); + } + if (MIA->isConditionalBranch(inst)) { + jmptarget = base_address + current_address + inst_size; + current_block->setNextBlock(1, jmptarget); + if (blocks.find(jmptarget) == blocks.end()) { + LLVMBasicBlock * block = new LLVMBasicBlock(jmptarget, this); + blocks.insert(std::make_pair(block->getStartAddress(), block)); + remaining_blocks.push(block); + } + } + } + } + } + } else { + inst_size = 0; + } + + + if (inst_size == 0 || MIA->isTerminator(inst) || MIA->isBranch(inst)) { + current_block->setEndAddress(current_address + base_address + inst_size); + LOG4CXX_DEBUG(logger, "Finished Block at " << std::hex << + current_block->getEndAddress()); + break; + } + current_address += inst_size; + } + } + LOG4CXX_DEBUG(logger, "Finished function " << function->getName()); + manager->signal_new_function(function); } void LLVMDisassembler::disassemble() { - SectionRef text_section = sections[".text"]; - std::vector remaining_functions; - - // Assume all function symbols actually start a real function - for (auto x = symbols.begin(); x != symbols.end(); ++x) { - uint64_t result; - bool contains; - SymbolRef::Type symbol_type; - - - if (text_section.containsSymbol(x->second, contains) || !contains) - continue; - - if (x->second.getType(symbol_type) - || SymbolRef::ST_Function != symbol_type) - continue; - - if (!x->second.getAddress(result)) { - LLVMFunction * fun = new LLVMFunction(x->first, result); - remaining_functions.push_back(fun); - functions.insert(std::make_pair(result, fun)); - LOG4CXX_DEBUG(logger, "Disasembling " << x->first); - } - } - - for (LLVMFunction* function : remaining_functions) { - disassembleFunction(function); - } - - if (binary->isELF()) { - bool is64bit = (binary->getData()[4] == 0x02); - - uint64_t entry(0); - for (int i(0); i < (is64bit? 8 : 4); ++i) { - if (binary->isLittleEndian()) { - entry |= (unsigned int)((unsigned char)binary->getData()[0x18 + i]) << 8*i; - } else { - entry = entry << 8; - entry |= (unsigned char)binary->getData()[0x18 + i]; - } - } - LOG4CXX_DEBUG(logger, "Adding entry at: " << std::hex << entry); - std::stringstream s; - s << "<_start 0x" << std::hex << entry << ">"; - - disassembleFunctionAt(entry, s.str()); - } - - if (functions.empty()) { - uint64_t text_entry; - text_section.getAddress(text_entry); - LOG4CXX_INFO(logger, "No Symbols found, starting at the beginning of the text segment"); - disassembleFunctionAt(text_entry); - } - - splitBlocks(); + SectionRef text_section = sections[".text"]; + std::vector remaining_functions; + + // Assume all function symbols actually start a real function + for (auto x = symbols.begin(); x != symbols.end(); ++x) { + uint64_t result; + bool contains; + SymbolRef::Type symbol_type; + + + if (text_section.containsSymbol(x->second, contains) || !contains) + continue; + + if (x->second.getType(symbol_type) + || SymbolRef::ST_Function != symbol_type) + continue; + + if (!x->second.getAddress(result)) { + LLVMFunction * fun = new LLVMFunction(x->first, result); + remaining_functions.push_back(fun); + functions.insert(std::make_pair(result, fun)); + LOG4CXX_DEBUG(logger, "Disasembling " << x->first); + } + } + + for (LLVMFunction* function : remaining_functions) { + disassembleFunction(function); + } + + if (binary->isELF()) { + bool is64bit = (binary->getData()[4] == 0x02); + + uint64_t entry(0); + for (int i(0); i < (is64bit? 8 : 4); ++i) { + if (binary->isLittleEndian()) { + entry |= (unsigned int)((unsigned char)binary->getData()[0x18 + i]) << 8*i; + } else { + entry = entry << 8; + entry |= (unsigned char)binary->getData()[0x18 + i]; + } + } + LOG4CXX_DEBUG(logger, "Adding entry at: " << std::hex << entry); + std::stringstream s; + s << "<_start 0x" << std::hex << entry << ">"; + + disassembleFunctionAt(entry, s.str()); + } + + if (functions.empty()) { + uint64_t text_entry; + text_section.getAddress(text_entry); + LOG4CXX_INFO(logger, "No Symbols found, starting at the beginning of the text segment"); + disassembleFunctionAt(text_entry); + } + + splitBlocks(); } void LLVMDisassembler::splitBlocks() { - SectionRef text_section = sections[".text"]; - StringRef bytes; - text_section.getContents(bytes); - StringRefMemoryObject ref(bytes); - - // Split blocks where jumps are going inside the block - for (auto it = blocks.begin(); it != blocks.end(); ++it) { - LLVMBasicBlock * current_block = it->second; - uint64_t inst_size; - uint64_t base_address; - text_section.getAddress(base_address); - uint64_t current_address = current_block->getStartAddress() - base_address; - while(current_block->getEndAddress() - base_address > current_address) { - MCInst inst; - std::string buf; - llvm::raw_string_ostream s(buf); - - if(llvm::MCDisassembler::Success == - DisAsm->getInstruction(inst, inst_size, ref, current_address, nulls(), nulls())) { - auto other = blocks.find(current_address + inst_size + base_address); - - if (other != blocks.end()) { - uint64_t endaddress = current_address + inst_size + base_address; - if (endaddress != current_block->getEndAddress()) { - LOG4CXX_DEBUG(logger, "Shortening block starting at " - << std::hex - << current_block->getStartAddress() - << " now ending at " - << other->first); - current_block->setEndAddress(endaddress); - current_block->setNextBlock(0, other->first); - current_block->setNextBlock(1, 0); - } - } - } else { - inst_size = 1; - } - current_address += inst_size; - } - } + SectionRef text_section = sections[".text"]; + StringRef bytes; + text_section.getContents(bytes); + StringRefMemoryObject ref(bytes); + + // Split blocks where jumps are going inside the block + for (auto it = blocks.begin(); it != blocks.end(); ++it) { + LLVMBasicBlock * current_block = it->second; + uint64_t inst_size; + uint64_t base_address; + text_section.getAddress(base_address); + uint64_t current_address = current_block->getStartAddress() - base_address; + while(current_block->getEndAddress() - base_address > current_address) { + MCInst inst; + std::string buf; + llvm::raw_string_ostream s(buf); + + if(llvm::MCDisassembler::Success == + DisAsm->getInstruction(inst, inst_size, ref, current_address, nulls(), nulls())) { + auto other = blocks.find(current_address + inst_size + base_address); + + if (other != blocks.end()) { + uint64_t endaddress = current_address + inst_size + base_address; + if (endaddress != current_block->getEndAddress()) { + LOG4CXX_DEBUG(logger, "Shortening block starting at " + << std::hex + << current_block->getStartAddress() + << " now ending at " + << other->first); + current_block->setEndAddress(endaddress); + current_block->setNextBlock(0, other->first); + current_block->setNextBlock(1, 0); + } + } + } else { + inst_size = 1; + } + current_address += inst_size; + } + } } void LLVMDisassembler::readSymbols() { - error_code ec; - symbol_iterator si(o->symbol_begin()), se(o->symbol_end()); - for (; si != se; ++si) { - StringRef name; - if ((ec = si->getName(name))) { - LOG4CXX_ERROR(logger, ec.message()); - break; - } - LOG4CXX_DEBUG(logger, "Added symbol " << name.str()); - symbols.insert(make_pair(name.str(), *si)); - } + error_code ec; + symbol_iterator si(o->symbol_begin()), se(o->symbol_end()); + for (; si != se; ++si) { + StringRef name; + if ((ec = si->getName(name))) { + LOG4CXX_ERROR(logger, ec.message()); + break; + } + LOG4CXX_DEBUG(logger, "Added symbol " << name.str()); + symbols.insert(make_pair(name.str(), *si)); + } } void LLVMDisassembler::readSections() { - error_code ec; - section_iterator i(o->section_begin()), e(o->section_end()); - for (; i != e; ++i) { - StringRef name; - if ((ec = i->getName(name))) { - LOG4CXX_ERROR(logger, ec.message()); - break; - } - LOG4CXX_DEBUG(logger, "Added section " << name.str()); - sections.insert(make_pair(name.str(), *i)); - } + error_code ec; + section_iterator i(o->section_begin()), e(o->section_end()); + for (; i != e; ++i) { + StringRef name; + if ((ec = i->getName(name))) { + LOG4CXX_ERROR(logger, ec.message()); + break; + } + LOG4CXX_DEBUG(logger, "Added section " << name.str()); + sections.insert(make_pair(name.str(), *i)); + } } void LLVMDisassembler::forEachFunction(std::function callback) { - std::for_each(functions.begin(), functions.end(), - [&](std::pair x) { - callback(x.first, x.second); - }); + std::for_each(functions.begin(), functions.end(), + [&](std::pair x) { + callback(x.first, x.second); + }); } void LLVMDisassembler::printEachInstruction(uint64_t start, uint64_t end, - std::function fun) { - SectionRef text_section = sections[".text"]; - uint64_t base_address; - text_section.getAddress(base_address); - uint64_t current_address = start - base_address; - - StringRef bytes; - text_section.getContents(bytes); - StringRefMemoryObject ref(bytes); - - while (current_address < end - base_address) { - uint64_t inst_size; - MCInst inst; + std::function fun) { + SectionRef text_section = sections[".text"]; + uint64_t base_address; + text_section.getAddress(base_address); + uint64_t current_address = start - base_address; + + StringRef bytes; + text_section.getContents(bytes); + StringRefMemoryObject ref(bytes); + + while (current_address < end - base_address) { + uint64_t inst_size; + MCInst inst; std::string buf; llvm::raw_string_ostream s(buf); - if(llvm::MCDisassembler::Success == - DisAsm->getInstruction(inst, inst_size, ref, current_address, nulls(), nulls())) { + if(llvm::MCDisassembler::Success == + DisAsm->getInstruction(inst, inst_size, ref, current_address, nulls(), nulls())) { - uint8_t bytes[inst_size+2]; - ref.readBytes(current_address, inst_size, bytes); + uint8_t bytes[inst_size+2]; + ref.readBytes(current_address, inst_size, bytes); uint64_t jmptarget; if (MIA->evaluateBranch(inst, current_address, inst_size, jmptarget)) { @@ -408,12 +408,12 @@ void LLVMDisassembler::printEachInstruction(uint64_t start, uint64_t end, IP->printInst(&inst, s, ""); fun(bytes, inst_size, s.str()); - } else { + } else { LOG4CXX_WARN(logger, "Invalid byte at" << std::hex << current_address + base_address); fun(NULL, 0, "Invalid Byte"); inst_size = 1; } current_address += inst_size; - } + } } diff --git a/src/disassembler/llvm/LLVMDisassembler.hxx b/src/disassembler/llvm/LLVMDisassembler.hxx index d26bb12..107767d 100644 --- a/src/disassembler/llvm/LLVMDisassembler.hxx +++ b/src/disassembler/llvm/LLVMDisassembler.hxx @@ -26,7 +26,7 @@ public: void forEachFunction(std::function callback); void printEachInstruction(uint64_t start, uint64_t end, - std::function fun); + std::function fun); BasicBlock * getBasicBlock(uint64_t address) { return blocks[address]; diff --git a/src/gui/Mainwindow.cxx b/src/gui/Mainwindow.cxx index 7b207fa..5fd57aa 100644 --- a/src/gui/Mainwindow.cxx +++ b/src/gui/Mainwindow.cxx @@ -126,9 +126,9 @@ namespace { widget->moveBy(100*startx, block->getStartAddress() - starty); dis->printEachInstruction(block->getStartAddress(), block->getEndAddress(), - [&](uint8_t* bytes, size_t byte_count, const std::string& line) { - widget->addItem(bytes, byte_count, line.c_str() + 1); - }); + [&](uint8_t* bytes, size_t byte_count, const std::string& line) { + widget->addItem(bytes, byte_count, line.c_str() + 1); + }); BasicBlockWidget *tmp, *nextl(NULL), *nextr(NULL); BasicBlock * tmpblock; @@ -138,16 +138,16 @@ namespace { xshift = 1; tmpblock = dis->getBasicBlock(block->getNextBlock(0)); tmp = local__add_basic_block(tmpblock, dis, - known_blocks, - scene, starty, startx+xshift); + known_blocks, + scene, starty, startx+xshift); nextl = tmp; tmp->addPrevious(widget); } if (block->getNextBlock(1) != 0) { tmpblock = dis->getBasicBlock(block->getNextBlock(1)); tmp = local__add_basic_block(tmpblock, dis, - known_blocks, - scene, starty, startx-1); + known_blocks, + scene, starty, startx-1); nextr = tmp; tmp->addPrevious(widget); } diff --git a/src/gui/widgets/BasicBlockWidget.cxx b/src/gui/widgets/BasicBlockWidget.cxx index faaa2a6..ab06f88 100644 --- a/src/gui/widgets/BasicBlockWidget.cxx +++ b/src/gui/widgets/BasicBlockWidget.cxx @@ -4,21 +4,21 @@ BasicBlockWidget::BasicBlockWidget(const QString& name, BasicBlock * block) : width(270), height(45) , name(name), block(block) { next[0] = NULL; next[1] = NULL; - _widget.move(5, 20); + _widget.move(5, 20); - if (width < 270) width = 270; + if (width < 270) width = 270; } void BasicBlockWidget::addItem(uint8_t* bytes, size_t num_bytes, const QString& line) { - QString bytestring; + QString bytestring; - for (size_t i(0); i < num_bytes; ++i) { - const char * hexdigits = "0123456789ABCDEF"; - bytestring += hexdigits[(bytes[i] >> 4) & 0xF]; - bytestring += hexdigits[bytes[i] & 0xF]; - bytestring += ' '; - } + for (size_t i(0); i < num_bytes; ++i) { + const char * hexdigits = "0123456789ABCDEF"; + bytestring += hexdigits[(bytes[i] >> 4) & 0xF]; + bytestring += hexdigits[bytes[i] & 0xF]; + bytestring += ' '; + } QString old_text = _widget.text(); if (old_text == "") { @@ -35,5 +35,5 @@ void BasicBlockWidget::addItem(uint8_t* bytes, size_t num_bytes, width = 12 + _widget.sizeHint().width(); height = 25 + _widget.sizeHint().height(); - if (width < 250) width = 250; + if (width < 250) width = 250; } diff --git a/src/gui/widgets/BasicBlockWidget.hxx b/src/gui/widgets/BasicBlockWidget.hxx index e40ed84..2dcc80c 100644 --- a/src/gui/widgets/BasicBlockWidget.hxx +++ b/src/gui/widgets/BasicBlockWidget.hxx @@ -11,41 +11,41 @@ class BasicBlockWidget : public QGraphicsItem { public: - BasicBlockWidget(const QString& name, BasicBlock * block); + BasicBlockWidget(const QString& name, BasicBlock * block); void addItem(uint8_t* bytes, size_t num_bytes, const QString& line); - QRectF boundingRect() const { - qreal penWidth = 1; + QRectF boundingRect() const { + qreal penWidth = 1; QRectF result(- penWidth / 2, - penWidth / 2, - width + penWidth, height + penWidth); - return result; - } + width + penWidth, height + penWidth); + return result; + } void mouseMoveEvent(QGraphicsSceneMouseEvent * event) { QGraphicsItem::mouseMoveEvent(event); - scene()->update(); + scene()->update(); } QPointF getEntry() const { return mapToScene(QPointF(width/2, 0)); } - std::array getExits() const { - return { { mapToScene(QPointF( width/3, height)), + std::array getExits() const { + return { { mapToScene(QPointF( width/3, height)), mapToScene(QPointF( width/2, height)), mapToScene(QPointF(2*width/3, height)) } }; - } + } - void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, - QWidget *widget) { - painter->fillRect(0, 0, width, height, QColor(0xcc, 0xcc, 0xff, 0xff)); - painter->setPen(QColor(0x00, 0x00, 0xff, 0xff)); - painter->drawRect(0, 0, width, height); - painter->drawText(5, 15, name); + void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, + QWidget *widget) { + painter->fillRect(0, 0, width, height, QColor(0xcc, 0xcc, 0xff, 0xff)); + painter->setPen(QColor(0x00, 0x00, 0xff, 0xff)); + painter->drawRect(0, 0, width, height); + painter->drawText(5, 15, name); if (_widget.text() != "") _widget.render(painter, QPoint(5, 20)); - } + } void addPrevious(BasicBlockWidget * widget) { previous.push_back(widget); @@ -56,13 +56,13 @@ public: next[1] = right; } - BasicBlockWidget ** getNext() { - return next; - } + BasicBlockWidget ** getNext() { + return next; + } private: - uint32_t width, height; - QLabel _widget; + uint32_t width, height; + QLabel _widget; QString name; BasicBlock * block; std::vector previous; diff --git a/src/gui/widgets/CFGScene.cxx b/src/gui/widgets/CFGScene.cxx index 75a39f0..ec33463 100644 --- a/src/gui/widgets/CFGScene.cxx +++ b/src/gui/widgets/CFGScene.cxx @@ -1,44 +1,44 @@ #include "CFGScene.hxx" void CFGScene::drawBackground(QPainter* painter, const QRectF & rect) { - QGraphicsScene::drawBackground(painter, rect); + QGraphicsScene::drawBackground(painter, rect); - spaceWidgets(); + spaceWidgets(); - for (BasicBlockWidget * widget : widgets) { + for (BasicBlockWidget * widget : widgets) { QPointF kopf = widget->getEntry(); - painter->setPen(QColor(0x00, 0xff, 0x00, 0xff)); - painter->drawLine(kopf, kopf - QPointF(0, 20)); + painter->setPen(QColor(0x00, 0xff, 0x00, 0xff)); + painter->drawLine(kopf, kopf - QPointF(0, 20)); - auto tails = widget->getExits(); - auto next = widget->getNext(); - if (NULL != next[0]) { - if (NULL != next[1]) { - painter->setPen(QColor(0xff, 0x00, 0x00, 0xff)); - painter->drawLine(std::get<0>(tails), std::get<0>(tails) + QPointF(0, 20)); - drawLine(painter, widget, next[1], -1); + auto tails = widget->getExits(); + auto next = widget->getNext(); + if (NULL != next[0]) { + if (NULL != next[1]) { + painter->setPen(QColor(0xff, 0x00, 0x00, 0xff)); + painter->drawLine(std::get<0>(tails), std::get<0>(tails) + QPointF(0, 20)); + drawLine(painter, widget, next[1], -1); - painter->setPen(QColor(0x00, 0xff, 0x00, 0xff)); - painter->drawLine(std::get<2>(tails), std::get<2>(tails) + QPointF(0, 20)); - drawLine(painter, widget, next[0], 1); - } else { - painter->setPen(QColor(0x00, 0x00, 0x00, 0xff)); - painter->drawLine(std::get<1>(tails), std::get<1>(tails) + QPointF(0, 20)); - drawLine(painter, widget, next[0], 0); - } - } - } + painter->setPen(QColor(0x00, 0xff, 0x00, 0xff)); + painter->drawLine(std::get<2>(tails), std::get<2>(tails) + QPointF(0, 20)); + drawLine(painter, widget, next[0], 1); + } else { + painter->setPen(QColor(0x00, 0x00, 0x00, 0xff)); + painter->drawLine(std::get<1>(tails), std::get<1>(tails) + QPointF(0, 20)); + drawLine(painter, widget, next[0], 0); + } + } + } } void CFGScene::drawLine(QPainter* painter, BasicBlockWidget * from, BasicBlockWidget * to, int8_t side) { QPointF from_p = from->getExits()[side+1] + QPointF(0, 20); QPointF to_p = to->getEntry() - QPointF(0, 20); - if ((to_p - from_p).y() > 0) { + if ((to_p - from_p).y() > 0) { /* Forward Edge */ - QPointF angle1(from_p + QPointF(0, (to_p - from_p).y())); - painter->drawLine(from_p, angle1); - painter->drawLine(angle1, to_p); - } else { + QPointF angle1(from_p + QPointF(0, (to_p - from_p).y())); + painter->drawLine(from_p, angle1); + painter->drawLine(angle1, to_p); + } else { /* Backward Edge */ QRectF from_r(from->boundingRect()), to_r(to->boundingRect()); from_r.moveTo(from->scenePos()); @@ -65,45 +65,45 @@ void CFGScene::drawLine(QPainter* painter, BasicBlockWidget * from, BasicBlockWi } void CFGScene::spaceWidgets() { - bool changed = false; - do { - changed = false; - for (BasicBlockWidget * widget : widgets) { - QPointF out(std::get<0>(widget->getExits())); - BasicBlockWidget ** next = widget->getNext(); + bool changed = false; + do { + changed = false; + for (BasicBlockWidget * widget : widgets) { + QPointF out(std::get<0>(widget->getExits())); + BasicBlockWidget ** next = widget->getNext(); - if (NULL != next[0] - && (next[0]->getEntry() - widget->getEntry()).y() > 0 - && (next[0]->getEntry() - out).y() < 50) { - next[0]->moveBy(0, 1); - changed = true; - } - if (NULL != next[1] - && (next[1]->getEntry() - widget->getEntry()).y() > 0 - && (next[1]->getEntry() - out).y() < 50) { - next[1]->moveBy(0, 1); - changed = true; - } - } - } while (changed); + if (NULL != next[0] + && (next[0]->getEntry() - widget->getEntry()).y() > 0 + && (next[0]->getEntry() - out).y() < 50) { + next[0]->moveBy(0, 1); + changed = true; + } + if (NULL != next[1] + && (next[1]->getEntry() - widget->getEntry()).y() > 0 + && (next[1]->getEntry() - out).y() < 50) { + next[1]->moveBy(0, 1); + changed = true; + } + } + } while (changed); - for (BasicBlockWidget * widget : widgets) { - QRectF relevantRect = widget->boundingRect(); - relevantRect.moveTo(widget->scenePos()); - relevantRect.adjust(-20, -20, 20, 20); - for (QGraphicsItem * item : items(relevantRect)) { - if (item == widget) continue; - QRectF itemrect = item->boundingRect(); - itemrect.moveTo(item->scenePos()); - while (relevantRect.intersects(itemrect)) { - if (widget->scenePos().x() > item->scenePos().x()) { - widget->moveBy(1, 0); - relevantRect.moveTo(widget->scenePos()); - } else { - item->moveBy(1, 0); - itemrect.moveTo(item->scenePos()); - } - } - } - } + for (BasicBlockWidget * widget : widgets) { + QRectF relevantRect = widget->boundingRect(); + relevantRect.moveTo(widget->scenePos()); + relevantRect.adjust(-20, -20, 20, 20); + for (QGraphicsItem * item : items(relevantRect)) { + if (item == widget) continue; + QRectF itemrect = item->boundingRect(); + itemrect.moveTo(item->scenePos()); + while (relevantRect.intersects(itemrect)) { + if (widget->scenePos().x() > item->scenePos().x()) { + widget->moveBy(1, 0); + relevantRect.moveTo(widget->scenePos()); + } else { + item->moveBy(1, 0); + itemrect.moveTo(item->scenePos()); + } + } + } + } } diff --git a/src/gui/widgets/CFGScene.hxx b/src/gui/widgets/CFGScene.hxx index fb395f7..b343381 100644 --- a/src/gui/widgets/CFGScene.hxx +++ b/src/gui/widgets/CFGScene.hxx @@ -8,23 +8,23 @@ class CFGScene : public QGraphicsScene { public: - CFGScene(QWidget * parent = 0) - : QGraphicsScene(parent) {} + CFGScene(QWidget * parent = 0) + : QGraphicsScene(parent) {} - // Take special care when adding a BasicBlock to the scene as we - // need to draw arrows for it later on - void addItem(BasicBlockWidget* block) { - widgets.push_back(block); - QGraphicsScene::addItem(block); - } + // Take special care when adding a BasicBlock to the scene as we + // need to draw arrows for it later on + void addItem(BasicBlockWidget* block) { + widgets.push_back(block); + QGraphicsScene::addItem(block); + } - virtual void drawBackground(QPainter* painter, const QRectF & rect); + virtual void drawBackground(QPainter* painter, const QRectF & rect); private: - std::vector widgets; + std::vector widgets; - void drawLine(QPainter* painter, BasicBlockWidget * from, BasicBlockWidget * to, int8_t side = 0); + void drawLine(QPainter* painter, BasicBlockWidget * from, BasicBlockWidget * to, int8_t side = 0); - void spaceWidgets(); + void spaceWidgets(); }; #endif diff --git a/src/gui/widgets/ScriptingDock.cxx b/src/gui/widgets/ScriptingDock.cxx index 72ba9b0..86bc766 100644 --- a/src/gui/widgets/ScriptingDock.cxx +++ b/src/gui/widgets/ScriptingDock.cxx @@ -1,36 +1,36 @@ #include "ScriptingDock.hxx" namespace { - SCM handler (void *data, SCM tag, SCM throw_args) { - scm_handle_by_message_noexit ((void*)"foo", tag, throw_args); - return SCM_BOOL_F; - } + SCM handler (void *data, SCM tag, SCM throw_args) { + scm_handle_by_message_noexit ((void*)"foo", tag, throw_args); + return SCM_BOOL_F; + } } void ScriptingDock::doEvaluate() { - QString text = line->text(); - line->clear(); - LOG4CXX_INFO(logger, "Evaluating String \"" << text.toStdString() << "\""); - browser->append(QString("> ") + text); - - SCM result_obj = scm_internal_catch(SCM_BOOL_T, - (SCM (*)(void *))scm_c_eval_string, - (void*)text.toStdString().c_str(), - handler, NULL); - SCM result_str = scm_object_to_string(result_obj, SCM_UNDEFINED); + QString text = line->text(); + line->clear(); + LOG4CXX_INFO(logger, "Evaluating String \"" << text.toStdString() << "\""); + browser->append(QString("> ") + text); - SCM output = scm_get_output_string(guile_output_port); - QString output_q = scm_to_locale_string(output); - if (output_q.endsWith("\n")) output_q.chop(1); - if (output_q != "") browser->append(output_q); + SCM result_obj = scm_internal_catch(SCM_BOOL_T, + (SCM (*)(void *))scm_c_eval_string, + (void*)text.toStdString().c_str(), + handler, NULL); + SCM result_str = scm_object_to_string(result_obj, SCM_UNDEFINED); - output = scm_get_output_string(guile_error_port); - output_q = scm_to_locale_string(output); - if (output_q.endsWith("\n")) output_q.chop(1); - if (output_q != "") browser->append(output_q); + SCM output = scm_get_output_string(guile_output_port); + QString output_q = scm_to_locale_string(output); + if (output_q.endsWith("\n")) output_q.chop(1); + if (output_q != "") browser->append(output_q); - scm_truncate_file(guile_output_port, scm_from_uint16(0)); - scm_truncate_file(guile_error_port, scm_from_uint16(0)); - - browser->append(scm_to_locale_string(result_str)); + output = scm_get_output_string(guile_error_port); + output_q = scm_to_locale_string(output); + if (output_q.endsWith("\n")) output_q.chop(1); + if (output_q != "") browser->append(output_q); + + scm_truncate_file(guile_output_port, scm_from_uint16(0)); + scm_truncate_file(guile_error_port, scm_from_uint16(0)); + + browser->append(scm_to_locale_string(result_str)); } diff --git a/src/gui/widgets/ScriptingDock.hxx b/src/gui/widgets/ScriptingDock.hxx index ebbbc98..b6fc446 100644 --- a/src/gui/widgets/ScriptingDock.hxx +++ b/src/gui/widgets/ScriptingDock.hxx @@ -5,40 +5,40 @@ #include class ScriptingDock : public QDockWidget { - Q_OBJECT + Q_OBJECT public: - ScriptingDock(const QString& title, QWidget * parent = 0) - : QDockWidget(title, parent) - , logger(log4cxx::Logger::getLogger("ScriptingDock")) { - QTabWidget * tab = new QTabWidget; - QWidget * widget = new QWidget; - widget->setLayout(layout = new QGridLayout); - layout->addWidget(browser = new QTextBrowser, 0, 0, 1, 0); - layout->addWidget(line = new QLineEdit, 1, 0); - layout->addWidget(button = new QPushButton(tr("Evaluate")), 1, 1); - tab->addTab(widget, "GUILE"); - ((QDockWidget*)this)->setWidget(tab); - connect(button, SIGNAL(released()), this, SLOT(doEvaluate())); - connect(line, SIGNAL(returnPressed()), this, SLOT(doEvaluate())); - scm_init_guile(); - guile_output_port = scm_open_output_string(); - guile_error_port = scm_open_output_string(); - scm_set_current_output_port(guile_output_port); - scm_set_current_error_port(guile_error_port); - } + ScriptingDock(const QString& title, QWidget * parent = 0) + : QDockWidget(title, parent) + , logger(log4cxx::Logger::getLogger("ScriptingDock")) { + QTabWidget * tab = new QTabWidget; + QWidget * widget = new QWidget; + widget->setLayout(layout = new QGridLayout); + layout->addWidget(browser = new QTextBrowser, 0, 0, 1, 0); + layout->addWidget(line = new QLineEdit, 1, 0); + layout->addWidget(button = new QPushButton(tr("Evaluate")), 1, 1); + tab->addTab(widget, "GUILE"); + ((QDockWidget*)this)->setWidget(tab); + connect(button, SIGNAL(released()), this, SLOT(doEvaluate())); + connect(line, SIGNAL(returnPressed()), this, SLOT(doEvaluate())); + scm_init_guile(); + guile_output_port = scm_open_output_string(); + guile_error_port = scm_open_output_string(); + scm_set_current_output_port(guile_output_port); + scm_set_current_error_port(guile_error_port); + } private: - log4cxx::LoggerPtr logger; + log4cxx::LoggerPtr logger; - QTextBrowser * browser; - QGridLayout * layout; - QPushButton * button; - QLineEdit * line; + QTextBrowser * browser; + QGridLayout * layout; + QPushButton * button; + QLineEdit * line; - SCM guile_output_port; - SCM guile_error_port; + SCM guile_output_port; + SCM guile_error_port; private Q_SLOTS: - void doEvaluate(); + void doEvaluate(); }; #endif diff --git a/src/main.cxx b/src/main.cxx index 290657d..0c1ffe5 100644 --- a/src/main.cxx +++ b/src/main.cxx @@ -28,8 +28,8 @@ int main(int argc, char** argv) { QApplication app(argc, argv); - log4cxx::BasicConfigurator::configure(); - log4cxx::LoggerPtr _logger(log4cxx::Logger::getLogger("main")); + log4cxx::BasicConfigurator::configure(); + log4cxx::LoggerPtr _logger(log4cxx::Logger::getLogger("main")); #ifdef ARGPARSE QCommandLineParser parser; @@ -46,13 +46,13 @@ int main(int argc, char** argv) InformationManager iman; - LOG4CXX_DEBUG(_logger, "Initializing LLVM"); - llvm::InitializeAllTargetInfos(); - llvm::InitializeAllTargetMCs(); - llvm::InitializeAllAsmParsers(); - llvm::InitializeAllDisassemblers(); + LOG4CXX_DEBUG(_logger, "Initializing LLVM"); + llvm::InitializeAllTargetInfos(); + llvm::InitializeAllTargetMCs(); + llvm::InitializeAllAsmParsers(); + llvm::InitializeAllDisassemblers(); - LOG4CXX_DEBUG(_logger, "Initializing Qt"); + LOG4CXX_DEBUG(_logger, "Initializing Qt"); std::string filename = ""; #ifdef ARGPARSE