asm.go (1267B)
1 // Copyright 2016 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 package bpf 6 7 import "fmt" 8 9 // Assemble converts insts into raw instructions suitable for loading 10 // into a BPF virtual machine. 11 // 12 // Currently, no optimization is attempted, the assembled program flow 13 // is exactly as provided. 14 func Assemble(insts []Instruction) ([]RawInstruction, error) { 15 ret := make([]RawInstruction, len(insts)) 16 var err error 17 for i, inst := range insts { 18 ret[i], err = inst.Assemble() 19 if err != nil { 20 return nil, fmt.Errorf("assembling instruction %d: %s", i+1, err) 21 } 22 } 23 return ret, nil 24 } 25 26 // Disassemble attempts to parse raw back into 27 // Instructions. Unrecognized RawInstructions are assumed to be an 28 // extension not implemented by this package, and are passed through 29 // unchanged to the output. The allDecoded value reports whether insts 30 // contains no RawInstructions. 31 func Disassemble(raw []RawInstruction) (insts []Instruction, allDecoded bool) { 32 insts = make([]Instruction, len(raw)) 33 allDecoded = true 34 for i, r := range raw { 35 insts[i] = r.Disassemble() 36 if _, ok := insts[i].(RawInstruction); ok { 37 allDecoded = false 38 } 39 } 40 return insts, allDecoded 41 }