summaryrefslogtreecommitdiff
path: root/src/cmd/dist/goc2c.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/cmd/dist/goc2c.c')
-rw-r--r--src/cmd/dist/goc2c.c63
1 files changed, 44 insertions, 19 deletions
diff --git a/src/cmd/dist/goc2c.c b/src/cmd/dist/goc2c.c
index 22f72f8b5..a103bce8d 100644
--- a/src/cmd/dist/goc2c.c
+++ b/src/cmd/dist/goc2c.c
@@ -26,6 +26,11 @@ static char *input;
static Buf *output;
#define EOF -1
+enum
+{
+ use64bitint = 1,
+};
+
static int
xgetchar(void)
{
@@ -86,13 +91,16 @@ 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},
+ /*
+ * variable sized first, for easy replacement.
+ * order matches enum above.
+ * default is 32-bit architecture sizes.
+ * spelling as in package runtime, so intgo/uintgo not int/uint.
+ */
+ {"bool", 1},
{"float", 4},
- {"int", 4},
- {"uint", 4},
+ {"intgo", 4},
+ {"uintgo", 4},
{"uintptr", 4},
{"String", 8},
{"Slice", 12},
@@ -101,17 +109,18 @@ static struct {
/* fixed size */
{"float32", 4},
{"float64", 8},
- {"byte", 1},
- {"int8", 1},
+ {"byte", 1},
+ {"int8", 1},
{"uint8", 1},
{"int16", 2},
{"uint16", 2},
{"int32", 4},
+ {"rune", 4},
{"uint32", 4},
{"int64", 8},
{"uint64", 8},
- {nil},
+ {nil, 0},
};
/* Fixed structure alignment (non-gcc only) */
@@ -328,7 +337,7 @@ read_type(void)
unsigned int len;
p = read_token_no_eof();
- if (*p != '*')
+ if (*p != '*' && !streq(p, "int") && !streq(p, "uint"))
return p;
op = p;
pointer_count = 0;
@@ -337,13 +346,18 @@ read_type(void)
++p;
}
len = xstrlen(p);
- q = xmalloc(len + pointer_count + 1);
+ q = xmalloc(len + 2 + pointer_count + 1);
xmemmove(q, p, len);
- while (pointer_count > 0) {
- q[len] = '*';
- ++len;
- --pointer_count;
+
+ // Turn int/uint into intgo/uintgo.
+ if((len == 3 && xmemcmp(q, "int", 3) == 0) || (len == 4 && xmemcmp(q, "uint", 4) == 0)) {
+ q[len++] = 'g';
+ q[len++] = 'o';
}
+
+ while (pointer_count-- > 0)
+ q[len++] = '*';
+
q[len] = '\0';
xfree(op);
return q;
@@ -570,8 +584,9 @@ write_gcc_func_header(char *package, char *name, struct params *params,
static void
write_gcc_func_trailer(char *package, char *name, struct params *rets)
{
- if (rets == nil)
- ;
+ if (rets == nil) {
+ // nothing to do
+ }
else if (rets->next == nil)
bwritef(output, "return %s;\n", rets->name);
else {
@@ -712,15 +727,25 @@ goc2c(char *goc, char *c)
if(!gcc) {
if(streq(goarch, "amd64")) {
type_table[Uintptr].size = 8;
- type_table[String].size = 16;
- type_table[Slice].size = 8+4+4;
type_table[Eface].size = 8+8;
+ type_table[String].size = 16;
+ if(use64bitint) {
+ type_table[Int].size = 8;
+ type_table[Uint].size = 8;
+ }
+ type_table[Slice].size = 8+2*type_table[Int].size;
structround = 8;
} else {
+ // NOTE: These are set in the initializer,
+ // but they might have been changed by a
+ // previous invocation of goc2c, so we have
+ // to restore them.
type_table[Uintptr].size = 4;
type_table[String].size = 8;
type_table[Slice].size = 16;
type_table[Eface].size = 4+4;
+ type_table[Int].size = 4;
+ type_table[Uint].size = 4;
structround = 4;
}
}