Hi,
On Wednesday, July 6, 2011 14:21 CEST, David Chisnall <[email protected]> wrote: > On 6 Jul 2011, at 13:13, Sebastian Reitenbach wrote: > > > Ivar type: [3[4i]], size: 0 > > > Well, that's obviously wrong, but I can't reproduce it. We can, at least, > work from a simpler test case now though: > > $ cat test.c > #include <stdio.h> > size_t objc_sizeof_type(const char*); > > int main(void) > { > printf("%d\n", (int)objc_sizeof_type("[3[4i]]")); > return 0; > } > $ cc size.c -lobjc && ./a.out > 48 mine is looking a bit differently: $ cc test.c -L/usr/local/lib -lobjc -pthread $ ./a.out 0 $ running it in gdb, I see the following: $ gdb a.out GNU gdb 6.3 Copyright 2004 Free Software Foundation, Inc. GDB is free software, covered by the GNU General Public License, and you are welcome to change it and/or distribute copies of it under certain conditions. Type "show copying" to see the conditions. There is absolutely no warranty for GDB. Type "show warranty" for details. This GDB was configured as "sparc64-unknown-openbsd4.9"...(no debugging symbols found) (gdb) break objc_sizeof_type Breakpoint 1 at 0x400ea0 (gdb) r Starting program: /home/sebastia/a.out Breakpoint 1 at 0x204d65604: file encoding2.c, line 319. Breakpoint 1, objc_sizeof_type (type=0x200c10 "[3[4i]]") at encoding2.c:319 319 sizeof_type(type, &size); (gdb) list 314 } 315 316 size_t objc_sizeof_type(const char *type) 317 { 318 size_t size = 0; 319 sizeof_type(type, &size); 320 return size / 8; 321 } 322 323 size_t objc_alignof_type (const char *type) (gdb) print type $1 = 0x200c10 "[3[4i]]" (gdb) s sizeof_type (type=0x200c10 "[3[4i]]", size=0xfffffffffffdebd8) at encoding2.c:152 152 type = objc_skip_type_qualifiers(type); (gdb) print $2 = 0x200c10 "[3[4i]]" (gdb) list 147 148 static const char *sizeof_union_field(const char *type, size_t *size); 149 150 static const char *sizeof_type(const char *type, size_t *size) 151 { 152 type = objc_skip_type_qualifiers(type); 153 switch (*type) 154 { 155 // For all primitive types, we round up the current size to the 156 // required alignment of the type, then add the size (gdb) print *type $3 = 91 '[' (gdb) list 157 #define APPLY_TYPE(typeName, name, capitalizedName, encodingChar) \ 158 case encodingChar:\ 159 {\ 160 round_up(size, (alignof(typeName) * 8));\ 161 *size += (sizeof(typeName) * 8);\ 162 return type + 1;\ 163 } 164 #define NON_INTEGER_TYPES 1 165 #include "type_encoding_cases.h" 166 case '?': (gdb) s objc_skip_type_qualifiers (type=0x200c10 "[3[4i]]") at encoding2.c:20 20 while('\0' != *type && strchr(type_qualifiers, *type)) (gdb) list 15 #define alignof(type) __builtin_offsetof(struct { const char c; type member; }, member) 16 17 const char *objc_skip_type_qualifiers (const char *type) 18 { 19 static const char *type_qualifiers = "rnNoORV"; 20 while('\0' != *type && strchr(type_qualifiers, *type)) 21 { 22 type++; 23 } 24 return type; (gdb) s 18 { (gdb) 0x0000000204d64c94 in objc_exception_throw () at encoding2.c:85 85 static void parse_struct_or_union(const char **type, type_parser callback, void *context, char endchar) (gdb) list 80 // skip ] 81 (*type)++; 82 return element_count; 83 } 84 85 static void parse_struct_or_union(const char **type, type_parser callback, void *context, char endchar) 86 { 87 // Skip the ( and structure name 88 do 89 { (gdb) s 0x0000000204d64c98 85 static void parse_struct_or_union(const char **type, type_parser callback, void *context, char endchar) (gdb) s objc_skip_type_qualifiers (type=0x200c10 "[3[4i]]") at encoding2.c:20 20 while('\0' != *type && strchr(type_qualifiers, *type)) (gdb) strchr (p=0x204e74c68 "rnNoORV", ch=91) at /usr/src/lib/libc/string/index.c:41 41 /usr/src/lib/libc/string/index.c: No such file or directory. in /usr/src/lib/libc/string/index.c (gdb) 39 in /usr/src/lib/libc/string/index.c (gdb) n 0x00000002054416c0 in getenv () at /usr/src/lib/libc/string/index.c:38 38 in /usr/src/lib/libc/string/index.c (gdb) 0x00000002054416c4 38 in /usr/src/lib/libc/string/index.c (gdb) strchr (p=0x204e74c68 "rnNoORV", ch=91) at /usr/src/lib/libc/string/index.c:41 41 in /usr/src/lib/libc/string/index.c (gdb) 43 in /usr/src/lib/libc/string/index.c (gdb) 43 in /usr/src/lib/libc/string/index.c (gdb) 43 in /usr/src/lib/libc/string/index.c (gdb) 43 in /usr/src/lib/libc/string/index.c (gdb) 43 in /usr/src/lib/libc/string/index.c (gdb) 43 in /usr/src/lib/libc/string/index.c (gdb) 43 in /usr/src/lib/libc/string/index.c (gdb) 43 in /usr/src/lib/libc/string/index.c (gdb) 47 in /usr/src/lib/libc/string/index.c (gdb) objc_skip_type_qualifiers (type=0x200c10 "[3[4i]]") at encoding2.c:20 20 while('\0' != *type && strchr(type_qualifiers, *type)) (gdb) 25 } (gdb) sizeof_type (type=0x200c10 "[3[4i]]", size=0xfffffffffffdebd8) at encoding2.c:153 153 switch (*type) (gdb) 196 int element_count = parse_array(&t, (type_parser)sizeof_type, &element_size); (gdb) list 191 case '[': 192 { 193 const char *t = type; 194 int element_size = 0; 195 // FIXME: aligned size 196 int element_count = parse_array(&t, (type_parser)sizeof_type, &element_size); 197 (*size) += element_size * element_count; 198 return t; 199 } 200 case '(': (gdb) print t Variable "t" is not available. (gdb) print *t Variable "t" is not available. (gdb) print type $4 = 0x200c10 "[3[4i]]" (gdb) s 193 const char *t = type; (gdb) 196 int element_count = parse_array(&t, (type_parser)sizeof_type, &element_size); (gdb) 194 int element_size = 0; (gdb) list 189 return t; 190 } 191 case '[': 192 { 193 const char *t = type; 194 int element_size = 0; 195 // FIXME: aligned size 196 int element_count = parse_array(&t, (type_parser)sizeof_type, &element_size); 197 (*size) += element_size * element_count; 198 return t; (gdb) s 196 int element_count = parse_array(&t, (type_parser)sizeof_type, &element_size); (gdb) parse_array (type=0xfffffffffffdeb08, callback=0x204d652a0 <sizeof_type>, context=0xfffffffffffdeb00) at encoding2.c:77 77 (*type)++; (gdb) list 72 typedef const char *(*type_parser)(const char*, void*); 73 74 static int parse_array(const char **type, type_parser callback, void *context) 75 { 76 // skip [ 77 (*type)++; 78 int element_count = (int)strtol(*type, (char**)type, 10); 79 *type = callback(*type, context); 80 // skip ] 81 (*type)++; (gdb) print type $5 = (const char **) 0xfffffffffffdeb08 (gdb) print *type $6 = 0x200c10 "[3[4i]]" (gdb) s 78 int element_count = (int)strtol(*type, (char**)type, 10); (gdb) print *type $7 = 0x200c10 "[3[4i]]" (gdb) s 75 { (gdb) list 70 71 72 typedef const char *(*type_parser)(const char*, void*); 73 74 static int parse_array(const char **type, type_parser callback, void *context) 75 { 76 // skip [ 77 (*type)++; 78 int element_count = (int)strtol(*type, (char**)type, 10); 79 *type = callback(*type, context); (gdb) print element_count No symbol "element_count" in current context. (gdb) s 77 (*type)++; (gdb) 78 int element_count = (int)strtol(*type, (char**)type, 10); (gdb) print type $8 = (const char **) 0xfffffffffffdeb08 (gdb) print *type $9 = 0x200c10 "[3[4i]]" (gdb) s strtol (nptr=0x200c11 "3[4i]]", endptr=0xfffffffffffdeb08, base=10) at ctype.h:133 133 return (c == -1 ? 0 : ((_ctype_ + 1)[(unsigned char)c] & _S)); (gdb) list 128 return (c == -1 ? 0 : ((_ctype_ + 1)[(unsigned char)c] & _P)); 129 } 130 131 __only_inline int isspace(int c) 132 { 133 return (c == -1 ? 0 : ((_ctype_ + 1)[(unsigned char)c] & _S)); 134 } 135 136 __only_inline int isupper(int c) 137 { (gdb) s 45 /usr/src/lib/libc/stdlib/strtol.c: No such file or directory. in /usr/src/lib/libc/stdlib/strtol.c (gdb) 0x0000000205424a20 in strpbrk () at /usr/src/lib/libc/stdlib/strtol.c:44 44 in /usr/src/lib/libc/stdlib/strtol.c (gdb) 0x0000000205424a24 44 in /usr/src/lib/libc/stdlib/strtol.c (gdb) strtol (nptr=0x200c11 "3[4i]]", endptr=0xfffffffffffdeb08, base=10) at ctype.h:133 133 return (c == -1 ? 0 : ((_ctype_ + 1)[(unsigned char)c] & _S)); (gdb) 58 /usr/src/lib/libc/stdlib/strtol.c: No such file or directory. in /usr/src/lib/libc/stdlib/strtol.c (gdb) 133 return (c == -1 ? 0 : ((_ctype_ + 1)[(unsigned char)c] & _S)); (gdb) 59 /usr/src/lib/libc/stdlib/strtol.c: No such file or directory. in /usr/src/lib/libc/stdlib/strtol.c (gdb) 60 in /usr/src/lib/libc/stdlib/strtol.c (gdb) 65 in /usr/src/lib/libc/stdlib/strtol.c (gdb) 68 in /usr/src/lib/libc/stdlib/strtol.c (gdb) n 74 in /usr/src/lib/libc/stdlib/strtol.c (gdb) 94 in /usr/src/lib/libc/stdlib/strtol.c (gdb) 95 in /usr/src/lib/libc/stdlib/strtol.c (gdb) 96 in /usr/src/lib/libc/stdlib/strtol.c (gdb) 129 in /usr/src/lib/libc/stdlib/strtol.c (gdb) 102 in /usr/src/lib/libc/stdlib/strtol.c (gdb) 119 in /usr/src/lib/libc/stdlib/strtol.c (gdb) 102 in /usr/src/lib/libc/stdlib/strtol.c (gdb) 129 in /usr/src/lib/libc/stdlib/strtol.c (gdb) 105 in /usr/src/lib/libc/stdlib/strtol.c (gdb) 111 in /usr/src/lib/libc/stdlib/strtol.c (gdb) 113 in /usr/src/lib/libc/stdlib/strtol.c (gdb) 115 in /usr/src/lib/libc/stdlib/strtol.c (gdb) 126 in /usr/src/lib/libc/stdlib/strtol.c (gdb) 133 in /usr/src/lib/libc/stdlib/strtol.c (gdb) 104 in /usr/src/lib/libc/stdlib/strtol.c (gdb) 133 in /usr/src/lib/libc/stdlib/strtol.c (gdb) 104 in /usr/src/lib/libc/stdlib/strtol.c (gdb) 105 in /usr/src/lib/libc/stdlib/strtol.c (gdb) 98 return (c == -1 ? 0 : ((_ctype_ + 1)[(unsigned char)c] & (_U|_L))); (gdb) 107 /usr/src/lib/libc/stdlib/strtol.c: No such file or directory. in /usr/src/lib/libc/stdlib/strtol.c (gdb) 137 in /usr/src/lib/libc/stdlib/strtol.c (gdb) 138 in /usr/src/lib/libc/stdlib/strtol.c (gdb) parse_array (type=0xfffffffffffdeb08, callback=0x204d652a0 <sizeof_type>, context=0xfffffffffffdeb00) at encoding2.c:79 79 *type = callback(*type, context); (gdb) 81 (*type)++; (gdb) 83 } (gdb) list 78 int element_count = (int)strtol(*type, (char**)type, 10); 79 *type = callback(*type, context); 80 // skip ] 81 (*type)++; 82 return element_count; 83 } 84 85 static void parse_struct_or_union(const char **type, type_parser callback, void *context, char endchar) 86 { 87 // Skip the ( and structure name (gdb) 88 do 89 { 90 (*type)++; 91 // Opaque type has no =definition 92 if (endchar == **type) { (*type)++; return; } 93 } while('=' != **type); 94 // Skip = 95 (*type)++; 96 97 while (**type != endchar) (gdb) print type $10 = (const char **) 0xfffffffffffdeb08 (gdb) print *type $11 = 0x200c17 "" (gdb) n sizeof_type (type=0x200c10 "[3[4i]]", size=0xfffffffffffdebd8) at encoding2.c:198 198 return t; (gdb) print t $12 = 0x200c17 "" (gdb) s 197 (*size) += element_size * element_count; (gdb) print element_size $13 = 0 (gdb) print element_count No symbol "element_count" in current context. (gdb) s objc_sizeof_type (type=0x200c10 "[3[4i]]") at encoding2.c:321 321 } (gdb) list 316 size_t objc_sizeof_type(const char *type) 317 { 318 size_t size = 0; 319 sizeof_type(type, &size); 320 return size / 8; 321 } 322 323 size_t objc_alignof_type (const char *type) 324 { 325 size_t align = 0; (gdb) print size $14 = 0 (gdb) in the strtol manual page I read: RETURN VALUES The strtol(), strtoll(), strtoimax(), and strtoq() functions return the result of the conversion, unless the value would underflow or overflow. If no conversion could be performed, 0 is returned; Does that mean now that there is no conversion done on that string? Sebastian > > On SPARC64, I think sizeof(int) is 8, so I'd expect this to be 96. If it > isn't, we need to work out why. Can you step through this call and see if > it's doing anything obviously wrong? > > David > > -- Sent from my PDP-11 > _______________________________________________ Discuss-gnustep mailing list [email protected] https://lists.gnu.org/mailman/listinfo/discuss-gnustep
