📄 20011119-1.c
字号:
/* Test for reload failing to eliminate from argp to sp. *//* { dg-do run { target i?86-*-* } } *//* { dg-options "-O2 -fomit-frame-pointer" } */static int ustrsize (const char *s);static int (*ucwidth) (int c);static int (*ugetxc) (const char **s);static int (*usetc) (char *s, int c);char *ustrzcat(char *dest, int size, const char *src){ int pos = ustrsize(dest); int c; size -= pos + ucwidth(0); while ((c = ugetxc(&src)) != 0) { size -= ucwidth(c); if (size < 0) break; pos += usetc(dest+pos, c); } usetc(dest+pos, 0); return dest;}static int __attribute__((noinline))ustrsize (const char *s){ return 0;}static intucwidth_ (int c){ return 1;}static intugetxc_ (const char **s){ return '\0';}static intusetc_ (char *s, int c){ return 1;}intmain(){ ucwidth = ucwidth_; ugetxc = ugetxc_; usetc = usetc_; /* ??? It is impossible to explicitly modify the hard frame pointer. This will run afoul of code in flow.c that declines to mark regs in eliminate_regs in regs_ever_used. Apparently, we have to wait for reload to decide that it won't need a frame pointer before a variable can be allocated to %ebp. So save, restore, and clobber %ebp by hand. */ asm ("pushl %%ebp\n\t" "movl $-1, %%ebp\n\t" "pushl $0\n\t" "pushl $0\n\t" "pushl $0\n\t" "call %P0\n\t" "addl $12, %%esp\n\t" "popl %%ebp" : : "i"(ustrzcat)); return 0;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -