notailcall-1.c
来自「Mac OS X 10.4.9 for x86 Source Code gcc」· C语言 代码 · 共 74 行
C
74 行
/* APPLE LOCAL file Radar 3830232 *//* { dg-do compile { target *-*-darwin* } } *//* { dg-options "-O2" } *//* { dg-final { scan-assembler-not "\(jmp|b\)\[ \\t\]+_*init_iconv_desc" } } *//* Contributed by Andrew Pinski 26 Oct 2004 <pinskia@gcc.gnu.org> */struct cset_converter { int func; int cd; };void abort(void); int puts(const char*);int f(int i){return i;}void g(void){puts("hi");}struct conversion{ int pair; int func; int fake_cd;};static const struct conversion conversion_tab[] = { { 2, 2, 2 }, { 3, 3, 3 }};static struct cset_converterinit_iconv_desc (int i){ struct cset_converter ret; unsigned i1; char *pair; if (!i) { ret.func = 0; ret.cd = 0; return ret; } pair = __builtin_alloca(i*3); for (i1 = 0; i1 < (sizeof (conversion_tab) / sizeof ((conversion_tab)[0])); i1++) if (i == conversion_tab[i1].pair) { ret.func = conversion_tab[i1].func; ret.cd = conversion_tab[i1].fake_cd; return ret; } ret.func = 2; ret.cd = f(i); if (ret.cd == 4) { g(); ret.func = 4; } return ret;}struct f{ struct cset_converter a; struct cset_converter b;};void ff(struct f *a){ a->a = init_iconv_desc(0); /* Compiler was illegally optimizing this call into a tailcall (jmp). Radar 3830232 */ a->b = init_iconv_desc(1);}int main(void){ struct f a; ff (&a); if (a.a.func!=0 || a.a.cd !=0) abort(); if (a.b.func!=2 || a.b.cd !=1) abort(); return 0;}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?