From 7678a9d09c45cc9ae2b9f591f3565d10a503aadd Mon Sep 17 00:00:00 2001 From: Kimball Thurston Date: Sun, 25 Aug 2019 14:46:54 +1200 Subject: [PATCH] Force vtable into a translation unit Signed-off-by: Kimball Thurston --- IlmBase/Iex/IexBaseExc.cpp | 173 +++++++++++++++++++++++++++++++++++ IlmBase/Iex/IexBaseExc.h | 3 +- IlmBase/Imath/CMakeLists.txt | 1 + IlmBase/Imath/ImathExc.cpp | 15 +++ IlmBase/Imath/Makefile.am | 2 +- 5 files changed, 192 insertions(+), 2 deletions(-) create mode 100644 IlmBase/Imath/ImathExc.cpp diff --git a/IlmBase/Iex/IexBaseExc.cpp b/IlmBase/Iex/IexBaseExc.cpp index 49721b7afb..fda2aa4f22 100644 --- a/IlmBase/Iex/IexBaseExc.cpp +++ b/IlmBase/Iex/IexBaseExc.cpp @@ -43,6 +43,8 @@ #include "IexExport.h" #include "IexBaseExc.h" #include "IexMacros.h" +#include "IexErrnoExc.h" +#include "IexMathExc.h" #ifdef _WIN32 #include @@ -189,6 +191,177 @@ BaseExc::stackTrace () const return _stackTrace; } +DEFINE_EXC_EXP_IMPL (IEX_EXPORT, ArgExc, BaseExc) +DEFINE_EXC_EXP_IMPL (IEX_EXPORT, LogicExc, BaseExc) +DEFINE_EXC_EXP_IMPL (IEX_EXPORT, InputExc, BaseExc) +DEFINE_EXC_EXP_IMPL (IEX_EXPORT, IoExc, BaseExc) +DEFINE_EXC_EXP_IMPL (IEX_EXPORT, MathExc, BaseExc) +DEFINE_EXC_EXP_IMPL (IEX_EXPORT, ErrnoExc, BaseExc) +DEFINE_EXC_EXP_IMPL (IEX_EXPORT, NoImplExc, BaseExc) +DEFINE_EXC_EXP_IMPL (IEX_EXPORT, NullExc, BaseExc) +DEFINE_EXC_EXP_IMPL (IEX_EXPORT, TypeExc, BaseExc) + +DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EpermExc, ErrnoExc) +DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EnoentExc, ErrnoExc) +DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EsrchExc, ErrnoExc) +DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EintrExc, ErrnoExc) +DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EioExc, ErrnoExc) +DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EnxioExc, ErrnoExc) +DEFINE_EXC_EXP_IMPL (IEX_EXPORT, E2bigExc, ErrnoExc) +DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EnoexecExc, ErrnoExc) +DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EbadfExc, ErrnoExc) +DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EchildExc, ErrnoExc) +DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EagainExc, ErrnoExc) +DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EnomemExc, ErrnoExc) +DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EaccesExc, ErrnoExc) +DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EfaultExc, ErrnoExc) +DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EnotblkExc, ErrnoExc) +DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EbusyExc, ErrnoExc) +DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EexistExc, ErrnoExc) +DEFINE_EXC_EXP_IMPL (IEX_EXPORT, ExdevExc, ErrnoExc) +DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EnodevExc, ErrnoExc) +DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EnotdirExc, ErrnoExc) +DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EisdirExc, ErrnoExc) +DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EinvalExc, ErrnoExc) +DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EnfileExc, ErrnoExc) +DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EmfileExc, ErrnoExc) +DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EnottyExc, ErrnoExc) +DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EtxtbsyExc, ErrnoExc) +DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EfbigExc, ErrnoExc) +DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EnospcExc, ErrnoExc) +DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EspipeExc, ErrnoExc) +DEFINE_EXC_EXP_IMPL (IEX_EXPORT, ErofsExc, ErrnoExc) +DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EmlinkExc, ErrnoExc) +DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EpipeExc, ErrnoExc) +DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EdomExc, ErrnoExc) +DEFINE_EXC_EXP_IMPL (IEX_EXPORT, ErangeExc, ErrnoExc) +DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EnomsgExc, ErrnoExc) +DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EidrmExc, ErrnoExc) +DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EchrngExc, ErrnoExc) +DEFINE_EXC_EXP_IMPL (IEX_EXPORT, El2nsyncExc, ErrnoExc) +DEFINE_EXC_EXP_IMPL (IEX_EXPORT, El3hltExc, ErrnoExc) +DEFINE_EXC_EXP_IMPL (IEX_EXPORT, El3rstExc, ErrnoExc) +DEFINE_EXC_EXP_IMPL (IEX_EXPORT, ElnrngExc, ErrnoExc) +DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EunatchExc, ErrnoExc) +DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EnocsiExc, ErrnoExc) +DEFINE_EXC_EXP_IMPL (IEX_EXPORT, El2hltExc, ErrnoExc) +DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EdeadlkExc, ErrnoExc) +DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EnolckExc, ErrnoExc) +DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EbadeExc, ErrnoExc) +DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EbadrExc, ErrnoExc) +DEFINE_EXC_EXP_IMPL (IEX_EXPORT, ExfullExc, ErrnoExc) +DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EnoanoExc, ErrnoExc) +DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EbadrqcExc, ErrnoExc) +DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EbadsltExc, ErrnoExc) +DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EdeadlockExc, ErrnoExc) +DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EbfontExc, ErrnoExc) +DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EnostrExc, ErrnoExc) +DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EnodataExc, ErrnoExc) +DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EtimeExc, ErrnoExc) +DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EnosrExc, ErrnoExc) +DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EnonetExc, ErrnoExc) +DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EnopkgExc, ErrnoExc) +DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EremoteExc, ErrnoExc) +DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EnolinkExc, ErrnoExc) +DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EadvExc, ErrnoExc) +DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EsrmntExc, ErrnoExc) +DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EcommExc, ErrnoExc) +DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EprotoExc, ErrnoExc) +DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EmultihopExc, ErrnoExc) +DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EbadmsgExc, ErrnoExc) +DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EnametoolongExc, ErrnoExc) +DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EoverflowExc, ErrnoExc) +DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EnotuniqExc, ErrnoExc) +DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EbadfdExc, ErrnoExc) +DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EremchgExc, ErrnoExc) +DEFINE_EXC_EXP_IMPL (IEX_EXPORT, ElibaccExc, ErrnoExc) +DEFINE_EXC_EXP_IMPL (IEX_EXPORT, ElibbadExc, ErrnoExc) +DEFINE_EXC_EXP_IMPL (IEX_EXPORT, ElibscnExc, ErrnoExc) +DEFINE_EXC_EXP_IMPL (IEX_EXPORT, ElibmaxExc, ErrnoExc) +DEFINE_EXC_EXP_IMPL (IEX_EXPORT, ElibexecExc, ErrnoExc) +DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EilseqExc, ErrnoExc) +DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EnosysExc, ErrnoExc) +DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EloopExc, ErrnoExc) +DEFINE_EXC_EXP_IMPL (IEX_EXPORT, ErestartExc, ErrnoExc) +DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EstrpipeExc, ErrnoExc) +DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EnotemptyExc, ErrnoExc) +DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EusersExc, ErrnoExc) +DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EnotsockExc, ErrnoExc) +DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EdestaddrreqExc, ErrnoExc) +DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EmsgsizeExc, ErrnoExc) +DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EprototypeExc, ErrnoExc) +DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EnoprotooptExc, ErrnoExc) +DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EprotonosupportExc, ErrnoExc) +DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EsocktnosupportExc, ErrnoExc) +DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EopnotsuppExc, ErrnoExc) +DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EpfnosupportExc, ErrnoExc) +DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EafnosupportExc, ErrnoExc) +DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EaddrinuseExc, ErrnoExc) +DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EaddrnotavailExc, ErrnoExc) +DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EnetdownExc, ErrnoExc) +DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EnetunreachExc, ErrnoExc) +DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EnetresetExc, ErrnoExc) +DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EconnabortedExc, ErrnoExc) +DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EconnresetExc, ErrnoExc) +DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EnobufsExc, ErrnoExc) +DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EisconnExc, ErrnoExc) +DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EnotconnExc, ErrnoExc) +DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EshutdownExc, ErrnoExc) +DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EtoomanyrefsExc, ErrnoExc) +DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EtimedoutExc, ErrnoExc) +DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EconnrefusedExc, ErrnoExc) +DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EhostdownExc, ErrnoExc) +DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EhostunreachExc, ErrnoExc) +DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EalreadyExc, ErrnoExc) +DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EinprogressExc, ErrnoExc) +DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EstaleExc, ErrnoExc) +DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EioresidExc, ErrnoExc) +DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EucleanExc, ErrnoExc) +DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EnotnamExc, ErrnoExc) +DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EnavailExc, ErrnoExc) +DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EisnamExc, ErrnoExc) +DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EremoteioExc, ErrnoExc) +DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EinitExc, ErrnoExc) +DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EremdevExc, ErrnoExc) +DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EcanceledExc, ErrnoExc) +DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EnolimfileExc, ErrnoExc) +DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EproclimExc, ErrnoExc) +DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EdisjointExc, ErrnoExc) +DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EnologinExc, ErrnoExc) +DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EloginlimExc, ErrnoExc) +DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EgrouploopExc, ErrnoExc) +DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EnoattachExc, ErrnoExc) +DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EnotsupExc, ErrnoExc) +DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EnoattrExc, ErrnoExc) +DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EdircorruptedExc, ErrnoExc) +DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EdquotExc, ErrnoExc) +DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EnfsremoteExc, ErrnoExc) +DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EcontrollerExc, ErrnoExc) +DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EnotcontrollerExc, ErrnoExc) +DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EenqueuedExc, ErrnoExc) +DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EnotenqueuedExc, ErrnoExc) +DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EjoinedExc, ErrnoExc) +DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EnotjoinedExc, ErrnoExc) +DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EnoprocExc, ErrnoExc) +DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EmustrunExc, ErrnoExc) +DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EnotstoppedExc, ErrnoExc) +DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EclockcpuExc, ErrnoExc) +DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EinvalstateExc, ErrnoExc) +DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EnoexistExc, ErrnoExc) +DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EendofminorExc, ErrnoExc) +DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EbufsizeExc, ErrnoExc) +DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EemptyExc, ErrnoExc) +DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EnointrgroupExc, ErrnoExc) +DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EinvalmodeExc, ErrnoExc) +DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EcantextentExc, ErrnoExc) +DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EinvaltimeExc, ErrnoExc) +DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EdestroyedExc, ErrnoExc) + +DEFINE_EXC_EXP_IMPL (IEX_EXPORT, OverflowExc, MathExc) +DEFINE_EXC_EXP_IMPL (IEX_EXPORT, UnderflowExc, MathExc) +DEFINE_EXC_EXP_IMPL (IEX_EXPORT, DivzeroExc, MathExc) +DEFINE_EXC_EXP_IMPL (IEX_EXPORT, InexactExc, MathExc) +DEFINE_EXC_EXP_IMPL (IEX_EXPORT, InvalidFpOpExc, MathExc) IEX_INTERNAL_NAMESPACE_SOURCE_EXIT diff --git a/IlmBase/Iex/IexBaseExc.h b/IlmBase/Iex/IexBaseExc.h index 4333da6d33..50149fec2e 100644 --- a/IlmBase/Iex/IexBaseExc.h +++ b/IlmBase/Iex/IexBaseExc.h @@ -136,8 +136,9 @@ class BaseExc: public std::exception inline name (const char* text) throw(): base (text) {} \ inline name (const std::string &text) throw(): base (text) {} \ inline name (std::stringstream &text) throw(): base (text) {} \ - inline ~name() throw() { } \ + exp ~name() throw() override; \ }; +#define DEFINE_EXC_EXP_IMPL(exp, name, base) name::~name() throw() {} // For backward compatibility. #define DEFINE_EXC(name, base) DEFINE_EXC_EXP(, name, base) diff --git a/IlmBase/Imath/CMakeLists.txt b/IlmBase/Imath/CMakeLists.txt index 9eccc10919..06ac2dd873 100644 --- a/IlmBase/Imath/CMakeLists.txt +++ b/IlmBase/Imath/CMakeLists.txt @@ -9,6 +9,7 @@ ilmbase_define_library(Imath ImathColorAlgo.cpp ImathFun.cpp ImathVec.cpp + ImathExc.cpp ImathMatrixAlgo.cpp HEADERS ImathBoxAlgo.h diff --git a/IlmBase/Imath/ImathExc.cpp b/IlmBase/Imath/ImathExc.cpp new file mode 100644 index 0000000000..6f14596923 --- /dev/null +++ b/IlmBase/Imath/ImathExc.cpp @@ -0,0 +1,15 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright Contributors to the OpenEXR Project. + +#include "ImathExc.h" + +IMATH_INTERNAL_NAMESPACE_SOURCE_ENTER + +DEFINE_EXC_EXP_IMPL (IMATH_EXPORT, NullVecExc, ::IEX_NAMESPACE::MathExc) +DEFINE_EXC_EXP_IMPL (IMATH_EXPORT, InfPointExc, ::IEX_NAMESPACE::MathExc) +DEFINE_EXC_EXP_IMPL (IMATH_EXPORT, NullQuatExc, ::IEX_NAMESPACE::MathExc) +DEFINE_EXC_EXP_IMPL (IMATH_EXPORT, SingMatrixExc, ::IEX_NAMESPACE::MathExc) +DEFINE_EXC_EXP_IMPL (IMATH_EXPORT, ZeroScaleExc, ::IEX_NAMESPACE::MathExc) +DEFINE_EXC_EXP_IMPL (IMATH_EXPORT, IntVecNormalizeExc, ::IEX_NAMESPACE::MathExc) + +IMATH_INTERNAL_NAMESPACE_SOURCE_EXIT diff --git a/IlmBase/Imath/Makefile.am b/IlmBase/Imath/Makefile.am index e087a38893..da4f1c9a7d 100644 --- a/IlmBase/Imath/Makefile.am +++ b/IlmBase/Imath/Makefile.am @@ -8,7 +8,7 @@ lib_LTLIBRARIES = libImath.la libImath_la_SOURCES = ImathMatrixAlgo.cpp ImathVec.cpp \ - ImathColorAlgo.cpp ImathFun.cpp \ + ImathColorAlgo.cpp ImathExc.cpp ImathFun.cpp \ ImathColorAlgo.h ImathMatrixAlgo.h ImathVec.h \ ImathShear.h ImathFun.h ImathBox.h ImathBoxAlgo.h \ ImathEuler.h ImathExc.h ImathLimits.h ImathLine.h \