2016-01-23 4 views
0

Мне не удалось найти флаг, который управляет оптимизацией значения named для языка C. Для C++ он выглядит как -fno-elide-constructors.Отключить оптимизацию значения возвращаемого значения в gcc для чистого C

Исходный код, реализующий его: here, но поскольку он является средним, информация об интерфейсе не испорчена даже в комментариях. The manual section тоже не помогло. Однако разборке показывает, что он выключен на O0 и включен O1 он должен быть один из следующих: код

 -fauto-inc-dec 
     -fcprop-registers 
     -fdce 
     -fdefer-pop 
     -fdelayed-branch 
     -fdse 
     -fguess-branch-probability 
     -fif-conversion2 
     -fif-conversion 
     -finline-small-functions 
     -fipa-pure-const 
     -fipa-reference 
     -fmerge-constants 
     -fsplit-wide-types 
     -ftree-builtin-call-dce 
     -ftree-ccp 
     -ftree-ch 
     -ftree-copyrename 
     -ftree-dce 
     -ftree-dominator-opts 
     -ftree-dse 
     -ftree-fre 
     -ftree-sra 
     -ftree-ter 
     -funit-at-a-time 

C:

struct p { 
    long x; 
    long y; 
    long z; 
}; 

__attribute__((noinline)) 
struct p f(void) { 
    struct p copy; 
    copy.x = 1; 
    copy.y = 2; 
    copy.z = 3; 
    return copy; 
} 

int main(int argc, char** argv) { 
    volatile struct p inst = f(); 
    return 0; 
} 

Собран с O0 мы видим, что «копия» структура наивности выделяется на стеке:

00000000004004b6 <f>: 
    4004b6: 55      push rbp 
    4004b7: 48 89 e5    mov rbp,rsp 
    4004ba: 48 89 7d d8    mov QWORD PTR [rbp-0x28],rdi 
    4004be: 48 c7 45 e0 01 00 00 mov QWORD PTR [rbp-0x20],0x1 
    4004c5: 00 
    4004c6: 48 c7 45 e8 02 00 00 mov QWORD PTR [rbp-0x18],0x2 
    4004cd: 00 
    4004ce: 48 c7 45 f0 03 00 00 mov QWORD PTR [rbp-0x10],0x3 
    4004d5: 00 
    4004d6: 48 8b 45 d8    mov rax,QWORD PTR [rbp-0x28] 
    4004da: 48 8b 55 e0    mov rdx,QWORD PTR [rbp-0x20] 
    4004de: 48 89 10    mov QWORD PTR [rax],rdx 
    4004e1: 48 8b 55 e8    mov rdx,QWORD PTR [rbp-0x18] 
    4004e5: 48 89 50 08    mov QWORD PTR [rax+0x8],rdx 
    4004e9: 48 8b 55 f0    mov rdx,QWORD PTR [rbp-0x10] 
    4004ed: 48 89 50 10    mov QWORD PTR [rax+0x10],rdx 
    4004f1: 48 8b 45 d8    mov rax,QWORD PTR [rbp-0x28] 
    4004f5: 5d      pop rbp 
    4004f6: c3      ret  

Составитель с O1 не выделяется, но указатель передается в качестве аргумента неявной

00000000004004b6 <f>: 
    4004b6: 48 89 f8    mov rax,rdi 
    4004b9: 48 c7 07 01 00 00 00 mov QWORD PTR [rdi],0x1 
    4004c0: 48 c7 47 08 02 00 00 mov QWORD PTR [rdi+0x8],0x2 
    4004c7: 00 
    4004c8: 48 c7 47 10 03 00 00 mov QWORD PTR [rdi+0x10],0x3 
    4004cf: 00 
    4004d0: c3      ret 
+1

Поскольку вы определили проход, который хотите отключить: '-fdisable-tree-nrv'. Ваше «это должно быть одно из следующего» не имеет смысла. –

+0

Некоторые из нас, конечно, интересуются **, когда ** это полезно. –

+0

Что вы пытаетесь достичь, делая это? – fuz

ответ

2

Ближайшая вещь в отношении GCC (т.е. переключатель для копирования) - -fcprop-registers. Копирование elision не существует в C, но это самая схожая функция. От человека странице:

После распределения регистров и пост-регистр команд распределения расщеплению, мы выполняем копирование цикл распространения, чтобы попытаться уменьшить зависимостей планирования, а иногда и устранить копию. Включено на уровнях -O, -O2, -O3, -Os.

Смежные вопросы