2012-04-24 3 views
10

Я работаю над проектом, который я компилировал с LLVM 2.6 и интерфейсом llvm-gcc. Я пытаюсь проверить его компиляцию с помощью LLVM 3.1 и clang. Когда я сделал это, я получил следующее сообщение об ошибке о -O5 уровне оптимизации:Уровни оптимизации в LLVM и Clang

error: invalid value '5' in '-O5' 

Однако, LLVM 2.6 и LLVM-GCC работали отлично с -O5 флагом. Я увидел следующую документацию об уровнях оптимизации лязга:

-O0 -O1 -O2 -Os -O3 -O4 
     Specify which optimization level to use. -O0 means "no optimization": this level compiles the 
     fastest and generates the most debuggable code. -O2 is a moderate level of optimization which 
     enables most optimizations. -Os is like -O2 with extra optimizations to reduce code size. -O3 
     is like -O2, except that it enables optimizations that take longer to perform or that may 
     generate larger code (in an attempt to make the program run faster). On supported platforms, -O4 
     enables link-time optimization; object files are stored in the LLVM bitcode file format and whole 
     program optimization is done at link time. -O1 is somewhere between -O0 and -O2. 

Так что я пытаюсь выяснить, что -O5 в Makefile я работаю делает в первую очередь (я не писать Makefile). Это что-то, что изменилось и использовалось для использования с LLVM? Или это еще полезная функция, и мне просто нужно активировать ее каким-то другим способом.

Кроме того, в случае, если это полезно команда я бегу, что дает ошибку в основном:

/bin/clang -g -c -mcmodel=medium -fstrict-aliasing -Wstrict-aliasing -O5 -emit-llvm -fkeep-inline-functions -fno-stack-protector -c -o foo.bc foo.cpp 

Кроме того, в случае, это важно, я бегу в системе x86_64 Linux (Ubuntu 10.04).

ответ

12

Gcc обрабатывает любой -On при п> = 4 as -O3:

Флаг -O принимает любое число от 0-9, но реализуются только от нуля до трех, и я не думаю, что у любого есть планы, чтобы когда-либо реализовать четыре-девять в ближайшее время. Тот факт, что люди используют эту -O9-идиому, немного беспокоит, потому что подразумевает, что они хотят, чтобы каждая мыслимая оптимизация, которую gcc могла бы , возможно, когда-либо предлагала, даже если она сделала сборку за несколько недель без прибыли .

Более высокие уровни не должны использоваться, у вас есть только качественный Makefile.

Так указав -O9 это немного - типа нонсенс

Таким образом, при использовании GCC компилятор, то есть действительные варианты -O «но это один идет в одиннадцать!»: -O0, -O1, -O2, -O3. Но драйвер будет конвертировать любой -On в -O3 молча.

LLVM (как лязг и LLVM-GCC варианты драйвера) поддерживает только уровни до -O4 (-O4 это так же, как -O3 -flto). Таким образом, вы не должны использовать -O4 без тестирования, потому что lto медленнее и, возможно, может сломать вашу программу.

2

Возможно, в файле Makefile была ошибка, которую llvm-gcc не распознал как ошибку, но clang сделал.

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