void addDecl(const NominalTypeDecl *decl) { auto type = decl->getDeclaredInterfaceType()->getCanonicalType(); Mangle::Mangler mangler; mangler.setModuleContext(decl->getModuleContext()); mangler.mangleType(type, 0); auto mangledName = IGM.getAddrOfStringForTypeRef(mangler.finalize()); addRelativeAddress(mangledName); switch (decl->getKind()) { case DeclKind::Class: case DeclKind::Struct: { auto properties = decl->getStoredProperties(); addConstantInt32(std::distance(properties.begin(), properties.end())); addConstantInt32(fieldRecordSize); for (auto property : properties) addFieldDecl(property); break; } case DeclKind::Enum: { auto enumDecl = cast<EnumDecl>(decl); auto cases = enumDecl->getAllElements(); addConstantInt32(std::distance(cases.begin(), cases.end())); addConstantInt32(fieldRecordSize); for (auto enumCase : cases) addFieldDecl(enumCase); break; } default: llvm_unreachable("Not a nominal type"); break; } }
void addFieldDecl(const ValueDecl *value) { auto type = value->getInterfaceType()->getCanonicalType(); Mangle::Mangler mangler; mangler.setModuleContext(value->getModuleContext()); mangler.mangleType(type, 0); auto mangledName = IGM.getAddrOfStringForTypeRef(mangler.finalize()); addRelativeAddress(mangledName); if (IGM.Opts.StripReflectionNames) { addConstantInt32(0); } else { auto fieldName = IGM.getAddrOfFieldName(value->getNameStr()); addRelativeAddress(fieldName); } }