/* class method */ SgAsmGenericFile* BinaryLoader::createAsmAST(SgBinaryComposite* binaryFile, std::string filePath) { ASSERT_forbid(filePath.empty()); SgAsmGenericFile* file = SgAsmExecutableFileFormat::parseBinaryFormat(filePath.c_str()); ASSERT_not_null(file); // TODO do I need to attach here - or can I do after return binaryFile->get_genericFileList()->get_files().push_back(file); file->set_parent(binaryFile->get_genericFileList()); /* Add a new interpretation to the SgBinaryComposite object for each header of the newly parsed * SgAsmGenericFile for which a suitable interpretation does not already exist. */ const SgAsmGenericHeaderPtrList &headers = file->get_headers()->get_headers(); SgAsmInterpretationPtrList &interps = binaryFile->get_interpretations()->get_interpretations(); for (size_t i = 0; i < headers.size(); ++i) { SgAsmGenericHeader* header = headers[i]; SgAsmInterpretation* interp = NULL; for (size_t j = 0; j < interps.size(); ++j) { ASSERT_forbid(interps[j]->get_headers()->get_headers().empty()); SgAsmGenericHeader* interpHeader = interps[j]->get_headers()->get_headers().front(); if (isHeaderSimilar(header, interpHeader)) { interp = interps[j]; break; } } if (!interp) { interp = new SgAsmInterpretation(); interps.push_back(interp); interp->set_parent(binaryFile->get_interpretations()); if (const RegisterDictionary *registers = RegisterDictionary::dictionary_for_isa(header->get_isa())) interp->set_registers(registers); } interp->get_headers()->get_headers().push_back(header); } #if USE_ROSE_DWARF_SUPPORT /* Parse Dwarf info and add it to the SgAsmGenericFile. */ readDwarf(file); #endif return file; }