public Function CodeGen(IRBuilder builder)
{
List<TypeRef> args = new List<TypeRef>();
this.Args.ForEach(a => args.Add(TypeRef.CreateDouble()));
Function func = new Function(CodeGenManager.Module, this.Name,
TypeRef.CreateDouble(), args.ToArray());
func.SetLinkage(LLVMLinkage.ExternalLinkage);
// If F conflicted, there was already something named 'Name'. If it has a
// body, don't allow redefinition or reextern.
if(func.IsDuplicate())
{
// Delete the one we just made and get the existing one.
func.Delete();
func = CodeGenManager.Module.GetFunction(this.Name);
// If F already has a body, reject this.
if(func.HasBody)
{
CodeGenManager.ErrorOutput.WriteLine("redefinition of function.");
return null;
}
// If F took a different number of args, reject.
if(func.ArgCount != this.Args.Count)
{
CodeGenManager.ErrorOutput.WriteLine("redefinition of function with different # args.");
return null;
}
}
// Set names for all arguments.
for(int i = 0; i < func.ArgCount; ++i)
{
Value val = func.GetParameter((uint)i);
val.Name = this.Args[i];
}
return func;
}