浏览代码

Merge pull request #62 from rauls5382/toppproto

Populate more carefully the profile.proto in the topproto output
Josef Jelinek 8 年前
父节点
当前提交
01ea337ec1
共有 2 个文件被更改,包括 50 次插入10 次删除
  1. 26
    10
      internal/report/report.go
  2. 24
    0
      internal/report/report_test.go

+ 26
- 10
internal/report/report.go 查看文件

286
 		PeriodType:    p.PeriodType,
286
 		PeriodType:    p.PeriodType,
287
 		Period:        p.Period,
287
 		Period:        p.Period,
288
 	}
288
 	}
289
-	var flatSum int64
289
+	functionMap := make(functionMap)
290
 	for i, n := range g.Nodes {
290
 	for i, n := range g.Nodes {
291
-		name, flat, cum := n.Info.PrintableName(), n.FlatValue(), n.CumValue()
292
-
293
-		flatSum += flat
294
-		f := &profile.Function{
295
-			ID:         uint64(i + 1),
296
-			Name:       name,
297
-			SystemName: name,
298
-		}
291
+		f := functionMap.FindOrAdd(n.Info)
292
+		flat, cum := n.FlatValue(), n.CumValue()
299
 		l := &profile.Location{
293
 		l := &profile.Location{
300
-			ID: uint64(i + 1),
294
+			ID:      uint64(i + 1),
295
+			Address: n.Info.Address,
301
 			Line: []profile.Line{
296
 			Line: []profile.Line{
302
 				{
297
 				{
298
+					Line:     int64(n.Info.Lineno),
303
 					Function: f,
299
 					Function: f,
304
 				},
300
 				},
305
 			},
301
 			},
319
 	return out.Write(w)
315
 	return out.Write(w)
320
 }
316
 }
321
 
317
 
318
+type functionMap map[string]*profile.Function
319
+
320
+func (fm functionMap) FindOrAdd(ni graph.NodeInfo) *profile.Function {
321
+	fName := fmt.Sprintf("%q%q%q%d", ni.Name, ni.OrigName, ni.File, ni.StartLine)
322
+
323
+	if f := fm[fName]; f != nil {
324
+		return f
325
+	}
326
+
327
+	f := &profile.Function{
328
+		ID:         uint64(len(fm) + 1),
329
+		Name:       ni.Name,
330
+		SystemName: ni.OrigName,
331
+		Filename:   ni.File,
332
+		StartLine:  int64(ni.StartLine),
333
+	}
334
+	fm[fName] = f
335
+	return f
336
+}
337
+
322
 // printAssembly prints an annotated assembly listing.
338
 // printAssembly prints an annotated assembly listing.
323
 func printAssembly(w io.Writer, rpt *Report, obj plugin.ObjTool) error {
339
 func printAssembly(w io.Writer, rpt *Report, obj plugin.ObjTool) error {
324
 	o := rpt.options
340
 	o := rpt.options

+ 24
- 0
internal/report/report_test.go 查看文件

236
 		}
236
 		}
237
 	}
237
 	}
238
 }
238
 }
239
+
240
+func TestFunctionMap(t *testing.T) {
241
+
242
+	fm := make(functionMap)
243
+	nodes := []graph.NodeInfo{
244
+		{Name: "fun1"},
245
+		{Name: "fun2", File: "filename"},
246
+		{Name: "fun1"},
247
+		{Name: "fun2", File: "filename2"},
248
+	}
249
+
250
+	want := []profile.Function{
251
+		{ID: 1, Name: "fun1"},
252
+		{ID: 2, Name: "fun2", Filename: "filename"},
253
+		{ID: 1, Name: "fun1"},
254
+		{ID: 3, Name: "fun2", Filename: "filename2"},
255
+	}
256
+
257
+	for i, tc := range nodes {
258
+		if got, want := fm.FindOrAdd(tc), want[i]; *got != want {
259
+			t.Errorf("%d: want %v, got %v", i, want, got)
260
+		}
261
+	}
262
+}