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
This commit is contained in:
mtklein 2016-06-09 10:30:04 -07:00 committed by Commit bot
parent 609623b47f
commit eee3ced68f

18
gm/gm.h
View File

@ -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 {