From 001f83a296a53aefc9d7395148a2eb8eca9ab479 Mon Sep 17 00:00:00 2001 From: Frits van Bommel Date: Thu, 26 Feb 2009 15:23:52 +0100 Subject: [PATCH] Don't crash if we don't know what ABI to use. Assume some defaults instead. --- gen/abi.cpp | 31 ++++++++++++++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git a/gen/abi.cpp b/gen/abi.cpp index 5bb09323..d62ebcd9 100644 --- a/gen/abi.cpp +++ b/gen/abi.cpp @@ -6,6 +6,7 @@ #include "gen/llvmhelpers.h" #include "gen/tollvm.h" #include "gen/abi.h" +#include "gen/logger.h" ////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////// @@ -205,6 +206,33 @@ struct X86_64TargetABI : TargetABI } }; +////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////// +/////////////////// Unknown targets ////////////////////////// +////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////// + +// Some reasonable defaults for when we don't know what ABI to use. +struct UnknownTargetABI : TargetABI +{ + UnknownTargetABI() + { + // Don't push anything into retOps, assume defaults will be fine. + } + + bool returnInArg(Type* t) + { + Type* rt = t->toBasetype(); + return (rt->ty == Tstruct); + } + + bool passByRef(Type* t) + { + t = t->toBasetype(); + return (t->ty == Tstruct || t->ty == Tsarray); + } +}; + ////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////// @@ -220,6 +248,7 @@ TargetABI * TargetABI::getTarget() case ARCHx86_64: return new X86_64TargetABI; default: - return NULL; + Logger::cout() << "WARNING: Unknown ABI, guessing...\n"; + return new UnknownTargetABI; } }