Symbol *aaGetSymbol(TypeAArray *taa, const char *func, int flags) { #ifdef DEBUG assert((flags & ~1) == 0); #endif // Dumb linear symbol table - should use associative array! static Symbols *sarray = NULL; //printf("aaGetSymbol(func = '%s', flags = %d, key = %p)\n", func, flags, key); char *id = (char *)alloca(3 + strlen(func) + 1); sprintf(id, "_aa%s", func); if (!sarray) sarray = Symbols_create(); // See if symbol is already in sarray for (size_t i = 0; i < sarray->dim; i++) { Symbol *s = (*sarray)[i]; if (strcmp(id, s->Sident) == 0) { #ifdef DEBUG assert(s); #endif return s; // use existing Symbol } } // Create new Symbol Symbol *s = symbol_calloc(id); slist_add(s); s->Sclass = SCextern; s->Ssymnum = -1; symbol_func(s); type *t = type_function(TYnfunc, NULL, 0, false, Type_toCtype(taa->next)); t->Tmangle = mTYman_c; s->Stype = t; sarray->push(s); // remember it return s; }
Symbol *FuncDeclaration::toSymbol() { if (!csym) { Symbol *s; TYPE *t; const char *id; #if 0 id = ident->toChars(); #else id = mangle(); #endif //printf("FuncDeclaration::toSymbol(%s)\n", toChars()); //printf("\tid = '%s'\n", id); //printf("\ttype = %s\n", type->toChars()); s = symbol_calloc(id); slist_add(s); { func_t *f; s->Sclass = SCglobal; symbol_func(s); f = s->Sfunc; f->Fstartline.Slinnum = loc.linnum; if (endloc.linnum) f->Fendline.Slinnum = endloc.linnum; else f->Fendline.Slinnum = loc.linnum; t = type->toCtype(); } mangle_t msave = t->Tmangle; if (isMain()) { t->Tty = TYnfunc; t->Tmangle = mTYman_c; } else { switch (linkage) { case LINKwindows: t->Tmangle = mTYman_std; break; case LINKpascal: t->Tty = TYnpfunc; t->Tmangle = mTYman_pas; break; case LINKc: t->Tmangle = mTYman_c; break; case LINKd: t->Tmangle = mTYman_d; break; case LINKcpp: t->Tmangle = mTYman_cpp; break; default: printf("linkage = %d\n", linkage); assert(0); } } if (msave) assert(msave == t->Tmangle); //printf("Tty = %d, mangle = x%x\n", t->Tty, t->Tmangle); t->Tcount++; s->Stype = t; //s->Sfielddef = this; csym = s; } return csym; }
Symbol *FuncDeclaration::toSymbol() { if (!csym) { Symbol *s; TYPE *t; const char *id; #if 0 id = ident->toChars(); #else id = mangle(); #endif //printf("FuncDeclaration::toSymbol(%s %s)\n", kind(), toChars()); //printf("\tid = '%s'\n", id); //printf("\ttype = %s\n", type->toChars()); s = symbol_calloc(id); slist_add(s); { s->prettyIdent = toPrettyChars(); s->Sclass = SCglobal; symbol_func(s); func_t *f = s->Sfunc; if (isVirtual() && vtblIndex != -1) f->Fflags |= Fvirtual; else if (isMember2() && isStatic()) f->Fflags |= Fstatic; f->Fstartline.Slinnum = loc.linnum; f->Fstartline.Sfilename = (char *)loc.filename; if (endloc.linnum) { f->Fendline.Slinnum = endloc.linnum; f->Fendline.Sfilename = (char *)endloc.filename; } else { f->Fendline.Slinnum = loc.linnum; f->Fendline.Sfilename = (char *)loc.filename; } t = type->toCtype(); } mangle_t msave = t->Tmangle; if (isMain()) { t->Tty = TYnfunc; t->Tmangle = mTYman_c; } else { switch (linkage) { case LINKwindows: t->Tmangle = mTYman_std; break; case LINKpascal: t->Tty = TYnpfunc; t->Tmangle = mTYman_pas; break; case LINKc: t->Tmangle = mTYman_c; break; case LINKd: t->Tmangle = mTYman_d; break; case LINKcpp: { t->Tmangle = mTYman_cpp; if (isThis() && !global.params.is64bit && global.params.isWindows) t->Tty = TYmfunc; s->Sflags |= SFLpublic; Dsymbol *parent = toParent(); ClassDeclaration *cd = parent->isClassDeclaration(); if (cd) { ::type *tc = cd->type->toCtype(); s->Sscope = tc->Tnext->Ttag; } StructDeclaration *sd = parent->isStructDeclaration(); if (sd) { ::type *ts = sd->type->toCtype(); s->Sscope = ts->Ttag; } break; } default: printf("linkage = %d\n", linkage); assert(0); } } if (msave) assert(msave == t->Tmangle); //printf("Tty = %x, mangle = x%x\n", t->Tty, t->Tmangle); t->Tcount++; s->Stype = t; //s->Sfielddef = this; csym = s; } return csym; }
void visit(FuncDeclaration *fd) { if (!fd->csym) { const char *id = mangleExact(fd); //printf("FuncDeclaration::toSymbol(%s %s)\n", fd->kind(), fd->toChars()); //printf("\tid = '%s'\n", id); //printf("\ttype = %s\n", fd->type->toChars()); Symbol *s = symbol_calloc(id); slist_add(s); s->prettyIdent = fd->toPrettyChars(); s->Sclass = SCglobal; symbol_func(s); func_t *f = s->Sfunc; if (fd->isVirtual() && fd->vtblIndex != -1) f->Fflags |= Fvirtual; else if (fd->isMember2() && fd->isStatic()) f->Fflags |= Fstatic; f->Fstartline.Slinnum = fd->loc.linnum; f->Fstartline.Scharnum = fd->loc.charnum; f->Fstartline.Sfilename = (char *)fd->loc.filename; if (fd->endloc.linnum) { f->Fendline.Slinnum = fd->endloc.linnum; f->Fendline.Scharnum = fd->endloc.charnum; f->Fendline.Sfilename = (char *)fd->endloc.filename; } else { f->Fendline.Slinnum = fd->loc.linnum; f->Fendline.Scharnum = fd->loc.charnum; f->Fendline.Sfilename = (char *)fd->loc.filename; } TYPE *t = Type_toCtype(fd->type); mangle_t msave = t->Tmangle; if (fd->isMain()) { t->Tty = TYnfunc; t->Tmangle = mTYman_c; } else { switch (fd->linkage) { case LINKwindows: t->Tmangle = mTYman_std; break; case LINKpascal: t->Tty = TYnpfunc; t->Tmangle = mTYman_pas; break; case LINKc: t->Tmangle = mTYman_c; break; case LINKd: t->Tmangle = mTYman_d; break; case LINKcpp: s->Sflags |= SFLpublic; if (fd->isThis() && !global.params.is64bit && global.params.isWindows) { if (((TypeFunction *)fd->type)->varargs == 1) { t->Tty = TYnfunc; } else { t->Tty = TYmfunc; } } t->Tmangle = mTYman_d; break; default: printf("linkage = %d\n", fd->linkage); assert(0); } } if (msave) assert(msave == t->Tmangle); //printf("Tty = %x, mangle = x%x\n", t->Tty, t->Tmangle); t->Tcount++; s->Stype = t; //s->Sfielddef = this; fd->csym = s; } result = fd->csym; }