|  | // Copyright 2016 The Go 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 bpf | 
|  |  | 
|  | import "fmt" | 
|  |  | 
|  | // Assemble converts insts into raw instructions suitable for loading | 
|  | // into a BPF virtual machine. | 
|  | // | 
|  | // Currently, no optimization is attempted, the assembled program flow | 
|  | // is exactly as provided. | 
|  | func Assemble(insts []Instruction) ([]RawInstruction, error) { | 
|  | ret := make([]RawInstruction, len(insts)) | 
|  | var err error | 
|  | for i, inst := range insts { | 
|  | ret[i], err = inst.Assemble() | 
|  | if err != nil { | 
|  | return nil, fmt.Errorf("assembling instruction %d: %s", i+1, err) | 
|  | } | 
|  | } | 
|  | return ret, nil | 
|  | } | 
|  |  | 
|  | // Disassemble attempts to parse raw back into | 
|  | // Instructions. Unrecognized RawInstructions are assumed to be an | 
|  | // extension not implemented by this package, and are passed through | 
|  | // unchanged to the output. The allDecoded value reports whether insts | 
|  | // contains no RawInstructions. | 
|  | func Disassemble(raw []RawInstruction) (insts []Instruction, allDecoded bool) { | 
|  | insts = make([]Instruction, len(raw)) | 
|  | allDecoded = true | 
|  | for i, r := range raw { | 
|  | insts[i] = r.Disassemble() | 
|  | if _, ok := insts[i].(RawInstruction); ok { | 
|  | allDecoded = false | 
|  | } | 
|  | } | 
|  | return insts, allDecoded | 
|  | } |