@@ -292,14 +292,161 @@ RT_API_ATTRS void Descriptor::Check() const {
292292 // TODO
293293}
294294
295- void Descriptor::Dump (FILE *f) const {
295+ static const char *GetTypeStr (ISO::CFI_type_t type, bool dumpRawType) {
296+ if (dumpRawType) {
297+ #define CASE (x ) \
298+ case (x): \
299+ return #x;
300+ switch (type) {
301+ CASE (CFI_type_signed_char)
302+ CASE (CFI_type_short)
303+ CASE (CFI_type_int)
304+ CASE (CFI_type_long)
305+ CASE (CFI_type_long_long)
306+ CASE (CFI_type_size_t)
307+ CASE (CFI_type_int8_t)
308+ CASE (CFI_type_int16_t)
309+ CASE (CFI_type_int32_t)
310+ CASE (CFI_type_int64_t)
311+ CASE (CFI_type_int128_t)
312+ CASE (CFI_type_int_least8_t)
313+ CASE (CFI_type_int_least16_t)
314+ CASE (CFI_type_int_least32_t)
315+ CASE (CFI_type_int_least64_t)
316+ CASE (CFI_type_int_least128_t)
317+ CASE (CFI_type_int_fast8_t)
318+ CASE (CFI_type_int_fast16_t)
319+ CASE (CFI_type_int_fast32_t)
320+ CASE (CFI_type_int_fast64_t)
321+ CASE (CFI_type_int_fast128_t)
322+ CASE (CFI_type_intmax_t)
323+ CASE (CFI_type_intptr_t)
324+ CASE (CFI_type_ptrdiff_t)
325+ CASE (CFI_type_half_float)
326+ CASE (CFI_type_bfloat)
327+ CASE (CFI_type_float)
328+ CASE (CFI_type_double)
329+ CASE (CFI_type_extended_double)
330+ CASE (CFI_type_long_double)
331+ CASE (CFI_type_float128)
332+ CASE (CFI_type_half_float_Complex)
333+ CASE (CFI_type_bfloat_Complex)
334+ CASE (CFI_type_float_Complex)
335+ CASE (CFI_type_double_Complex)
336+ CASE (CFI_type_extended_double_Complex)
337+ CASE (CFI_type_long_double_Complex)
338+ CASE (CFI_type_float128_Complex)
339+ CASE (CFI_type_Bool)
340+ CASE (CFI_type_char)
341+ CASE (CFI_type_cptr)
342+ CASE (CFI_type_struct)
343+ CASE (CFI_type_char16_t)
344+ CASE (CFI_type_char32_t)
345+ CASE (CFI_type_uint8_t)
346+ CASE (CFI_type_uint16_t)
347+ CASE (CFI_type_uint32_t)
348+ CASE (CFI_type_uint64_t)
349+ CASE (CFI_type_uint128_t)
350+ default :
351+ return nullptr ;
352+ }
353+ #undef CASE
354+ }
355+ TypeCode code{type};
356+ if (!code.IsValid ()) {
357+ return " invalid" ;
358+ }
359+ auto categoryAndKind{code.GetCategoryAndKind ()};
360+ if (!categoryAndKind) {
361+ return nullptr ;
362+ }
363+ TypeCategory tcat{categoryAndKind->first };
364+ int kind{categoryAndKind->second };
365+
366+ #define CASE (cat, k ) \
367+ case (k): \
368+ return #cat " (kind=" #k " )" ;
369+ switch (tcat) {
370+ case TypeCategory::Integer:
371+ switch (kind) {
372+ CASE (INTEGER, 1 )
373+ CASE (INTEGER, 2 )
374+ CASE (INTEGER, 4 )
375+ CASE (INTEGER, 8 )
376+ CASE (INTEGER, 16 )
377+ }
378+ break ;
379+ case TypeCategory::Unsigned:
380+ switch (kind) {
381+ CASE (UNSIGNED, 1 )
382+ CASE (UNSIGNED, 2 )
383+ CASE (UNSIGNED, 4 )
384+ CASE (UNSIGNED, 8 )
385+ CASE (UNSIGNED, 16 )
386+ }
387+ break ;
388+ case TypeCategory::Real:
389+ switch (kind) {
390+ CASE (REAL, 2 )
391+ CASE (REAL, 3 )
392+ CASE (REAL, 4 )
393+ CASE (REAL, 8 )
394+ CASE (REAL, 10 )
395+ CASE (REAL, 16 )
396+ }
397+ break ;
398+ case TypeCategory::Complex:
399+ switch (kind) {
400+ CASE (COMPLEX, 2 )
401+ CASE (COMPLEX, 3 )
402+ CASE (COMPLEX, 4 )
403+ CASE (COMPLEX, 8 )
404+ CASE (COMPLEX, 10 )
405+ CASE (COMPLEX, 16 )
406+ }
407+ break ;
408+ case TypeCategory::Character:
409+ switch (kind) {
410+ CASE (CHARACTER, 1 )
411+ CASE (CHARACTER, 2 )
412+ CASE (CHARACTER, 4 )
413+ }
414+ break ;
415+ case TypeCategory::Logical:
416+ switch (kind) {
417+ CASE (LOGICAL, 1 )
418+ CASE (LOGICAL, 2 )
419+ CASE (LOGICAL, 4 )
420+ CASE (LOGICAL, 8 )
421+ }
422+ break ;
423+ case TypeCategory::Derived:
424+ return " DERIVED" ;
425+ }
426+ #undef CASE
427+ return nullptr ;
428+ }
429+
430+ void Descriptor::Dump (FILE *f, bool dumpRawType) const {
296431 std::fprintf (f, " Descriptor @ %p:\n " , reinterpret_cast <const void *>(this ));
297432 std::fprintf (f, " base_addr %p\n " , raw_.base_addr );
298- std::fprintf (f, " elem_len %zd\n " , static_cast <std:: size_t >(raw_. elem_len ));
433+ std::fprintf (f, " elem_len %zd\n " , ElementBytes ( ));
299434 std::fprintf (f, " version %d\n " , static_cast <int >(raw_.version ));
300- std::fprintf (f, " rank %d\n " , static_cast <int >(raw_.rank ));
301- std::fprintf (f, " type %d\n " , static_cast <int >(raw_.type ));
302- std::fprintf (f, " attribute %d\n " , static_cast <int >(raw_.attribute ));
435+ std::fprintf (f, " rank %d%s\n " , rank (), rank () ? " " : " (scalar)" );
436+ int ty{static_cast <int >(raw_.type )};
437+ if (const char *tyStr{GetTypeStr (raw_.type , dumpRawType)}) {
438+ std::fprintf (f, " type %d \" %s\"\n " , ty, tyStr);
439+ } else {
440+ std::fprintf (f, " type %d\n " , ty);
441+ }
442+ int attr{static_cast <int >(raw_.attribute )};
443+ if (IsPointer ()) {
444+ std::fprintf (f, " attribute %d (pointer) \n " , attr);
445+ } else if (IsAllocatable ()) {
446+ std::fprintf (f, " attribute %d (allocatable)\n " , attr);
447+ } else {
448+ std::fprintf (f, " attribute %d\n " , attr);
449+ }
303450 std::fprintf (f, " extra %d\n " , static_cast <int >(raw_.extra ));
304451 std::fprintf (f, " addendum %d\n " , static_cast <int >(HasAddendum ()));
305452 std::fprintf (f, " alloc_idx %d\n " , static_cast <int >(GetAllocIdx ()));
0 commit comments