From 5b8bcf2324fab8a5b7c32886dda828b934645ecc Mon Sep 17 00:00:00 2001 From: Russ Cox Date: Tue, 11 Jan 2011 11:12:15 -0500 Subject: [PATCH] godefs: better handling of enums Fixes #432. R=r, r2 CC=golang-dev https://golang.org/cl/3869043 --- src/cmd/godefs/main.c | 2 ++ src/cmd/godefs/stabs.c | 13 +++++++++++-- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/src/cmd/godefs/main.c b/src/cmd/godefs/main.c index cdecd6e8d8..69ee1be5db 100644 --- a/src/cmd/godefs/main.c +++ b/src/cmd/godefs/main.c @@ -373,6 +373,8 @@ Continue: prefix = prefixlen(t); for(j=0; jnf; j++) { f = &t->f[j]; + if(f->type->kind == 0) + continue; // padding if(t->kind == Struct || lang == &go) { if(f->offset%8 != 0 || f->size%8 != 0) { diff --git a/src/cmd/godefs/stabs.c b/src/cmd/godefs/stabs.c index 8d3be19134..1bc96d4c8c 100644 --- a/src/cmd/godefs/stabs.c +++ b/src/cmd/godefs/stabs.c @@ -363,13 +363,22 @@ parsedef(char **pp, char *name) return nil; } + while(f->type->kind == Typedef) + f->type = f->type->type; + if(f->type->kind == 0 && f->size <= 64 && (f->size&(f->size-1)) == 0) { + // unknown type but <= 64 bits and bit size is a power of two. + // could be enum - make Uint64 and then let it reduce + tt = emalloc(sizeof *tt); + *tt = *f->type; + f->type = tt; + tt->kind = Uint64; + } + // rewrite // uint32 x : 8; // into // uint8 x; // hooray for bitfields. - while(f->type->kind == Typedef) - f->type = f->type->type; while(Int16 <= f->type->kind && f->type->kind <= Uint64 && kindsize[f->type->kind] > f->size) { tt = emalloc(sizeof *tt); *tt = *f->type; -- 2.48.1