/** * \brief Generate a name of a type for use in a symbol. */ void symbol_type_name(SymbolLocationWriter& lw, const TreePtr<Term>& term) { if (TreePtr<TypeInstance> inst = term_unwrap_dyn_cast<TypeInstance>(term)) { if (inst->parameters.empty()) { lw.write(inst->generic->location().logical, false, 'A', 'B'); } else { lw.write(inst->generic->location().logical, false, 'C', 'D'); symbol_encode_number(lw.output(), inst->parameters.size()); for (PSI_STD::vector<TreePtr<Term> >::const_iterator ii = inst->parameters.begin(), ie = inst->parameters.end(); ii != ie; ++ii) symbol_type_name(lw, *ii); } } else if (TreePtr<NumberType> type = term_unwrap_dyn_cast<NumberType>(term)) { PSI_ASSERT(type->vector_size == 0); const char *type_keys = "GHIJKLMNOPQ"; lw.output() << type_keys[type->scalar_type]; } else if (TreePtr<IntegerConstant> value = term_unwrap_dyn_cast<IntegerConstant>(term)) { const char *type_keys = "ghijklmnopq"; lw.output() << type_keys[value->number_type]; if (NumberType::is_signed(value->number_type)) symbol_encode_signed_number(lw.output(), value->value); else symbol_encode_number(lw.output(), value->value); } else { lw.write(inst->location().logical, false, 'E', 'F'); } }
std::string symbol_implementation_name(const TreePtr<Interface>& interface, const PSI_STD::vector<TreePtr<Term> >& parameters) { std::ostringstream ss; ss << "_Y1"; SymbolLocationWriter lw(ss); lw.write(interface->location().logical, true, '\0', '\0'); for (PSI_STD::vector<TreePtr<Term> >::const_iterator ii = parameters.begin(), ie = parameters.end(); ii != ie; ++ii) symbol_type_name(lw, *ii); return ss.str(); }
static void r_member(SCTX_ unsigned mode, struct token *pos, struct symbol *sym, struct symbol *mem) { struct ident *ni, *si, *mi; return; print_usage(sctx_ pos, sym, mode); ni = MK_IDENT("?"); si = sym->ident ?: ni; /* mem == NULL means entire struct accessed */ mi = mem ? (mem->ident ?: ni) : MK_IDENT("*"); printf("%s%.*s.%-*.*s %s 0x%x 0x%p %s\n", sctxp reporter->indent ? "\t" : "", si->len, si->name, 32-1 - si->len, mi->len, mi->name, show_typename(sctx_ mem ? mem->ctype.base_type : sym), (unsigned int )sym->ctype.modifiers, sym, symbol_type_name(sym->type)); }
static void r_symbol(SCTX_ unsigned mode, struct token *pos, struct symbol *sym) { char b[512]; if ((!sym->ctype.base_type || sym->ctype.base_type->type != SYM_FN) && !isglobal(sctx_ sym)) return; print_usage(sctx_ pos, sym, mode); if (!sym->ident) sym->ident = MK_IDENT("__asm__"); memcpy(b, sym->ident->name, sym->ident->len); b[sym->ident->len] = 0; if (isfunc(sctx_ sym)) strcat(b, "()"); printf("%s%-32.*s %s 0x%x 0x%p %s\n", sctxp reporter->indent ? "\t" : "", (int)strlen(b), b, show_typename(sctx_ sym->ctype.base_type), (unsigned int )sym->ctype.modifiers, sym, symbol_type_name(sym->type)); }