|
29 | 29 | /* #define DEBUG_PRINT(...) fprintf(stderr, __VA_ARGS__) */ |
30 | 30 | #define DEBUG_PRINT(...) |
31 | 31 |
|
| 32 | +/* BTF integer encoding macros (if not already defined in libbpf) */ |
| 33 | +#ifndef BTF_INT_ENCODING |
| 34 | +#define BTF_INT_ENCODING(VAL) (((VAL) & 0x0f000000) >> 24) |
| 35 | +#endif |
| 36 | +#ifndef BTF_INT_OFFSET |
| 37 | +#define BTF_INT_OFFSET(VAL) (((VAL) & 0x00ff0000) >> 16) |
| 38 | +#endif |
| 39 | +#ifndef BTF_INT_BITS |
| 40 | +#define BTF_INT_BITS(VAL) ((VAL) & 0x000000ff) |
| 41 | +#endif |
| 42 | + |
32 | 43 | /* Custom block for BTF handle */ |
33 | 44 | #define BTF_HANDLE_TAG 0 |
34 | 45 |
|
@@ -267,14 +278,23 @@ static char* resolve_type_to_string(struct btf *btf, int type_id) { |
267 | 278 | } |
268 | 279 |
|
269 | 280 | switch (kind) { |
270 | | - case BTF_KIND_INT: |
| 281 | + case BTF_KIND_INT: { |
| 282 | + /* Check encoding to determine if signed or unsigned */ |
| 283 | + __u32 *info_ptr = (__u32 *)(t + 1); |
| 284 | + __u32 info = *info_ptr; |
| 285 | + __u32 encoding = BTF_INT_ENCODING(info); |
| 286 | + |
| 287 | + /* BTF_INT_SIGNED is defined as 0x1 in BTF specification */ |
| 288 | + int is_signed = (encoding & 0x1) != 0; |
| 289 | + |
271 | 290 | switch (t->size) { |
272 | | - case 1: return strdup("u8"); |
273 | | - case 2: return strdup("u16"); |
274 | | - case 4: return strdup("u32"); |
275 | | - case 8: return strdup("u64"); |
276 | | - default: return strdup("u32"); |
| 291 | + case 1: return strdup(is_signed ? "i8" : "u8"); |
| 292 | + case 2: return strdup(is_signed ? "i16" : "u16"); |
| 293 | + case 4: return strdup(is_signed ? "i32" : "u32"); |
| 294 | + case 8: return strdup(is_signed ? "i64" : "u64"); |
| 295 | + default: return strdup(is_signed ? "i32" : "u32"); |
277 | 296 | } |
| 297 | + } |
278 | 298 | case BTF_KIND_STRUCT: |
279 | 299 | case BTF_KIND_UNION: |
280 | 300 | case BTF_KIND_ENUM: { |
|
0 commit comments