Prevent two function with same mangled name but different types from being declared.

Previously, LDC would crash in the backend due to the fact that the IR is typed in such cases (we recently had such an instance with Tango, where an extern( C ) function was declared once with int and once with size_t).
This commit is contained in:
David Nadlinger 2011-07-27 23:01:22 +02:00
parent 882e81ec1c
commit 15c5316e26
3 changed files with 22 additions and 29 deletions

View file

@ -1769,17 +1769,7 @@ Expression *TypeArray::dotExp(Scope *sc, Expression *e, Identifier *ident)
args->push(new Parameter(STCin, Type::typeinfo->type, NULL, NULL)); args->push(new Parameter(STCin, Type::typeinfo->type, NULL, NULL));
adSort_fd = FuncDeclaration::genCfunc(args, Type::tvoid->arrayOf(), "_adSort"); adSort_fd = FuncDeclaration::genCfunc(args, Type::tvoid->arrayOf(), "_adSort");
} }
static FuncDeclaration *adSortBit_fd = NULL;
if(!adSortBit_fd) {
Parameters* args = new Parameters;
args->push(new Parameter(STCin, Type::tvoid->arrayOf(), NULL, NULL));
args->push(new Parameter(STCin, Type::typeinfo->type, NULL, NULL));
adSortBit_fd = FuncDeclaration::genCfunc(args, Type::tvoid->arrayOf(), "_adSortBit");
}
if(isBit)
ec = new VarExp(0, adSortBit_fd);
else
ec = new VarExp(0, adSort_fd); ec = new VarExp(0, adSort_fd);
e = e->castTo(sc, n->arrayOf()); // convert to dynamic array e = e->castTo(sc, n->arrayOf()); // convert to dynamic array
arguments = new Expressions(); arguments = new Expressions();
@ -2476,7 +2466,7 @@ Expression *TypeAArray::dotExp(Scope *sc, Expression *e, Identifier *ident)
static FuncDeclaration *aaLen_fd = NULL; static FuncDeclaration *aaLen_fd = NULL;
if(!aaLen_fd) { if(!aaLen_fd) {
Parameters* args = new Parameters; Parameters* args = new Parameters;
args->push(new Parameter(STCin, Type::tvoid->pointerTo(), NULL, NULL)); args->push(new Parameter(STCin, Type::tvoid->pointerTo(), NULL, NULL)); // FIXME: Real parameter type is AA.
aaLen_fd = FuncDeclaration::genCfunc(args, Type::tsize_t, Id::aaLen); aaLen_fd = FuncDeclaration::genCfunc(args, Type::tsize_t, Id::aaLen);
} }
@ -2497,7 +2487,7 @@ Expression *TypeAArray::dotExp(Scope *sc, Expression *e, Identifier *ident)
static FuncDeclaration *aaKeys_fd = NULL; static FuncDeclaration *aaKeys_fd = NULL;
if(!aaKeys_fd) { if(!aaKeys_fd) {
Parameters* args = new Parameters; Parameters* args = new Parameters;
args->push(new Parameter(STCin, Type::tvoid->pointerTo(), NULL, NULL)); args->push(new Parameter(STCin, Type::tvoid->pointerTo(), NULL, NULL)); // FIXME: Real parameter type is AA.
args->push(new Parameter(STCin, Type::tsize_t, NULL, NULL)); args->push(new Parameter(STCin, Type::tsize_t, NULL, NULL));
aaKeys_fd = FuncDeclaration::genCfunc(args, Type::tvoid->arrayOf(), Id::aaKeys); aaKeys_fd = FuncDeclaration::genCfunc(args, Type::tvoid->arrayOf(), Id::aaKeys);
} }
@ -2518,7 +2508,7 @@ Expression *TypeAArray::dotExp(Scope *sc, Expression *e, Identifier *ident)
static FuncDeclaration *aaValues_fd = NULL; static FuncDeclaration *aaValues_fd = NULL;
if(!aaValues_fd) { if(!aaValues_fd) {
Parameters* args = new Parameters; Parameters* args = new Parameters;
args->push(new Parameter(STCin, Type::tvoid->pointerTo(), NULL, NULL)); args->push(new Parameter(STCin, Type::tvoid->pointerTo(), NULL, NULL)); // FIXME: Real parameter type is AA.
args->push(new Parameter(STCin, Type::tsize_t, NULL, NULL)); args->push(new Parameter(STCin, Type::tsize_t, NULL, NULL));
args->push(new Parameter(STCin, Type::tsize_t, NULL, NULL)); args->push(new Parameter(STCin, Type::tsize_t, NULL, NULL));
aaValues_fd = FuncDeclaration::genCfunc(args, Type::tvoid->arrayOf(), Id::aaValues); aaValues_fd = FuncDeclaration::genCfunc(args, Type::tvoid->arrayOf(), Id::aaValues);
@ -2543,7 +2533,7 @@ Expression *TypeAArray::dotExp(Scope *sc, Expression *e, Identifier *ident)
static FuncDeclaration *aaRehash_fd = NULL; static FuncDeclaration *aaRehash_fd = NULL;
if(!aaRehash_fd) { if(!aaRehash_fd) {
Parameters* args = new Parameters; Parameters* args = new Parameters;
args->push(new Parameter(STCin, Type::tvoid->pointerTo(), NULL, NULL)); args->push(new Parameter(STCin, Type::tvoid->pointerTo(), NULL, NULL)); // FIXME: Real parameter type is AA*.
args->push(new Parameter(STCin, Type::typeinfo->type, NULL, NULL)); args->push(new Parameter(STCin, Type::typeinfo->type, NULL, NULL));
aaRehash_fd = FuncDeclaration::genCfunc(args, Type::tvoidptr, Id::aaRehash); aaRehash_fd = FuncDeclaration::genCfunc(args, Type::tvoidptr, Id::aaRehash);
} }

View file

@ -1801,21 +1801,21 @@ Statement *ForeachStatement::semantic(Scope *sc)
Parameters* dgargs = new Parameters; Parameters* dgargs = new Parameters;
dgargs->push(new Parameter(STCin, Type::tvoidptr, NULL, NULL)); dgargs->push(new Parameter(STCin, Type::tvoidptr, NULL, NULL));
dgargs->push(new Parameter(STCin, Type::tvoidptr, NULL, NULL)); dgargs->push(new Parameter(STCin, Type::tvoidptr, NULL, NULL));
aaApply2_dg = new TypeDelegate(new TypeFunction(dgargs, Type::tindex, 0, LINKd)); aaApply2_dg = new TypeDelegate(new TypeFunction(dgargs, Type::tint32, 0, LINKd));
args->push(new Parameter(STCin, aaApply2_dg, NULL, NULL)); args->push(new Parameter(STCin, aaApply2_dg, NULL, NULL));
aaApply2_fd = FuncDeclaration::genCfunc(args, Type::tindex, "_aaApply2"); aaApply2_fd = FuncDeclaration::genCfunc(args, Type::tint32, "_aaApply2");
} }
static FuncDeclaration *aaApply_fd = NULL; static FuncDeclaration *aaApply_fd = NULL;
static TypeDelegate* aaApply_dg; static TypeDelegate* aaApply_dg;
if(!aaApply_fd) { if(!aaApply_fd) {
Parameters* args = new Parameters; Parameters* args = new Parameters;
args->push(new Parameter(STCin, Type::tvoid->pointerTo(), NULL, NULL)); args->push(new Parameter(STCin, Type::tvoid->pointerTo(), NULL, NULL)); // FIXME: Real parameter type is AA.
args->push(new Parameter(STCin, Type::tsize_t, NULL, NULL)); args->push(new Parameter(STCin, Type::tsize_t, NULL, NULL));
Parameters* dgargs = new Parameters; Parameters* dgargs = new Parameters;
dgargs->push(new Parameter(STCin, Type::tvoidptr, NULL, NULL)); dgargs->push(new Parameter(STCin, Type::tvoidptr, NULL, NULL));
aaApply_dg = new TypeDelegate(new TypeFunction(dgargs, Type::tindex, 0, LINKd)); aaApply_dg = new TypeDelegate(new TypeFunction(dgargs, Type::tint32, 0, LINKd));
args->push(new Parameter(STCin, aaApply_dg, NULL, NULL)); args->push(new Parameter(STCin, aaApply_dg, NULL, NULL));
aaApply_fd = FuncDeclaration::genCfunc(args, Type::tindex, "_aaApply"); aaApply_fd = FuncDeclaration::genCfunc(args, Type::tint32, "_aaApply");
} }
FuncDeclaration *fdapply; FuncDeclaration *fdapply;
if (dim == 2) { if (dim == 2) {
@ -1840,7 +1840,7 @@ Statement *ForeachStatement::semantic(Scope *sc)
} }
exps->push(flde); exps->push(flde);
e = new CallExp(loc, ec, exps); e = new CallExp(loc, ec, exps);
e->type = Type::tindex; // don't run semantic() on e e->type = Type::tint32; // don't run semantic() on e
} }
else if (tab->ty == Tarray || tab->ty == Tsarray) else if (tab->ty == Tarray || tab->ty == Tsarray)
{ {
@ -1884,15 +1884,15 @@ Statement *ForeachStatement::semantic(Scope *sc)
Parameters* dgargs = new Parameters; Parameters* dgargs = new Parameters;
dgargs->push(new Parameter(STCin, Type::tvoidptr, NULL, NULL)); dgargs->push(new Parameter(STCin, Type::tvoidptr, NULL, NULL));
dgargs->push(new Parameter(STCin, Type::tvoidptr, NULL, NULL)); dgargs->push(new Parameter(STCin, Type::tvoidptr, NULL, NULL));
dgty = new TypeDelegate(new TypeFunction(dgargs, Type::tindex, 0, LINKd)); dgty = new TypeDelegate(new TypeFunction(dgargs, Type::tint32, 0, LINKd));
args->push(new Parameter(STCin, dgty, NULL, NULL)); args->push(new Parameter(STCin, dgty, NULL, NULL));
fdapply = FuncDeclaration::genCfunc(args, Type::tindex, fdname); fdapply = FuncDeclaration::genCfunc(args, Type::tint32, fdname);
} else { } else {
Parameters* dgargs = new Parameters; Parameters* dgargs = new Parameters;
dgargs->push(new Parameter(STCin, Type::tvoidptr, NULL, NULL)); dgargs->push(new Parameter(STCin, Type::tvoidptr, NULL, NULL));
dgty = new TypeDelegate(new TypeFunction(dgargs, Type::tindex, 0, LINKd)); dgty = new TypeDelegate(new TypeFunction(dgargs, Type::tint32, 0, LINKd));
args->push(new Parameter(STCin, dgty, NULL, NULL)); args->push(new Parameter(STCin, dgty, NULL, NULL));
fdapply = FuncDeclaration::genCfunc(args, Type::tindex, fdname); fdapply = FuncDeclaration::genCfunc(args, Type::tint32, fdname);
} }
ec = new VarExp(0, fdapply); ec = new VarExp(0, fdapply);
@ -1909,7 +1909,7 @@ Statement *ForeachStatement::semantic(Scope *sc)
} }
exps->push(flde); exps->push(flde);
e = new CallExp(loc, ec, exps); e = new CallExp(loc, ec, exps);
e->type = Type::tindex; // don't run semantic() on e e->type = Type::tint32; // don't run semantic() on e
} }
else if (tab->ty == Tdelegate) else if (tab->ty == Tdelegate)
{ {
@ -3787,14 +3787,14 @@ Statement *SynchronizedStatement::semantic(Scope *sc)
cs->push(new DeclarationStatement(loc, new DeclarationExp(loc, tmp))); cs->push(new DeclarationStatement(loc, new DeclarationExp(loc, tmp)));
Parameters* enterargs = new Parameters; Parameters* enterargs = new Parameters;
enterargs->push(new Parameter(STCin, Type::tvoidptr, NULL, NULL)); enterargs->push(new Parameter(STCin, ClassDeclaration::object->type, NULL, NULL));
FuncDeclaration *fdenter = FuncDeclaration::genCfunc(enterargs, Type::tvoid, Id::monitorenter); FuncDeclaration *fdenter = FuncDeclaration::genCfunc(enterargs, Type::tvoid, Id::monitorenter);
Expression *e = new CallExp(loc, new VarExp(loc, fdenter), new VarExp(loc, tmp)); Expression *e = new CallExp(loc, new VarExp(loc, fdenter), new VarExp(loc, tmp));
e->type = Type::tvoid; // do not run semantic on e e->type = Type::tvoid; // do not run semantic on e
cs->push(new ExpStatement(loc, e)); cs->push(new ExpStatement(loc, e));
Parameters* exitargs = new Parameters; Parameters* exitargs = new Parameters;
exitargs->push(new Parameter(STCin, Type::tvoidptr, NULL, NULL)); exitargs->push(new Parameter(STCin, ClassDeclaration::object->type, NULL, NULL));
FuncDeclaration *fdexit = FuncDeclaration::genCfunc(exitargs, Type::tvoid, Id::monitorexit); FuncDeclaration *fdexit = FuncDeclaration::genCfunc(exitargs, Type::tvoid, Id::monitorexit);
e = new CallExp(loc, new VarExp(loc, fdexit), new VarExp(loc, tmp)); e = new CallExp(loc, new VarExp(loc, fdexit), new VarExp(loc, tmp));
e->type = Type::tvoid; // do not run semantic on e e->type = Type::tvoid; // do not run semantic on e

View file

@ -474,8 +474,11 @@ void DtoDeclareFunction(FuncDeclaration* fdecl)
// construct function // construct function
const llvm::FunctionType* functype = DtoFunctionType(fdecl); const llvm::FunctionType* functype = DtoFunctionType(fdecl);
llvm::Function* func = vafunc ? vafunc : gIR->module->getFunction(mangled_name); llvm::Function* func = vafunc ? vafunc : gIR->module->getFunction(mangled_name);
if (!func) if (!func) {
func = llvm::Function::Create(functype, DtoLinkage(fdecl), mangled_name, gIR->module); func = llvm::Function::Create(functype, DtoLinkage(fdecl), mangled_name, gIR->module);
} else if (func->getFunctionType() != functype) {
error(fdecl->loc, "Function type does not match previously declared function with the same mangled name: %s", fdecl->mangle());
}
if (Logger::enabled()) if (Logger::enabled())
Logger::cout() << "func = " << *func << std::endl; Logger::cout() << "func = " << *func << std::endl;