diff options
author | Tianon Gravi <admwiggin@gmail.com> | 2015-01-15 11:54:00 -0700 |
---|---|---|
committer | Tianon Gravi <admwiggin@gmail.com> | 2015-01-15 11:54:00 -0700 |
commit | f154da9e12608589e8d5f0508f908a0c3e88a1bb (patch) | |
tree | f8255d51e10c6f1e0ed69702200b966c9556a431 /src/cmd/dist/buildruntime.c | |
parent | 8d8329ed5dfb9622c82a9fbec6fd99a580f9c9f6 (diff) | |
download | golang-upstream/1.4.tar.gz |
Imported Upstream version 1.4upstream/1.4
Diffstat (limited to 'src/cmd/dist/buildruntime.c')
-rw-r--r-- | src/cmd/dist/buildruntime.c | 84 |
1 files changed, 70 insertions, 14 deletions
diff --git a/src/cmd/dist/buildruntime.c b/src/cmd/dist/buildruntime.c index ba5993b2f..bb774e05f 100644 --- a/src/cmd/dist/buildruntime.c +++ b/src/cmd/dist/buildruntime.c @@ -5,7 +5,7 @@ #include "a.h" /* - * Helpers for building pkg/runtime. + * Helpers for building runtime. */ // mkzversion writes zversion.go: @@ -30,7 +30,8 @@ mkzversion(char *dir, char *file) "package runtime\n" "\n" "const defaultGoroot = `%s`\n" - "const theVersion = `%s`\n", goroot_final, goversion)); + "const theVersion = `%s`\n" + "var buildVersion = theVersion\n", goroot_final, goversion)); writefile(&out, file, 0); @@ -108,10 +109,14 @@ mkzgoos(char *dir, char *file) binit(&b); binit(&out); + + bwritestr(&out, "// auto generated by go tool dist\n\n"); + + if(streq(goos, "linux")) { + bwritestr(&out, "// +build !android\n\n"); + } bwritestr(&out, bprintf(&b, - "// auto generated by go tool dist\n" - "\n" "package runtime\n" "\n" "const theGoos = `%s`\n", goos)); @@ -130,17 +135,14 @@ static struct { {"386", "", "#define get_tls(r) MOVL TLS, r\n" "#define g(r) 0(r)(TLS*1)\n" - "#define m(r) 4(r)(TLS*1)\n" }, {"amd64p32", "", "#define get_tls(r) MOVL TLS, r\n" "#define g(r) 0(r)(TLS*1)\n" - "#define m(r) 4(r)(TLS*1)\n" }, {"amd64", "", "#define get_tls(r) MOVQ TLS, r\n" "#define g(r) 0(r)(TLS*1)\n" - "#define m(r) 8(r)(TLS*1)\n" }, {"arm", "", @@ -160,11 +162,12 @@ mkzasm(char *dir, char *file) { int i, n; char *aggr, *p; - Buf in, b, out, exp; + Buf in, b, b1, out, exp; Vec argv, lines, fields; binit(&in); binit(&b); + binit(&b1); binit(&out); binit(&exp); vinit(&argv); @@ -172,6 +175,10 @@ mkzasm(char *dir, char *file) vinit(&fields); bwritestr(&out, "// auto generated by go tool dist\n\n"); + if(streq(goos, "linux")) { + bwritestr(&out, "// +build !android\n\n"); + } + for(i=0; i<nelem(zasmhdr); i++) { if(hasprefix(goarch, zasmhdr[i].goarch) && hasprefix(goos, zasmhdr[i].goos)) { bwritestr(&out, zasmhdr[i].hdr); @@ -181,6 +188,9 @@ mkzasm(char *dir, char *file) fatal("unknown $GOOS/$GOARCH in mkzasm"); ok: + copyfile(bpathf(&b, "%s/pkg/%s_%s/textflag.h", goroot, goos, goarch), + bpathf(&b1, "%s/src/cmd/ld/textflag.h", goroot), 0); + // Run 6c -D GOOS_goos -D GOARCH_goarch -I workdir -a -n -o workdir/proc.acid proc.c // to get acid [sic] output. Run once without the -a -o workdir/proc.acid in order to // report compilation failures (the -o redirects all messages, unfortunately). @@ -192,6 +202,8 @@ ok: vadd(&argv, bprintf(&b, "GOARCH_%s", goarch)); vadd(&argv, "-I"); vadd(&argv, bprintf(&b, "%s", workdir)); + vadd(&argv, "-I"); + vadd(&argv, bprintf(&b, "%s/pkg/%s_%s", goroot, goos, goarch)); vadd(&argv, "-n"); vadd(&argv, "-a"); vadd(&argv, "-o"); @@ -230,6 +242,12 @@ ok: aggr = "cbctxt"; else if(streq(fields.p[1], "SEH")) aggr = "seh"; + else if(streq(fields.p[1], "Alg")) + aggr = "alg"; + else if(streq(fields.p[1], "Panic")) + aggr = "panic"; + else if(streq(fields.p[1], "Stack")) + aggr = "stack"; } if(hasprefix(lines.p[i], "}")) aggr = nil; @@ -262,6 +280,7 @@ ok: bfree(&in); bfree(&b); + bfree(&b1); bfree(&out); bfree(&exp); vfree(&argv); @@ -283,6 +302,10 @@ mkzsys(char *dir, char *file) binit(&out); bwritestr(&out, "// auto generated by go tool dist\n\n"); + if(streq(goos, "linux")) { + bwritestr(&out, "// +build !android\n\n"); + } + if(streq(goos, "windows")) { bwritef(&out, "// runtime·callbackasm is called by external code to\n" @@ -306,16 +329,20 @@ mkzsys(char *dir, char *file) static char *runtimedefs[] = { "defs.c", + "malloc.c", + "mcache.c", + "mgc0.c", "proc.c", "parfor.c", + "stack.c", }; // mkzruntimedefs writes zruntime_defs_$GOOS_$GOARCH.h, // which contains Go struct definitions equivalent to the C ones. // Mostly we just write the output of 6c -q to the file. // However, we run it on multiple files, so we have to delete -// the duplicated definitions, and we don't care about the funcs -// and consts, so we delete those too. +// the duplicated definitions, and we don't care about the funcs, +// so we delete those too. // void mkzruntimedefs(char *dir, char *file) @@ -335,13 +362,24 @@ mkzruntimedefs(char *dir, char *file) vinit(&seen); bwritestr(&out, "// auto generated by go tool dist\n" - "\n" + "\n"); + + if(streq(goos, "linux")) { + bwritestr(&out, "// +build !android\n\n"); + } + + bwritestr(&out, "package runtime\n" "import \"unsafe\"\n" "var _ unsafe.Pointer\n" "\n" ); + // Do not emit definitions for these. + vadd(&seen, "true"); + vadd(&seen, "false"); + vadd(&seen, "raceenabled"); + vadd(&seen, "allgs"); // Run 6c -D GOOS_goos -D GOARCH_goarch -I workdir -q -n -o workdir/runtimedefs // on each of the runtimedefs C files. @@ -352,6 +390,8 @@ mkzruntimedefs(char *dir, char *file) vadd(&argv, bprintf(&b, "GOARCH_%s", goarch)); vadd(&argv, "-I"); vadd(&argv, bprintf(&b, "%s", workdir)); + vadd(&argv, "-I"); + vadd(&argv, bprintf(&b, "%s/pkg/%s_%s", goroot, goos, goarch)); vadd(&argv, "-q"); vadd(&argv, "-n"); vadd(&argv, "-o"); @@ -371,15 +411,15 @@ mkzruntimedefs(char *dir, char *file) splitlines(&lines, bstr(&in)); for(i=0; i<lines.len; i++) { p = lines.p[i]; - // Drop comment, func, and const lines. - if(hasprefix(p, "//") || hasprefix(p, "const") || hasprefix(p, "func")) + // Drop comment and func lines. + if(hasprefix(p, "//") || hasprefix(p, "func")) continue; // Note beginning of type or var decl, which can be multiline. // Remove duplicates. The linear check of seen here makes the // whole processing quadratic in aggregate, but there are only // about 100 declarations, so this is okay (and simple). - if(hasprefix(p, "type ") || hasprefix(p, "var ")) { + if(hasprefix(p, "type ") || hasprefix(p, "var ") || hasprefix(p, "const ")) { splitfields(&fields, p); if(fields.len < 2) continue; @@ -390,6 +430,17 @@ mkzruntimedefs(char *dir, char *file) } vadd(&seen, fields.p[1]); } + + // Const lines are printed in original case (usually upper). Add a leading _ as needed. + if(hasprefix(p, "const ")) { + if('A' <= p[6] && p[6] <= 'Z') + bwritestr(&out, "const _"); + else + bwritestr(&out, "const "); + bwritestr(&out, p+6); + continue; + } + if(skip) { if(hasprefix(p, "}")) skip = 0; @@ -398,6 +449,11 @@ mkzruntimedefs(char *dir, char *file) bwritestr(&out, p); } + + // Some windows specific const. + if(streq(goos, "windows")) { + bwritestr(&out, bprintf(&b, "const cb_max = %d\n", MAXWINCB)); + } writefile(&out, file, 0); |