const glu::VariableDeclaration* getDeclaration (void) const { DE_ASSERT(isDeclaration()); return m_data.declaration; }
void __taint2_enable_taint(void) { if(taintEnabled) {return;} printf ("taint2: __taint_enable_taint\n"); taintEnabled = true; panda_cb pcb; pcb.after_block_translate = after_block_translate; panda_register_callback(plugin_ptr, PANDA_CB_AFTER_BLOCK_TRANSLATE, pcb); pcb.before_block_exec_invalidate_opt = before_block_exec_invalidate_opt; panda_register_callback(plugin_ptr, PANDA_CB_BEFORE_BLOCK_EXEC_INVALIDATE_OPT, pcb); pcb.before_block_exec = before_block_exec; panda_register_callback(plugin_ptr, PANDA_CB_BEFORE_BLOCK_EXEC, pcb); pcb.after_block_exec = after_block_exec; panda_register_callback(plugin_ptr, PANDA_CB_AFTER_BLOCK_EXEC, pcb); pcb.phys_mem_read = phys_mem_read_callback; panda_register_callback(plugin_ptr, PANDA_CB_PHYS_MEM_READ, pcb); pcb.phys_mem_write = phys_mem_write_callback; panda_register_callback(plugin_ptr, PANDA_CB_PHYS_MEM_WRITE, pcb); /* pcb.cb_cpu_restore_state = cb_cpu_restore_state; panda_register_callback(plugin_ptr, PANDA_CB_CPU_RESTORE_STATE, pcb); // for hd and network taint pcb.replay_hd_transfer = cb_replay_hd_transfer_taint; panda_register_callback(plugin_ptr, PANDA_CB_REPLAY_HD_TRANSFER, pcb); pcb.replay_net_transfer = cb_replay_net_transfer_taint; panda_register_callback(plugin_ptr, PANDA_CB_REPLAY_NET_TRANSFER, pcb); pcb.replay_before_cpu_physical_mem_rw_ram = cb_replay_cpu_physical_mem_rw_ram; panda_register_callback(plugin_ptr, PANDA_CB_REPLAY_BEFORE_CPU_PHYSICAL_MEM_RW_RAM, pcb); */ panda_enable_precise_pc(); //before_block_exec requires precise_pc for panda_current_asid if (!execute_llvm){ panda_enable_llvm(); } panda_enable_llvm_helpers(); /* * Taint processor initialization */ shadow = tp_init(TAINT_BYTE_LABEL, TAINT_GRANULARITY_BYTE); if (shadow == NULL){ printf("Error initializing shadow memory...\n"); exit(1); } // Initialize memlog. memset(&taint_memlog, 0, sizeof(taint_memlog)); llvm::Module *mod = tcg_llvm_ctx->getModule(); FPM = tcg_llvm_ctx->getFunctionPassManager(); // Add the taint analysis pass to our taint pass manager PTFP = new llvm::PandaTaintFunctionPass(shadow, &taint_memlog); FPM->add(PTFP); if (optimize_llvm) { printf("taint2: Adding default optimizations (-O1).\n"); llvm::PassManagerBuilder Builder; Builder.OptLevel = 1; Builder.SizeLevel = 0; Builder.populateFunctionPassManager(*FPM); } FPM->doInitialization(); // Populate module with helper function taint ops for (auto i = mod->begin(); i != mod->end(); i++){ if (!i->isDeclaration()) PTFP->runOnFunction(*i); } printf("taint2: Done processing helper functions for taint.\n"); std::string err; if(verifyModule(*mod, llvm::AbortProcessAction, &err)){ printf("%s\n", err.c_str()); exit(1); } //tcg_llvm_write_module(tcg_llvm_ctx, "/tmp/llvm-mod.bc"); printf("taint2: Done verifying module. Running...\n"); }