| // Copyright 2019 The Fuchsia Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| package covargs |
| |
| import ( |
| "context" |
| |
| "go.fuchsia.dev/fuchsia/tools/debug/symbolize" |
| "go.fuchsia.dev/fuchsia/tools/lib/logger" |
| "go.fuchsia.dev/fuchsia/tools/testing/runtests" |
| ) |
| |
| const llvmProfileSinkType = "llvm-profile" |
| |
| type ProfileEntry struct { |
| Profile string `json:"profile"` |
| Modules []string `json:"modules"` |
| } |
| |
| // MergeEntries combines data from runtests and symbolizer, returning |
| // a sequence of entries, where each entry contains a raw profile and all |
| // modules (specified by build ID) present in that profile. |
| func MergeEntries(ctx context.Context, dumps map[string]symbolize.DumpEntry, summary runtests.DataSinkMap) ([]ProfileEntry, error) { |
| entries := []ProfileEntry{} |
| |
| for _, sink := range summary[llvmProfileSinkType] { |
| var modules []string |
| if len(sink.BuildIDs) > 0 { |
| modules = sink.BuildIDs |
| } else { |
| dump, ok := dumps[sink.Name] |
| if !ok { |
| logger.Warningf(ctx, "%s not found in summary file; unable to determine module build IDs\n", sink.Name) |
| continue |
| } |
| moduleSet := make(map[string]struct{}) |
| for _, mod := range dump.Modules { |
| if _, ok := moduleSet[mod.Build]; !ok { |
| modules = append(modules, mod.Build) |
| moduleSet[mod.Build] = struct{}{} |
| } |
| } |
| } |
| |
| entries = append(entries, ProfileEntry{ |
| Modules: modules, |
| Profile: sink.File, |
| }) |
| } |
| |
| return entries, nil |
| } |