#include "core/InformationManager.hxx"
#include "core/Function.hxx"
#include "core/BasicBlock.hxx"
+#include <boost/algorithm/string.hpp>
#include <stack>
#include <algorithm>
*
*/
Disassembler * createLLVMDisassembler(const std::string& filename, InformationManager* manager) {
+ log4cxx::LoggerPtr logger(log4cxx::Logger::getLogger("disassembler.LLVMDisassembler"));
if (filename == "")
return NULL;
- std::unique_ptr<Binary> o;
- o.reset(createBinary(filename).get());
- Binary * op = o.release();
+ auto retval = createBinary(filename);
+ if (error_code ec = retval.getError()) {
+ LOG4CXX_ERROR(logger, ec.message());
+ return NULL;
+ }
+
+ Binary * op = retval.get();
+
+ if (!op) {
+ LOG4CXX_ERROR(logger, "Could not open " << filename);
+ return NULL;
+ }
// ELFType<endian, maxalign, 64bit>
if (ELF32LEObjectFile * object = dyn_cast<ELF32LEObjectFile>(op)) {
std::unique_ptr<MCObjectDisassembler> OD(
new MCObjectDisassembler(*o, *DisAsm, *MIA));
- Mod.reset(OD->buildModule(false));
+ //Mod.reset(OD->buildModule(false));
readSections();
}
// }
template <typename ELFT>
-std::list<Instruction> LLVMDisassembler<ELFT>::getInstructions(const BasicBlock *block) {
- std::list<Instruction> result;
+std::vector<Instruction> LLVMDisassembler<ELFT>::getInstructions(const BasicBlock *block) {
+ std::vector<Instruction> result;
SectionRef text_section = getTextSection();
uint64_t base_address;
text_section.getAddress(base_address);
stream << std::hex << (base_address + jmptarget);
ref = stream.str();
}
- result.push_back(Instruction(current_address + base_address, s.str(),
+ result.push_back(Instruction(current_address + base_address, boost::algorithm::trim_copy(s.str()),
std::vector<uint8_t>(bytes, bytes+inst_size), ref));
} else {
LOG4CXX_WARN(logger, "Invalid byte at" << std::hex << current_address + base_address);