| 29 | using namespace binaryninja; |
| 30 | |
| 31 | dw::Variable* VarEngine::add_variable(const bn::DataVariable& var) { |
| 32 | if (auto it = vars_.find(var.address); it != vars_.end()) { |
| 33 | return it->second.get(); |
| 34 | } |
| 35 | |
| 36 | std::string name = fmt::format("data_{:04x}", var.address); |
| 37 | bool is_external = false; |
| 38 | if (bn::Ref<bn::Symbol> sym = bv_.GetSymbolByAddress(var.address)) { |
| 39 | BNSymbolType type = sym->GetType(); |
| 40 | if (type == ExternalSymbol || |
| 41 | type == ImportedFunctionSymbol || |
| 42 | type == FunctionSymbol || |
| 43 | type == LibraryFunctionSymbol || |
| 44 | type == SymbolicFunctionSymbol |
| 45 | ) |
| 46 | { |
| 47 | return nullptr; |
| 48 | } |
| 49 | name = sym->GetFullName(); |
| 50 | BNSymbolBinding binding = sym->GetBinding(); |
| 51 | is_external = binding == GlobalBinding || binding == WeakBinding; |
| 52 | } |
| 53 | |
| 54 | std::unique_ptr<dw::Variable> dw_var = unit_.create_variable(name); |
| 55 | |
| 56 | dw_var->set_addr(var.address); |
| 57 | dw_var->set_type(types_.add_type(var.type->GetTypeName(), api_compat::get_type(var.type))); |
| 58 | |
| 59 | if (is_external) { |
| 60 | dw_var->set_external(); |
| 61 | } |
| 62 | |
| 63 | return vars_.insert( |
| 64 | {var.address, std::move(dw_var)} |
| 65 | ).first->second.get(); |
| 66 | } |
| 67 | } |