diff leo-obj/tool/richsym.c @ 149:fdf3137c703a

tiobjd richsym handling: prep for handling function locals
author Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
date Tue, 29 Apr 2014 07:11:33 +0000
parents 13cc7e19ecec
children df01a4f4c272
line wrap: on
line diff
--- a/leo-obj/tool/richsym.c	Tue Apr 29 06:45:45 2014 +0000
+++ b/leo-obj/tool/richsym.c	Tue Apr 29 07:11:33 2014 +0000
@@ -136,6 +136,8 @@
 get_base_type_of_syment(sym, is_typedef)
 	struct internal_syment *sym;
 {
+	unsigned idx;
+
 	switch (sym->type & 0xF) {
 	case T_VOID:
 		return("void");
@@ -155,14 +157,23 @@
 	case T_DOUBLE:
 		return("double");
 	case T_STRUCT:
-		return get_struct_type_name(get_u32(sym->aux), C_STRTAG,
-						is_typedef);
+		idx = get_u32(sym->aux);
+		if (idx)
+			return get_struct_type_name(idx, C_STRTAG, is_typedef);
+		else
+			return("struct ?");
 	case T_UNION:
-		return get_struct_type_name(get_u32(sym->aux), C_UNTAG,
-						is_typedef);
+		idx = get_u32(sym->aux);
+		if (idx)
+			return get_struct_type_name(idx, C_UNTAG, is_typedef);
+		else
+			return("union ?");
 	case T_ENUM:
-		return get_struct_type_name(get_u32(sym->aux), C_ENTAG,
-						is_typedef);
+		idx = get_u32(sym->aux);
+		if (idx)
+			return get_struct_type_name(idx, C_ENTAG, is_typedef);
+		else
+			return("enum ?");
 	case T_UCHAR:
 		if (is_typedef)
 			return("unsigned char");
@@ -185,6 +196,31 @@
 	}
 }
 
+static char *
+cdecl_obj_name(sym)
+	struct internal_syment *sym;
+{
+	char *buf;
+	int isund, len;
+
+	isund = (sym->name[0] == '_');
+	len = strlen(sym->name) + 1;
+	if (isund)
+		len--;
+	else
+		len += 2;
+	buf = malloc(len);
+	if (!buf) {
+		perror("malloc");
+		exit(1);
+	}
+	if (isund)
+		strcpy(buf, sym->name + 1);
+	else
+		sprintf(buf, "\"%s\"", sym->name);
+	return(buf);
+}
+
 richsym_print_in_c(prefix, sym, is_typedef)
 	char *prefix;
 	struct internal_syment *sym;
@@ -194,12 +230,7 @@
 
 	base_type = get_base_type_of_syment(sym, is_typedef);
 	dertype = sym->type >> 4;
-	s1 = malloc(strlen(sym->name));
-	if (!s1) {
-		perror("malloc");
-		exit(1);
-	}
-	strcpy(s1, sym->name + 1);
+	s1 = cdecl_obj_name(sym);
 	last_ptr = 0;
 	narray = 0;
 	for (; dertype; dertype >>= 2) {