| 287 | } |
| 288 | |
| 289 | GraphDumper::DumpResult GraphDumperOSS::dump( |
| 290 | const SymbolVarArray& output_vars, const DumpConfig& config, |
| 291 | const Metadata& metadata) { |
| 292 | mgb_throw_if(output_vars.empty(), SerializationError, "Can't dump empty graph"); |
| 293 | |
| 294 | auto begin_pos = m_file->tell(); |
| 295 | m_config = config; |
| 296 | m_builder.Reset(); |
| 297 | |
| 298 | m_output_vars.clear(); |
| 299 | m_cur_rst = {}; |
| 300 | m_used_input_names.clear(); |
| 301 | m_used_param_names.clear(); |
| 302 | m_nr_shared_tensor = 0; |
| 303 | |
| 304 | auto new_output_vars = output_vars; |
| 305 | if (!config.no_change_graph) { |
| 306 | new_output_vars = converter_all_opr_to_compatiable(output_vars); |
| 307 | mgb_assert(output_vars.size() == new_output_vars.size()); |
| 308 | for (size_t id = 0; id < output_vars.size(); id++) { |
| 309 | auto& new_var = new_output_vars[id]; |
| 310 | new_var.rename(output_vars[id].node()->name()); |
| 311 | } |
| 312 | } |
| 313 | |
| 314 | // process output vars |
| 315 | bool keep_output_var_name = m_config.keep_var_name >= 1; |
| 316 | std::unordered_set<std::string> output_var_names; |
| 317 | for (auto i : new_output_vars) { |
| 318 | mgb_assert( |
| 319 | !i.node()->contain_flag(VarNode::Flag::VOLATILE_CONTENT), |
| 320 | "can not dump var with VOLATILE_CONTENT flag: %s", |
| 321 | cg::dump_var_info({i.node()}).c_str()); |
| 322 | if (m_output_vars.insert(i.node()).second && keep_output_var_name) { |
| 323 | auto name_ins = output_var_names.insert(i.node()->name()).second; |
| 324 | mgb_assert(name_ins, "duplicated output var name: %s", i.node()->cname()); |
| 325 | } |
| 326 | } |
| 327 | |
| 328 | // Write magic |
| 329 | uint32_t magic = MGB_MAGIC; |
| 330 | if (m_config.compat_older_version == "8.14") { |
| 331 | magic = MAGIC_V0; |
| 332 | } |
| 333 | m_file->write(&magic, sizeof(magic)); |
| 334 | |
| 335 | // write FeatureBits |
| 336 | if (m_config.compat_older_version.empty()) { |
| 337 | FeatureBits64::write(*m_file); |
| 338 | } |
| 339 | // Padding |
| 340 | uint32_t reserved = 0; |
| 341 | m_file->write(&reserved, sizeof(reserved)); |
| 342 | |
| 343 | // Write placeholder for offset_to_fbs |
| 344 | auto offset_pos = m_file->tell(); |
| 345 | uint64_t offset_to_fbs = 0; |
| 346 | m_file->write(&offset_to_fbs, sizeof(offset_to_fbs)); |
nothing calls this directly
no test coverage detected