From 941903fbc22dec06fb59dd91e2759bfd8a5897ff Mon Sep 17 00:00:00 2001 From: Oleg Nykytenko Date: Thu, 8 Feb 2018 15:22:28 +0200 Subject: [PATCH 1/2] Solaris: fix assert for betterC build. --- gen/llvmhelpers.cpp | 8 ++++++++ gen/runtime.cpp | 6 +++++- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/gen/llvmhelpers.cpp b/gen/llvmhelpers.cpp index 77f3a4d2d77..49b6c53d437 100644 --- a/gen/llvmhelpers.cpp +++ b/gen/llvmhelpers.cpp @@ -311,6 +311,14 @@ void DtoCAssert(Module *M, Loc &loc, LLValue *msg) { args.push_back(file); args.push_back(line); args.push_back(msg); + } else if (global.params.targetTriple->isOSSolaris()) { + const auto irFunc = gIR->func(); + const auto funcName = + irFunc && irFunc->decl ? irFunc->decl->toPrettyChars() : ""; + args.push_back(msg); + args.push_back(file); + args.push_back(line); + args.push_back(DtoConstCString(funcName)); } else if (global.params.targetTriple->getEnvironment() == llvm::Triple::Android) { args.push_back(file); diff --git a/gen/runtime.cpp b/gen/runtime.cpp index 3c575347f17..11535ce94b3 100644 --- a/gen/runtime.cpp +++ b/gen/runtime.cpp @@ -165,6 +165,8 @@ llvm::Function *getRuntimeFunction(const Loc &loc, llvm::Module &target, // const char *msg) // Android: void __assert(const char *file, int line, const char *msg) // MSVC: void _assert(const char *msg, const char *file, unsigned line) +// Solaris: void __assert_c99(const char *assertion, const char *filename, int line_num, +// const char *funcname); // else: void __assert(const char *msg, const char *file, unsigned line) static const char *getCAssertFunctionName() { @@ -172,6 +174,8 @@ static const char *getCAssertFunctionName() { return "__assert_rtn"; } else if (global.params.targetTriple->isWindowsMSVCEnvironment()) { return "_assert"; + } else if (global.params.targetTriple->isOSSolaris()) { + return "__assert_c99"; } return "__assert"; } @@ -180,7 +184,7 @@ static std::vector getCAssertFunctionParamTypes() { const auto voidPtr = Type::tvoidptr; const auto uint = Type::tuns32; - if (global.params.targetTriple->isOSDarwin()) { + if (global.params.targetTriple->isOSDarwin() || global.params.targetTriple->isOSSolaris()) { return {voidPtr, voidPtr, uint, voidPtr}; } if (global.params.targetTriple->getEnvironment() == llvm::Triple::Android) { From a8cf534469e54708790b8ab86030ed1ebcfcd1cd Mon Sep 17 00:00:00 2001 From: Oleg Nykytenko Date: Fri, 9 Feb 2018 08:07:51 +0200 Subject: [PATCH 2/2] Added parens to avoid relying on operator precedence rules. --- gen/llvmhelpers.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gen/llvmhelpers.cpp b/gen/llvmhelpers.cpp index 49b6c53d437..7d4696bf50c 100644 --- a/gen/llvmhelpers.cpp +++ b/gen/llvmhelpers.cpp @@ -314,7 +314,7 @@ void DtoCAssert(Module *M, Loc &loc, LLValue *msg) { } else if (global.params.targetTriple->isOSSolaris()) { const auto irFunc = gIR->func(); const auto funcName = - irFunc && irFunc->decl ? irFunc->decl->toPrettyChars() : ""; + (irFunc && irFunc->decl) ? irFunc->decl->toPrettyChars() : ""; args.push_back(msg); args.push_back(file); args.push_back(line);