@@ -536,35 +536,35 @@
$(CC_FOR_BUILD) $(CFLAGS_FOR_BUILD) $(LDFLAGS_FOR_BUILD) -o $@ $<
malloc.c: $(srcdir)/runtime/malloc.goc goc2c
- ./goc2c --gcc $< > $@.tmp
+ ./goc2c $< > $@.tmp
mv -f $@.tmp $@
mprof.c: $(srcdir)/runtime/mprof.goc goc2c
- ./goc2c --gcc $< > $@.tmp
+ ./goc2c $< > $@.tmp
mv -f $@.tmp $@
reflect.c: $(srcdir)/runtime/reflect.goc goc2c
- ./goc2c --gcc $< > $@.tmp
+ ./goc2c $< > $@.tmp
mv -f $@.tmp $@
runtime1.c: $(srcdir)/runtime/runtime1.goc goc2c
- ./goc2c --gcc $< > $@.tmp
+ ./goc2c $< > $@.tmp
mv -f $@.tmp $@
sema.c: $(srcdir)/runtime/sema.goc goc2c
- ./goc2c --gcc $< > $@.tmp
+ ./goc2c $< > $@.tmp
mv -f $@.tmp $@
sigqueue.c: $(srcdir)/runtime/sigqueue.goc goc2c
- ./goc2c --gcc --go-pkgpath os_signal $< > $@.tmp
+ ./goc2c --go-pkgpath os_signal $< > $@.tmp
mv -f $@.tmp $@
time.c: $(srcdir)/runtime/time.goc goc2c
- ./goc2c --gcc $< > $@.tmp
+ ./goc2c $< > $@.tmp
mv -f $@.tmp $@
%.c: $(srcdir)/runtime/%.goc goc2c
- ./goc2c --gcc $< > $@.tmp
+ ./goc2c $< > $@.tmp
mv -f $@.tmp $@
go_bufio_files = \
@@ -30,13 +30,10 @@
#include <string.h>
#include <errno.h>
-/* Whether we're emitting for gcc */
-static int gcc;
-
-/* Package path to use; only meaningful for gcc */
+/* Package path to use. */
static const char *pkgpath;
-/* Package prefix to use; only meaningful for gcc */
+/* Package prefix to use. */
static const char *prefix;
/* File and line number */
@@ -50,53 +47,6 @@
char *type;
};
-/* index into type_table */
-enum {
- Bool,
- Float,
- Int,
- Uint,
- Uintptr,
- String,
- Slice,
- Eface,
-};
-
-static struct {
- char *name;
- int size;
-} type_table[] = {
- /* variable sized first, for easy replacement */
- /* order matches enum above */
- /* default is 32-bit architecture sizes */
- "bool", 1,
- "float", 4,
- "int", 4,
- "uint", 4,
- "uintptr", 4,
- "String", 8,
- "Slice", 12,
- "Eface", 8,
-
- /* fixed size */
- "float32", 4,
- "float64", 8,
- "byte", 1,
- "int8", 1,
- "uint8", 1,
- "int16", 2,
- "uint16", 2,
- "int32", 4,
- "uint32", 4,
- "int64", 8,
- "uint64", 8,
-
- NULL,
-};
-
-/* Fixed structure alignment (non-gcc only) */
-int structround = 4;
-
char *argv0;
static void
@@ -147,6 +97,15 @@
return ret;
}
+/* Copy a string into memory without fail. */
+static char *
+xstrdup(const char *p)
+{
+ char *ret = xmalloc(strlen(p) + 1);
+ strcpy(ret, p);
+ return ret;
+}
+
/* Free a list of parameters. */
static void
free_params(struct params *p)
@@ -351,14 +310,29 @@
unsigned int len;
p = read_token_no_eof();
- if (*p != '*')
+ if (*p != '*') {
+ /* Convert the Go type "int" to the C type "intgo",
+ and similarly for "uint". */
+ if (strcmp(p, "int") == 0)
+ return xstrdup("intgo");
+ else if (strcmp(p, "uint") == 0)
+ return xstrdup("uintgo");
return p;
+ }
op = p;
pointer_count = 0;
while (*p == '*') {
++pointer_count;
++p;
}
+
+ /* Convert the Go type "int" to the C type "intgo", and
+ similarly for "uint". */
+ if (strcmp(p, "int") == 0)
+ p = (char *) "intgo";
+ else if (strcmp(p, "uint") == 0)
+ p = (char *) "uintgo";
+
len = strlen(p);
q = xmalloc(len + pointer_count + 1);
memcpy(q, p, len);
@@ -372,39 +346,19 @@
return q;
}
-/* Return the size of the given type. */
-static int
-type_size(char *p)
-{
- int i;
-
- if(p[strlen(p)-1] == '*')
- return type_table[Uintptr].size;
-
- for(i=0; type_table[i].name; i++)
- if(strcmp(type_table[i].name, p) == 0)
- return type_table[i].size;
- if(!gcc) {
- sysfatal("%s:%ud: unknown type %s\n", file, lineno, p);
- }
- return 1;
-}
-
/*
* Read a list of parameters. Each parameter is a name and a type.
* The list ends with a ')'. We have already read the '('.
*/
static struct params *
-read_params(int *poffset)
+read_params()
{
char *token;
struct params *ret, **pp, *p;
- int offset, size, rnd;
ret = NULL;
pp = &ret;
token = read_token_no_eof();
- offset = 0;
if (strcmp(token, ")") != 0) {
while (1) {
p = xmalloc(sizeof(struct params));
@@ -414,14 +368,6 @@
*pp = p;
pp = &p->next;
- size = type_size(p->type);
- rnd = size;
- if(rnd > structround)
- rnd = structround;
- if(offset%rnd)
- offset += rnd - offset%rnd;
- offset += size;
-
token = read_token_no_eof();
if (strcmp(token, ",") != 0)
break;
@@ -432,8 +378,6 @@
sysfatal("%s:%ud: expected '('\n",
file, lineno);
}
- if (poffset != NULL)
- *poffset = offset;
return ret;
}
@@ -442,7 +386,7 @@
* '{' character. Returns 1 if it read a header, 0 at EOF.
*/
static int
-read_func_header(char **name, struct params **params, int *paramwid, struct params **rets)
+read_func_header(char **name, struct params **params, struct params **rets)
{
int lastline;
char *token;
@@ -474,13 +418,13 @@
sysfatal("%s:%ud: expected \"(\"\n",
file, lineno);
}
- *params = read_params(paramwid);
+ *params = read_params();
token = read_token();
if (token == NULL || strcmp(token, "(") != 0)
*rets = NULL;
else {
- *rets = read_params(NULL);
+ *rets = read_params();
token = read_token();
}
if (token == NULL || strcmp(token, "{") != 0) {
@@ -505,43 +449,6 @@
}
}
-/* Write a 6g function header. */
-static void
-write_6g_func_header(char *package, char *name, struct params *params,
- int paramwid, struct params *rets)
-{
- int first, n;
-
- printf("void\n%s·%s(", package, name);
- first = 1;
- write_params(params, &first);
-
- /* insert padding to align output struct */
- if(rets != NULL && paramwid%structround != 0) {
- n = structround - paramwid%structround;
- if(n & 1)
- printf(", uint8");
- if(n & 2)
- printf(", uint16");
- if(n & 4)
- printf(", uint32");
- }
-
- write_params(rets, &first);
- printf(")\n{\n");
-}
-
-/* Write a 6g function trailer. */
-static void
-write_6g_func_trailer(struct params *rets)
-{
- struct params *p;
-
- for (p = rets; p != NULL; p = p->next)
- printf("\tFLUSH(&%s);\n", p->name);
- printf("}\n");
-}
-
/* Define the gcc function return type if necessary. */
static void
define_gcc_return_type(char *package, char *name, struct params *rets)
@@ -619,14 +526,10 @@
/* Write out a function header. */
static void
-write_func_header(char *package, char *name,
- struct params *params, int paramwid,
+write_func_header(char *package, char *name, struct params *params,
struct params *rets)
{
- if (gcc)
- write_gcc_func_header(package, name, params, rets);
- else
- write_6g_func_header(package, name, params, paramwid, rets);
+ write_gcc_func_header(package, name, params, rets);
printf("#line %d \"%s\"\n", lineno, file);
}
@@ -635,10 +538,7 @@
write_func_trailer(char *package, char *name,
struct params *rets)
{
- if (gcc)
- write_gcc_func_trailer(package, name, rets);
- else
- write_6g_func_trailer(rets);
+ write_gcc_func_trailer(package, name, rets);
}
/*
@@ -713,12 +613,11 @@
{
char *package, *name;
struct params *params, *rets;
- int paramwid;
package = read_package();
read_preprocessor_lines();
- while (read_func_header(&name, ¶ms, ¶mwid, &rets)) {
- write_func_header(package, name, params, paramwid, rets);
+ while (read_func_header(&name, ¶ms, &rets)) {
+ write_func_header(package, name, params, rets);
copy_body();
write_func_trailer(package, name, rets);
free(name);
@@ -731,7 +630,7 @@
static void
usage(void)
{
- sysfatal("Usage: goc2c [--6g | --gc] [--go-pkgpath PKGPATH] [--go-prefix PREFIX] [file]\n");
+ sysfatal("Usage: goc2c [--go-pkgpath PKGPATH] [--go-prefix PREFIX] [file]\n");
}
void
@@ -743,11 +642,7 @@
while(argc > 1 && argv[1][0] == '-') {
if(strcmp(argv[1], "-") == 0)
break;
- if(strcmp(argv[1], "--6g") == 0)
- gcc = 0;
- else if(strcmp(argv[1], "--gcc") == 0)
- gcc = 1;
- else if (strcmp(argv[1], "--go-pkgpath") == 0 && argc > 2) {
+ if (strcmp(argv[1], "--go-pkgpath") == 0 && argc > 2) {
pkgpath = argv[2];
argc--;
argv++;
@@ -775,18 +670,6 @@
sysfatal("open %s: %r\n", file);
}
- if(!gcc) {
- // 6g etc; update size table
- goarch = getenv("GOARCH");
- if(goarch != NULL && strcmp(goarch, "amd64") == 0) {
- type_table[Uintptr].size = 8;
- type_table[String].size = 16;
- type_table[Slice].size = 8+4+4;
- type_table[Eface].size = 8+8;
- structround = 8;
- }
- }
-
printf("// AUTO-GENERATED by autogen.sh; DO NOT EDIT\n\n");
process_file();
exit(0);