github.com/m10x/go/src@v0.0.0-20220112094212-ba61592315da/syscall/mksysnum_linux.pl (about)

     1  #!/usr/bin/env perl
     2  # Copyright 2009 The Go Authors. All rights reserved.
     3  # Use of this source code is governed by a BSD-style
     4  # license that can be found in the LICENSE file.
     5  
     6  use strict;
     7  
     8  my $command = "mksysnum_linux.pl ". join(' ', @ARGV);
     9  
    10  print <<EOF;
    11  // $command
    12  // Code generated by the command above; DO NOT EDIT.
    13  
    14  package syscall
    15  
    16  const(
    17  EOF
    18  
    19  my $offset = 0;
    20  
    21  sub fmt {
    22  	my ($name, $num) = @_;
    23  	if($num > 999){
    24  		# ignore deprecated syscalls that are no longer implemented
    25  		# https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/include/uapi/asm-generic/unistd.h?id=refs/heads/master#n716
    26  		return;
    27  	}
    28  	$name =~ y/a-z/A-Z/;
    29  	$num = $num + $offset;
    30  	print "	SYS_$name = $num;\n";
    31  }
    32  
    33  my $prev;
    34  open(GCC, "gcc -E -dD $ARGV[0] |") || die "can't run gcc";
    35  while(<GCC>){
    36  	if(/^#define __NR_Linux\s+([0-9]+)/){
    37  		# mips/mips64: extract offset
    38  		$offset = $1;
    39  	}
    40  	elsif(/^#define __NR_syscalls\s+/) {
    41  		# ignore redefinitions of __NR_syscalls
    42  	}
    43  	elsif(/^#define __NR_(\w+)\s+([0-9]+)/){
    44  		$prev = $2;
    45  		fmt($1, $2);
    46  	}
    47  	elsif(/^#define __NR3264_(\w+)\s+([0-9]+)/){
    48  		$prev = $2;
    49  		fmt($1, $2);
    50  	}
    51  	elsif(/^#define __NR_(\w+)\s+\(\w+\+\s*([0-9]+)\)/){
    52  		fmt($1, $prev+$2)
    53  	}
    54  	elsif(/^#define __NR_(\w+)\s+\(__NR_Linux \+ ([0-9]+)/){
    55  		fmt($1, $2);
    56  	}
    57  }
    58  
    59  print <<EOF;
    60  )
    61  EOF