void DebugDatabase::addType(MDNode *type) { DIType diType(type); string query; query = "INSERT INTO VariableType "; query += "(designId, dw_tag, name, size, alignment, offset, derivedTypeId) "; query += "VALUES (" + std::to_string(designId); query += "," + std::to_string(diType.getTag()); query += "," + addQuotesToStr(diType.getName().str()); query += "," + std::to_string(diType.getSizeInBits()); query += "," + std::to_string(diType.getAlignInBits()); query += "," + std::to_string(diType.getOffsetInBits()); if (diType.isBasicType()) { query += ",NULL"; } else if (diType.isDerivedType()) { DIDerivedType typeDerived(type); MDNode *derivedMD = typeDerived.getTypeDerivedFrom().resolve(typeMap); if (derivedMD) query += "," + std::to_string(getTypeId(derivedMD)); else query += ",NULL"; } else { assert(false); } query += ");"; runQuery(query); int typeId = mysql_insert_id(connection); typeToIds[&(*type)] = typeId; if (diType.isCompositeType()) { DICompositeType typeComposite(type); DIArray members = typeComposite.getTypeArray(); for (unsigned int i = 0; i < members.getNumElements(); ++i) { DIDescriptor s = members.getElement(i); query = "INSERT INTO VariableTypeMember "; query += "(ownerVariableTypeId, idx, variableTypeId, subrangeCount) "; query += "VALUES (" + std::to_string(typeId); query += "," + std::to_string(i); if (s.isSubrange()) { DISubrange subRange = (DISubrange)s; assert(subRange.getLo() == 0); query += ",NULL"; query += "," + std::to_string(subRange.getCount()); } else if (s.isType()) { MDNode *mdNode = &*s; query += "," + std::to_string(getTypeId(mdNode)); query += ",NULL"; } query += ");"; runQuery(query); } } }