github.com/hxx258456/ccgo@v0.0.5-0.20230213014102-48b35f46f66f/net/bpf/asm.go (about)

     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  }