From eee3ced68f787aadc47fa274ca8e13b354ec920a Mon Sep 17 00:00:00 2001 From: mtklein Date: Thu, 9 Jun 2016 10:30:04 -0700 Subject: [PATCH] Disable tail calls inside Simple GM functions. I haven't found any way to turn off the particular optimization (-foptimize-sibling-calls) per-function, but I can control optimization settings coarsely: - on GCC, we can pick a particular -O level, so I've picked -O1 which does not enable -foptimize-sibling-calls - on Clang, we can only disable all optimization for a function - have no idea about MSVC This should make sure the simple GM functions, e.g. all_bitmap_configs_GM(), show up on stack traces when we crash. BUG=skia: GOLD_TRYBOT_URL= https://gold.skia.org/search?issue=2050473006 Review-Url: https://codereview.chromium.org/2050473006 --- gm/gm.h | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/gm/gm.h b/gm/gm.h index e00a650f33..6fe59c2726 100644 --- a/gm/gm.h +++ b/gm/gm.h @@ -34,10 +34,20 @@ struct GrContextOptions; DEF_SIMPLE_GM_BG_NAME(NAME, CANVAS, W, H, SK_ColorWHITE, SkString(#NAME)) #define DEF_SIMPLE_GM_BG(NAME, CANVAS, W, H, BGCOLOR)\ DEF_SIMPLE_GM_BG_NAME(NAME, CANVAS, W, H, BGCOLOR, SkString(#NAME)) -#define DEF_SIMPLE_GM_BG_NAME(NAME, CANVAS, W, H, BGCOLOR, NAME_STR) \ - static void SK_MACRO_CONCAT(NAME, _GM)(SkCanvas * CANVAS); \ - DEF_GM(return new skiagm::SimpleGM(NAME_STR, SK_MACRO_CONCAT(NAME, _GM), \ - SkISize::Make(W, H), BGCOLOR);) \ + +// Disable tail calls in Simple GM functions to make sure they appear on any stack trace. +#if defined(__clang__) + #define DISABLE_TAIL_CALLS __attribute__((optnone)) +#elif defined(__GNUC__) + #define DISABLE_TAIL_CALLS __attribute__((optimize("-O1"))) +#else + #define DISABLE_TAIL_CALLS /*TODO: MSVC*/ +#endif + +#define DEF_SIMPLE_GM_BG_NAME(NAME, CANVAS, W, H, BGCOLOR, NAME_STR) \ + static void DISABLE_TAIL_CALLS SK_MACRO_CONCAT(NAME, _GM)(SkCanvas * CANVAS); \ + DEF_GM(return new skiagm::SimpleGM(NAME_STR, SK_MACRO_CONCAT(NAME, _GM), \ + SkISize::Make(W, H), BGCOLOR);) \ void SK_MACRO_CONCAT(NAME, _GM)(SkCanvas * CANVAS) namespace skiagm {