GCC options

TIPs 2008. 9. 7. 21:34
출력의 종류를 제어하는 옵션

-c
어셈블 소스 코드를 컴파일 하지만, 링크하지는 않는다. 기본 출력형태는 '.o'

-S
조립하지 않고, 컴파일 단계 후에 멈춘다. 아웃풋은 어셈블러 코드의 형태. 기본 출력 형태는 '.s'

-E
전처리 작업 후에 멈춘다. 출력은 전처리된 소스코드이고 표준 출력으로 보내진다.

-o file
file로 결과물을 생성한다.

-pipe
컴파일의 여러 단계에서 서로 통신하기 위해 임시 파일을 사용하지 않고 파이프를 사용한다. 어셈블러가 파이프에서 읽을 수 없는 시스템에서는 실패한다.




C 언어 제어 옵션

-ansi
C모드에서는 '-std=c89'와 같고, C++모드에서는 '-std=c++98'과 같다.
이것은 asm이나 typeof 같은 키워드, unix와 vax같은 메크로등과 같이 ISO C90, 표준 C++과 호환되지 않는 특징들을 끈다. 이 옵션을 사용하더라도 __asm__, __extension__, __inline__, __typeof__ 와 같은 키워드나 __unix__, __vax__와 같은 메크로는 여전히 동작 한다. -ansi옵션은 non-ISO프로그램이 근거없이 거부되게 하지는 않는다. 이를 위해 -ansi 옵션이 사용될 때는 -pedantic이 함께 요구된다.

-std=
언어 표준을 결정한다.
          `c89'
          `iso9899:1990'
          모든 ISO C90 프로그램을 지원한다. C에서는 -asni와 같다.

          `iso9899:199409'
          개정된 ISO C90

          `c99'
          `c9x'
          `iso9899:1999'
          `iso9899:199x'
          ISO C99. 이 표준은 완전히 지원되지는 않는다.

         
`gnu89'
          C 코드에서의 기본. ISO C90에 대한 GNU 언어.

          `gnu99'
          `gnu9x'
          C99에 대한 GNU 언어. ISO C99가 완전히 구현되면 이것이 기본이 될 것임.

          `c++98'
          1998 ISO C++ 표준. C++ 코드에서는 -asni와 같다.

          `gnu++98'
          -std=c++98에 대한 GNU언어. C++코드에서의 기본. 

          `c++0x'
          ISO C++0x표준에 대한 드래프트. 시험적인 특성을 포함하고 있다.

          `gnu++0x'
          -std=c++0x에 대한 GNU 언어. 시험적인 특성 포함.

-fno-builtin
-fno-builtin-function



최적화 제어 옵션

-O
-O1
컴파일 시간에 크게 영향을 미치지 않는 범위 내에서 코드의 크기와 실행시간을 줄이려고 한다.
-O 옵션은 다음의 최적화 플래그를 활성화 시킨다.
          -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-ccp
          -ftree-ch
          -ftree-copyrename
          -ftree-dce
          -ftree-dominator-opts
          -ftree-dse
          -ftree-fre
          -ftree-sra
          -ftree-ter
          -funit-at-a-time
          -fomit-frame-pointer (이것을 활성화 시켰을때 디버깅에 영향을 미치지 않는 머신에서 활성화)

-O2
시간-공간 트레이드 오프를 수반하지 않는 최적화를 수행한다. 컴파일러는 -O2를 지정하지 않는 이상 루프 펼치기나 함수 인라인화를 수행하지 않는다. -O 옵션과 비교해서 코드를 생성하는데 걸리는 컴파일 시간과, 퍼포먼스를 모두 증가 시킨다.
-O2 옵션은 -O에 의해 활성화되는 플래그에 더하여 다음의 최적화 플래그를 활성화 시킨다.
          -fthread-jumps
          -falign-functions  -falign-jumps
          -falign-loops  -falign-labels
          -fcaller-saves
          -fcrossjumping
          -fcse-follow-jumps  -fcse-skip-blocks
          -fdelete-null-pointer-checks
          -fexpensive-optimizations
          -fgcse  -fgcse-lm 
          -foptimize-sibling-calls
          -fpeephole2
          -fregmove
          -freorder-blocks  -freorder-functions
          -frerun-cse-after-loop 
          -fsched-interblock  -fsched-spec
          -fschedule-insns  -fschedule-insns2
          -fstrict-aliasing -fstrict-overflow
          -ftree-pre
          -ftree-vrp
    
-O3
더 많은 최적화를 수행한다.
-O2에 의해 활성화되는 플래그에 더하여 다음의 최적화 플래그를 활성화 시킨다.
          -finline-functions
          -funswitch-loops
          -fpredictive-commoning
          -fgcse-after-reload
          -ftree-vectorize

-O0
기본값. 컴파일 시간을 줄이고, make debugging produce the expected results.

-Os
코드 크기에 최적화. -Os는 코드 크기를 증가시키지 않는 모든 -O2옵션을 가능하게 한다.
-Os 옵션은 다음의 최적화 플래그를 비활성화 시킨다.
          -falign-functions  -falign-jumps  -falign-loops
          -falign-labels  -freorder-blocks  -freorder-blocks-and-partition
          -fprefetch-loop-arrays  -ftree-vect-loop-version

-fflag 형태의 옵션은 기계 독립적인 플래그를 명시한다. 대부분의 플래그는 +와 -의 형태를 갖는다. -ffoo의 반대 형태는 -fno-foo일 것이다. 다음의 리스트 에서 -no를 붙이거나 빼서 다른 형태를 알 수 있을 것이다.

-fomit-frame-pointer
이것을 필요로 하지 않는 함수에서 레지스터에 프레임 포인터를 저장하고 있지 않는다. 이것은 프레임 포인터를 저장, 셋업, 복구하는 명령어를 사용하지 않게 해 주며, 여분의 레지스터를 많은 함수에서 사용 가능하게 해 준다. 이것은 어떤 기기에서는 디버깅을 불가능하게 한다.

: