github.com/razvanm/vanadium-go-1.3@v0.0.0-20160721203343-4a65068e5915/src/cmd/dist/buildgc.c (about)

     1  // Copyright 2012 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  #include "a.h"
     6  
     7  /*
     8   * Helpers for building cmd/gc.
     9   */
    10  
    11  // gcopnames creates opnames.h from go.h.
    12  // It finds the OXXX enum, pulls out all the constants
    13  // from OXXX to OEND, and writes a table mapping
    14  // op to string.
    15  void
    16  gcopnames(char *dir, char *file)
    17  {
    18  	char *p, *q;
    19  	int i, j, end;
    20  	Buf in, b, out;
    21  	Vec lines, fields;
    22  	
    23  	binit(&in);
    24  	binit(&b);
    25  	binit(&out);
    26  	vinit(&lines);
    27  	vinit(&fields);
    28  	
    29  	bwritestr(&out, bprintf(&b, "// auto generated by go tool dist\n"));
    30  	bwritestr(&out, bprintf(&b, "static char *opnames[] = {\n"));
    31  
    32  	readfile(&in, bprintf(&b, "%s/go.h", dir));
    33  	splitlines(&lines, bstr(&in));
    34  	i = 0;
    35  	while(i<lines.len && !contains(lines.p[i], "OXXX"))
    36  		i++;
    37  	end = 0;
    38  	for(; i<lines.len && !end; i++) {
    39  		p = xstrstr(lines.p[i], "//");
    40  		if(p != nil)
    41  			*p = '\0';
    42  		end = contains(lines.p[i], "OEND");
    43  		splitfields(&fields, lines.p[i]);
    44  		for(j=0; j<fields.len; j++) {
    45  			q = fields.p[j];
    46  			if(*q == 'O')
    47  				q++;
    48  			p = q+xstrlen(q)-1;
    49  			if(*p == ',')
    50  				*p = '\0';
    51  			bwritestr(&out, bprintf(&b, "	[O%s] = \"%s\",\n", q, q));
    52  		}
    53  	}
    54  	
    55  	bwritestr(&out, bprintf(&b, "};\n"));
    56  
    57  	writefile(&out, file, 0);
    58  
    59  	bfree(&in);
    60  	bfree(&b);
    61  	bfree(&out);
    62  	vfree(&lines);
    63  	vfree(&fields);
    64  }
    65  
    66  // mkanames reads [568].out.h and writes anames[568].c
    67  // The format is much the same as the Go opcodes above.
    68  // it also writes out cnames array for C_* constants.
    69  void
    70  mkanames(char *dir, char *file)
    71  {
    72  	int i, j, ch;
    73  	Buf in, b, out, out2;
    74  	Vec lines;
    75  	char *p;
    76  
    77  	binit(&b);
    78  	binit(&in);
    79  	binit(&out);
    80  	binit(&out2);
    81  	vinit(&lines);
    82  
    83  	ch = file[xstrlen(file)-3];
    84  	bprintf(&b, "%s/../cmd/%cl/%c.out.h", dir, ch, ch);
    85  	readfile(&in, bstr(&b));
    86  	splitlines(&lines, bstr(&in));
    87  	
    88  	// Include link.h so that the extern declaration there is
    89  	// checked against the non-extern declaration we are generating.
    90  	bwritestr(&out, bprintf(&b, "#include <u.h>\n"));
    91  	bwritestr(&out, bprintf(&b, "#include <libc.h>\n"));
    92  	bwritestr(&out, bprintf(&b, "#include <bio.h>\n"));
    93  	bwritestr(&out, bprintf(&b, "#include <link.h>\n"));
    94  	bwritestr(&out, bprintf(&b, "\n"));
    95  
    96  	bwritestr(&out, bprintf(&b, "char*	anames%c[] = {\n", ch));
    97  	for(i=0; i<lines.len; i++) {
    98  		if(hasprefix(lines.p[i], "\tA")) {
    99  			p = xstrstr(lines.p[i], ",");
   100  			if(p)
   101  				*p = '\0';
   102  			p = xstrstr(lines.p[i], "\n");
   103  			if(p)
   104  				*p = '\0';
   105  			p = lines.p[i] + 2;
   106  			bwritestr(&out, bprintf(&b, "\t\"%s\",\n", p));
   107  		}
   108  	}
   109  	bwritestr(&out, "};\n");
   110  
   111  	j=0;
   112  	bprintf(&out2, "char*	cnames%c[] = {\n", ch);
   113  	for(i=0; i<lines.len; i++) {
   114  		if(hasprefix(lines.p[i], "\tC_")) {
   115  			p = xstrstr(lines.p[i], ",");
   116  			if(p)
   117  				*p = '\0';
   118  			p = xstrstr(lines.p[i], "\n");
   119  			if(p)
   120  				*p = '\0';
   121  			p = lines.p[i] + 3;
   122  			bwritestr(&out2, bprintf(&b, "\t\"%s\",\n", p));
   123  			j++;
   124  		}
   125  	}
   126  	bwritestr(&out2, "};\n");
   127  	if(j>0)
   128  		bwriteb(&out, &out2);
   129  
   130  	writefile(&out, file, 0);
   131  
   132  	bfree(&b);
   133  	bfree(&in);
   134  	bfree(&out);
   135  	bfree(&out2);
   136  	vfree(&lines);
   137  }