static bool LiftFunctionsIntoModule(NativeModulePtr natMod, llvm::Module *M) { // populate functions for (auto &func_info : natMod->get_funcs()) { NativeFunctionPtr f = func_info.second; if (!InsertFunctionIntoModule(natMod, f, M)) { std::string fname = f->get_name(); std::cerr << "Could not insert function: " << fname << " into the LLVM module" << std::endl; return false; } } return true; }
void PrintCFGFunctionList(const NativeModulePtr native_module, const std::string &architecture) noexcept { std::ios::fmtflags original_stream_flags(std::cout.flags()); int address_digit_count = (architecture == "amd64" ? 16 : 8); std::cout << "\nCFG Function List:\n"; const auto &function_map = native_module->get_funcs(); for (const auto &function_descriptor : function_map) { VA virtual_address = function_descriptor.first; const NativeFunctionPtr function = function_descriptor.second; std::cout << " " << std::hex << std::setw(address_digit_count) << std::setfill('0') << virtual_address << " "; std::cout << function->get_name() << std::endl; } std::cout.flags(original_stream_flags); }
void doPrintModule(NativeModulePtr m) { string pathBase = "./"; list<NativeFunctionPtr> mod_funcs = m->get_funcs(); list<NativeFunctionPtr>::iterator it = mod_funcs.begin(); for(; it != mod_funcs.end(); ++it) { NativeFunctionPtr f = *it; string n = pathBase+to_string<uint64_t>(f->get_start(), hex) + ".dot"; ofstream out(n.c_str()); block_label_writer bgl(f); CFG g = f->get_cfg(); write_graphviz(out, g, bgl); } return; }
void RenameLiftedFunctions(NativeModulePtr natMod, llvm::Module *M, const std::set<VA> &entry_point_pcs) { // Rename the functions to have their 'nice' names, where available. for (auto &f : natMod->get_funcs()) { NativeFunctionPtr native_func = f.second; if (entry_point_pcs.count(native_func->get_start())) { continue; } auto sub_name = native_func->get_name(); auto F = M->getFunction(sub_name); std::stringstream ss; ss << "callback_" << sub_name; if (!M->getFunction(ss.str())) { auto &sym_name = native_func->get_symbol_name(); if (!sym_name.empty()) { F->setName(sym_name); } } } }
static void InitLiftedFunctions(NativeModulePtr natMod, llvm::Module *M) { for (auto &f : natMod->get_funcs()) { NativeFunctionPtr native_func = f.second; auto fname = native_func->get_name(); auto F = M->getFunction(fname); if (!F) { F = llvm::dyn_cast<llvm::Function>( M->getOrInsertFunction(fname, LiftedFunctionType())); TASSERT(F != nullptr, "Could not insert function into module"); ArchSetCallingConv(M, F); // make local functions 'static' F->setLinkage(llvm::GlobalValue::InternalLinkage); std::cout << "Inserted function: " << fname << std::endl; } else { std::cout << "Already inserted function: " << fname << ", skipping." << std::endl; } } }