changeset 933:d3a6f1a96731

Replace assertion with errormessage for unsupported calling conventions. like Pascal. See dstress/run/e/extern_10_A.d
author Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
date Wed, 04 Feb 2009 00:04:09 +0100
parents 5e3bb0c3ea8b
children b56f3571c450
files gen/functions.cpp gen/llvmhelpers.h gen/tocall.cpp gen/toobj.cpp
diffstat 4 files changed, 14 insertions(+), 11 deletions(-) [+]
line wrap: on
line diff
--- a/gen/functions.cpp	Tue Feb 03 23:48:47 2009 +0100
+++ b/gen/functions.cpp	Wed Feb 04 00:04:09 2009 +0100
@@ -528,7 +528,7 @@
 
     // calling convention
     if (!vafunc && fdecl->llvmInternal != LLVMintrinsic)
-        func->setCallingConv(DtoCallingConv(f->linkage));
+        func->setCallingConv(DtoCallingConv(fdecl->loc, f->linkage));
     else // fall back to C, it should be the right thing to do
         func->setCallingConv(llvm::CallingConv::C);
 
--- a/gen/llvmhelpers.h	Tue Feb 03 23:48:47 2009 +0100
+++ b/gen/llvmhelpers.h	Wed Feb 04 00:04:09 2009 +0100
@@ -113,7 +113,7 @@
 ////////////////////////////////////////////
 
 /// convert DMD calling conv to LLVM
-unsigned DtoCallingConv(LINK l);
+unsigned DtoCallingConv(Loc loc, LINK l);
 
 ///
 TypeFunction* DtoTypeFunction(DValue* fnval);
--- a/gen/tocall.cpp	Tue Feb 03 23:48:47 2009 +0100
+++ b/gen/tocall.cpp	Wed Feb 04 00:04:09 2009 +0100
@@ -33,7 +33,7 @@
 
 //////////////////////////////////////////////////////////////////////////////////////////
 
-unsigned DtoCallingConv(LINK l)
+unsigned DtoCallingConv(Loc loc, LINK l)
 {
     if (l == LINKc || l == LINKcpp || l == LINKintrinsic)
         return llvm::CallingConv::C;
@@ -50,7 +50,10 @@
     else if (l == LINKwindows)
         return llvm::CallingConv::X86_StdCall;
     else
-        assert(0 && "Unsupported calling convention");
+    {
+        error(loc, "unsupported calling convention");
+        fatal();
+    }
 }
 
 //////////////////////////////////////////////////////////////////////////////////////////
@@ -235,7 +238,7 @@
     bool nestedcall = tf->usesNest;
     bool dvarargs = (tf->linkage == LINKd && tf->varargs == 1);
 
-    unsigned callconv = DtoCallingConv(tf->linkage);
+    unsigned callconv = DtoCallingConv(loc, tf->linkage);
 
     // get callee llvm value
     LLValue* callable = DtoCallableValue(fnval);
--- a/gen/toobj.cpp	Tue Feb 03 23:48:47 2009 +0100
+++ b/gen/toobj.cpp	Wed Feb 04 00:04:09 2009 +0100
@@ -417,7 +417,7 @@
     const llvm::FunctionType* fnTy = llvm::FunctionType::get(LLType::VoidTy,argsTy,false);
     assert(gIR->module->getFunction(name) == NULL);
     llvm::Function* fn = llvm::Function::Create(fnTy, llvm::GlobalValue::InternalLinkage, name, gIR->module);
-    fn->setCallingConv(DtoCallingConv(LINKd));
+    fn->setCallingConv(DtoCallingConv(0, LINKd));
 
     llvm::BasicBlock* bb = llvm::BasicBlock::Create("entry", fn);
     IRBuilder<> builder(bb);
@@ -432,7 +432,7 @@
     for (size_t i=0; i<n; i++) {
         llvm::Function* f = gIR->ctors[i]->ir.irFunc->func;
         llvm::CallInst* call = builder.CreateCall(f,"");
-        call->setCallingConv(DtoCallingConv(LINKd));
+        call->setCallingConv(DtoCallingConv(0, LINKd));
     }
 
     // debug info end
@@ -462,7 +462,7 @@
     const llvm::FunctionType* fnTy = llvm::FunctionType::get(LLType::VoidTy,argsTy,false);
     assert(gIR->module->getFunction(name) == NULL);
     llvm::Function* fn = llvm::Function::Create(fnTy, llvm::GlobalValue::InternalLinkage, name, gIR->module);
-    fn->setCallingConv(DtoCallingConv(LINKd));
+    fn->setCallingConv(DtoCallingConv(0, LINKd));
 
     llvm::BasicBlock* bb = llvm::BasicBlock::Create("entry", fn);
     IRBuilder<> builder(bb);
@@ -477,7 +477,7 @@
     for (size_t i=0; i<n; i++) {
         llvm::Function* f = gIR->dtors[i]->ir.irFunc->func;
         llvm::CallInst* call = builder.CreateCall(f,"");
-        call->setCallingConv(DtoCallingConv(LINKd));
+        call->setCallingConv(DtoCallingConv(0, LINKd));
     }
 
     // debug info end
@@ -507,7 +507,7 @@
     const llvm::FunctionType* fnTy = llvm::FunctionType::get(LLType::VoidTy,argsTy,false);
     assert(gIR->module->getFunction(name) == NULL);
     llvm::Function* fn = llvm::Function::Create(fnTy, llvm::GlobalValue::InternalLinkage, name, gIR->module);
-    fn->setCallingConv(DtoCallingConv(LINKd));
+    fn->setCallingConv(DtoCallingConv(0, LINKd));
 
     llvm::BasicBlock* bb = llvm::BasicBlock::Create("entry", fn);
     IRBuilder<> builder(bb);
@@ -522,7 +522,7 @@
     for (size_t i=0; i<n; i++) {
         llvm::Function* f = gIR->unitTests[i]->ir.irFunc->func;
         llvm::CallInst* call = builder.CreateCall(f,"");
-        call->setCallingConv(DtoCallingConv(LINKd));
+        call->setCallingConv(DtoCallingConv(0, LINKd));
     }
 
     // debug info end