# gcc(1) ## CLI ### Preprocessing While debugging can be helpful to just pre-process files. ```bash gcc -E [-dM] ... ``` - `-E` run only preprocessor - `-dM` list only `#define` statements - `-###` dry-run, outputting exact compiler/linker invocations - `-print-multi-lib` print available multilib configurations - `--help=` print description of cmdline options for given class, eg `warnings`, `optimizers`, `target`, `c`, `c++` ### Target options ```bash # List all target options with their description. gcc --help=target # Configure for current cpu arch and query (-Q) value of options. gcc -march=native -Q --help=target ``` ### Warnings / optimizations ```bash # List available warnings with short description. gcc --help=warnings # List available optimizations with short description. gcc --help=optimizers # Prepend --help with `-Q` to print wheter options are enabled or disabled # instead showing their description. ``` ## [Builtins][builtins] ### `__builtin_expect(expr, cond)` Give the compiler a hint which branch is hot, so it can lay out the code accordingly to reduce number of jump instructions. See on [compiler explorer](https://godbolt.org/z/MbTHAP). The semantics of this hint are as follows, the compiler prioritises `expr == cond`. So `__builtin_expect(expr, 0)` means that we expect the `expr` to be `0` most of the time. ```bash echo " extern void foo(); extern void bar(); void run0(int x) { if (__builtin_expect(x,0)) { foo(); } else { bar(); } } void run1(int x) { if (__builtin_expect(x,1)) { foo(); } else { bar(); } } " | gcc -O2 -S -masm=intel -o /dev/stdout -xc - ``` Will generate something similar to the following. - `run0`: `bar` is on the path without branch - `run1`: `foo` is on the path without branch ```x86asm run0: test edi, edi jne .L4 xor eax, eax jmp bar .L4: xor eax, eax jmp foo run1: test edi, edi je .L6 xor eax, eax jmp foo .L6: xor eax, eax jmp bar ``` ## ABI (Linux) - C ABI (x86_64) - [SystemV ABI][sysvabi] - C++ ABI - [C++ Itanium ABI][cppabi] [builtins]: https://gcc.gnu.org/onlinedocs/gcc/Other-Builtins.html [sysvabi]: https://gitlab.com/x86-psABIs/x86-64-ABI [cppabi]: https://itanium-cxx-abi.github.io/cxx-abi