back end Ta część GCC odpowiada za wygenerowanie kodu asemblera przeznaczonego dla konkretnej architektury sprzętowej, a z niego kodu obiektowego. Ponieważ na tym etapie kompilator ma wiele informacji na temat docelowej platformy może dokonać kolejnych optymalizacji kodu np. uwzględniając budowę procesora, zestaw jego rozkazów czy specyficzne rozszerzenia.
Rozszerzenia języka C GCC zawiera wiele rozszerzeń ponad to, co określają standardy ANSI i ISO.
Są to m.in.: zmienne etykietowe etykiety lokalne traktowanie dowolnych fragmentów kodu (statement) jako wyrażeń (expression) zagnieżdżanie definicji funkcji heksadecymalne deklarowanie zmiennych zmiennoprzecinkowych makra o zmiennej liczbie argumentów konstrukcja case z przedziałami
Zmienne etykietowe # include <stdio.h>
void foo (int nr) { static void * labels [] = {&&label0, &&label1};
goto *labels [nr]; label0: printf("Code 0\n"); return; label1: printf("Code 1\n"); return; }
int main() { foo(0); foo(1); return 0; }
Inline Assembler w C/C++ GCC umożliwia użycie asemblera w kodzie. Nie są to jednak pojedyncze instrukcje, tylko całe bloki razem ze zdefiniowanymi specjalnym systemem interfejsem między asemblerem a C/C++. Dzięki temu GCC może o wiele lepiej optymalizować kod.