From 6259d4ee6c06cc6ae4ce07484b75f7d327a6a52a Mon Sep 17 00:00:00 2001 From: johannst Date: Thu, 19 Mar 2020 22:14:18 +0100 Subject: added gcc --- src/SUMMARY.md | 1 + src/gcc.md | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 59 insertions(+) create mode 100644 src/gcc.md (limited to 'src') diff --git a/src/SUMMARY.md b/src/SUMMARY.md index 45c07b5..80aced1 100644 --- a/src/SUMMARY.md +++ b/src/SUMMARY.md @@ -24,3 +24,4 @@ - [c++filt](./c++filt.md) - [c++](./c++.md) - [glibc](./glibc.md) +- [gcc](./gcc.md) diff --git a/src/gcc.md b/src/gcc.md new file mode 100644 index 0000000..1381242 --- /dev/null +++ b/src/gcc.md @@ -0,0 +1,58 @@ +# 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 + +## [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). + +```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 +```c +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 +``` + +[builtins]: https://gcc.gnu.org/onlinedocs/gcc/Other-Builtins.html -- cgit v1.2.3