code: func disassemble(asm []byte) ([]plugin.Inst, error) {
  	buf := bytes.NewBuffer(asm)
  	function, file, line := "", "", 0
  	var assembly []plugin.Inst
  	for {
  		input, err := buf.ReadString('\n')
  		if err != nil {
  			if err != io.EOF {
  				return nil, err
  			}
  			if input == "" {
  				break
  			}
  		}
  
  		if fields := objdumpAsmOutputRE.FindStringSubmatch(input); len(fields) == 3 {
  			if address, err := strconv.ParseUint(fields[1], 16, 64); err == nil {
  				assembly = append(assembly,
  					plugin.Inst{
  						Addr:     address,
  						Text:     fields[2],
  						Function: function,
  						File:     file,
  						Line:     line,
  					})
  				continue
  			}
  		}
  		if fields := objdumpOutputFileLine.FindStringSubmatch(input); len(fields) == 3 {
  			if l, err := strconv.ParseUint(fields[2], 10, 32); err == nil {
  				file, line = fields[1], int(l)
  			}
  			continue
  		}
  		if fields := objdumpOutputFunction.FindStringSubmatch(input); len(fields) == 2 {
  			function = fields[1]
  			continue
  		}
  		// Reset on unrecognized lines.
  		function, file, line = "", "", 0
  	}
  
  	return assembly, nil
  }
docs: // disassemble parses the output of the objdump command and returns
  // the assembly instructions in a slice.