summaryrefslogtreecommitdiff
path: root/src/cmd
diff options
context:
space:
mode:
authorRuss Cox <rsc@golang.org>2014-08-12 21:41:42 -0400
committerRuss Cox <rsc@golang.org>2014-08-12 21:41:42 -0400
commit83018e2fdd2eaf0f295a2575ba195abfaee2b69b (patch)
treeb9ef147a245199f3339394ce2ab816474268d87d /src/cmd
parent663439491633ff0aa013d32de4a67c97483ac926 (diff)
downloadgo-83018e2fdd2eaf0f295a2575ba195abfaee2b69b.tar.gz
[dev.power64] cmd/9a: use new flag parser
Copy main from 6a. Fixes various things, but the main thing is the use of the new flag parser. The go command expects to be able to use -trimpath and not have it be interpreted as -t rimpath. LGTM=minux R=minux CC=golang-codereviews https://codereview.appspot.com/126100043
Diffstat (limited to 'src/cmd')
-rw-r--r--src/cmd/9a/lex.c129
1 files changed, 65 insertions, 64 deletions
diff --git a/src/cmd/9a/lex.c b/src/cmd/9a/lex.c
index a9ad01eac..116618f25 100644
--- a/src/cmd/9a/lex.c
+++ b/src/cmd/9a/lex.c
@@ -51,29 +51,53 @@ systemtype(int sys)
}
int
+pathchar(void)
+{
+ return '/';
+}
+
+int
Lconv(Fmt *fp)
{
return linklinefmt(ctxt, fp);
}
-int
-pathchar(void)
+void
+dodef(char *p)
{
- return '/';
+ if(nDlist%8 == 0)
+ Dlist = allocn(Dlist, nDlist*sizeof(char *),
+ 8*sizeof(char *));
+ Dlist[nDlist++] = p;
+}
+
+LinkArch* thelinkarch = &linkpower64;
+
+void
+usage(void)
+{
+ print("usage: %ca [options] file.c...\n", thechar);
+ flagprint(1);
+ errorexit();
}
void
main(int argc, char *argv[])
{
char *p;
- int c;
thechar = '9';
- thestring = getgoarch();
- if(strcmp(thestring, "power64le") == 0)
- ctxt = linknew(&linkpower64le);
- else
- ctxt = linknew(&linkpower64);
+ thestring = "power64";
+
+ // Allow GOARCH=thestring or GOARCH=thestringsuffix,
+ // but not other values.
+ p = getgoarch();
+ if(strncmp(p, thestring, strlen(thestring)) != 0)
+ sysfatal("cannot use %cc with GOARCH=%s", thechar, p);
+ if(strcmp(p, "power64le") == 0)
+ thelinkarch = &linkpower64le;
+
+ ctxt = linknew(thelinkarch);
ctxt->diag = yyerror;
ctxt->bso = &bstdout;
Binit(&bstdout, 1, OWRITE);
@@ -85,79 +109,57 @@ main(int argc, char *argv[])
cinit();
outfile = 0;
setinclude(".");
- ARGBEGIN {
- default:
- c = ARGC();
- if(c >= 0 && c < sizeof(debug))
- debug[c] = 1;
- break;
-
- case 'o':
- outfile = ARGF();
- break;
-
- case 'D':
- p = ARGF();
- if(p) {
- if (nDlist%8 == 0)
- Dlist = allocn(Dlist, nDlist*sizeof(char *),
- 8*sizeof(char *));
- Dlist[nDlist++] = p;
- }
- break;
-
- case 'I':
- p = ARGF();
- setinclude(p);
- break;
-
- case 'S':
- ctxt->debugasm++;
- break;
- } ARGEND
- if(*argv == 0) {
- print("usage: %ca [-options] file.s\n", thechar);
- errorexit();
- }
+
+ flagfn1("D", "name[=value]: add #define", dodef);
+ flagfn1("I", "dir: add dir to include path", setinclude);
+ flagcount("S", "print assembly and machine code", &debug['S']);
+ flagcount("m", "debug preprocessor macros", &debug['m']);
+ flagstr("o", "file: set output file", &outfile);
+ flagstr("trimpath", "prefix: remove prefix from recorded source file paths", &ctxt->trimpath);
+
+ flagparse(&argc, &argv, usage);
+ ctxt->debugasm = debug['S'];
+
+ if(argc < 1)
+ usage();
if(argc > 1){
print("can't assemble multiple files\n");
errorexit();
}
+
if(assemble(argv[0]))
errorexit();
+ Bflush(&bstdout);
exits(0);
}
int
assemble(char *file)
{
- char ofile[100], incfile[20], *p;
+ char *ofile, *p;
int i, of;
+ ofile = alloc(strlen(file)+3); // +3 for .x\0 (x=thechar)
strcpy(ofile, file);
- if(p = strrchr(ofile, pathchar())) {
+ p = utfrrune(ofile, pathchar());
+ if(p) {
include[0] = ofile;
*p++ = 0;
} else
p = ofile;
if(outfile == 0) {
outfile = p;
- if(p = strrchr(outfile, '.'))
- if(p[1] == 's' && p[2] == 0)
- p[0] = 0;
- p = strrchr(outfile, 0);
- p[0] = '.';
- p[1] = thechar;
- p[2] = 0;
- }
- p = getenv("INCLUDE");
- if(p) {
- setinclude(p);
- } else {
- if(systemtype(Plan9)) {
- sprint(incfile,"/%s/include", thestring);
- setinclude(strdup(incfile));
- }
+ if(outfile){
+ p = utfrrune(outfile, '.');
+ if(p)
+ if(p[1] == 's' && p[2] == 0)
+ p[0] = 0;
+ p = utfrune(outfile, 0);
+ p[0] = '.';
+ p[1] = thechar;
+ p[2] = 0;
+ } else
+ outfile = "/dev/null";
}
of = create(outfile, OWRITE, 0664);
@@ -166,10 +168,9 @@ assemble(char *file)
errorexit();
}
Binit(&obuf, of, OWRITE);
- Bprint(&obuf, "go object %s %s %s\n", getgoos(), thestring, getgoversion());
- Bprint(&obuf, "\n!\n");
+ Bprint(&obuf, "go object %s %s %s\n", getgoos(), getgoarch(), getgoversion());
+ Bprint(&obuf, "!\n");
- pass = 1;
for(pass = 1; pass <= 2; pass++) {
nosched = 0;
pinit(file);