comparison gen/abi.cpp @ 996:6e7dc3caccdd

Don't crash if we don't know what ABI to use. Assume some defaults instead.
author Frits van Bommel <fvbommel wxs.nl>
date Thu, 26 Feb 2009 15:23:52 +0100
parents 223a679053dd
children c749648ed2b8
comparison
equal deleted inserted replaced
995:125c09006ac6 996:6e7dc3caccdd
4 4
5 #include "gen/irstate.h" 5 #include "gen/irstate.h"
6 #include "gen/llvmhelpers.h" 6 #include "gen/llvmhelpers.h"
7 #include "gen/tollvm.h" 7 #include "gen/tollvm.h"
8 #include "gen/abi.h" 8 #include "gen/abi.h"
9 #include "gen/logger.h"
9 10
10 ////////////////////////////////////////////////////////////////////////////// 11 //////////////////////////////////////////////////////////////////////////////
11 ////////////////////////////////////////////////////////////////////////////// 12 //////////////////////////////////////////////////////////////////////////////
12 ///////////////////// baseclass //////////////////////////// 13 ///////////////////// baseclass ////////////////////////////
13 ////////////////////////////////////////////////////////////////////////////// 14 //////////////////////////////////////////////////////////////////////////////
205 } 206 }
206 }; 207 };
207 208
208 ////////////////////////////////////////////////////////////////////////////// 209 //////////////////////////////////////////////////////////////////////////////
209 ////////////////////////////////////////////////////////////////////////////// 210 //////////////////////////////////////////////////////////////////////////////
211 /////////////////// Unknown targets //////////////////////////
212 //////////////////////////////////////////////////////////////////////////////
213 //////////////////////////////////////////////////////////////////////////////
214
215 // Some reasonable defaults for when we don't know what ABI to use.
216 struct UnknownTargetABI : TargetABI
217 {
218 UnknownTargetABI()
219 {
220 // Don't push anything into retOps, assume defaults will be fine.
221 }
222
223 bool returnInArg(Type* t)
224 {
225 Type* rt = t->toBasetype();
226 return (rt->ty == Tstruct);
227 }
228
229 bool passByRef(Type* t)
230 {
231 t = t->toBasetype();
232 return (t->ty == Tstruct || t->ty == Tsarray);
233 }
234 };
235
236 //////////////////////////////////////////////////////////////////////////////
237 //////////////////////////////////////////////////////////////////////////////
210 ////////////////////////////////////////////////////////////////////////////// 238 //////////////////////////////////////////////////////////////////////////////
211 ////////////////////////////////////////////////////////////////////////////// 239 //////////////////////////////////////////////////////////////////////////////
212 ////////////////////////////////////////////////////////////////////////////// 240 //////////////////////////////////////////////////////////////////////////////
213 241
214 TargetABI * TargetABI::getTarget() 242 TargetABI * TargetABI::getTarget()
218 case ARCHx86: 246 case ARCHx86:
219 return new X86TargetABI; 247 return new X86TargetABI;
220 case ARCHx86_64: 248 case ARCHx86_64:
221 return new X86_64TargetABI; 249 return new X86_64TargetABI;
222 default: 250 default:
223 return NULL; 251 Logger::cout() << "WARNING: Unknown ABI, guessing...\n";
224 } 252 return new UnknownTargetABI;
225 } 253 }
254 }