code: func assemblyPerSourceLine(objSyms []*objSymbol, rs nodes, src string, obj plugin.ObjTool) map[int]nodes {
  	assembly := make(map[int]nodes)
  	// Identify symbol to use for this collection of samples.
  	o := findMatchingSymbol(objSyms, rs)
  	if o == nil {
  		return assembly
  	}
  
  	// Extract assembly for matched symbol
  	insns, err := obj.Disasm(o.sym.File, o.sym.Start, o.sym.End)
  	if err != nil {
  		return assembly
  	}
  
  	srcBase := filepath.Base(src)
  	anodes := annotateAssembly(insns, rs, o.base)
  	var lineno = 0
  	for _, an := range anodes {
  		if filepath.Base(an.info.file) == srcBase {
  			lineno = an.info.lineno
  		}
  		if lineno != 0 {
  			assembly[lineno] = append(assembly[lineno], an)
  		}
  	}
  
  	return assembly
  }
docs: // assemblyPerSourceLine disassembles the binary containing a symbol
  // and classifies the assembly instructions according to its
  // corresponding source line, annotating them with a set of samples.