Поддерживаемые GNU builtin’ы

В данном документе описываются только те builtin’ы, которые есть у gcc. Собственные builtin’ы описаны в статье Поддерживаемые MCST builtin’ы

Компилятор номинально совместим с gcc-7.3.0. Здесь мы перечислим ссылки на отдельные пункты из документации по gcc-7.3.0, посвящённые builtin’ам, и описанием того, что из всего множества у нас поддержано

  • 6.49 Getting the Return or Frame Address of a Function

    Поддержано с ограничениями:
    - Функция __builtin_return_address для e2k поддержана только для параметра с нулевым значением
    - Функция __builtin_frame_address поддержана только для параметра с нулевым значением
    - Функция __builtin_frob_return_address НЕ поддержана, т.к. не было необходимости. При необходимости можно будет поддержать
  • 6.50 Using Vector Instructions through Built-in Functions

    Поддержано с ограничениями:
    - Отсутствует поддержка ternary operator ?
    - Отсутствует поддержка logic operators
  • 6.51 Support for offsetof

    Поддержано
  • 6.52 Legacy __sync Built-in Functions for Atomic Memory Access

    Поддержано
    При работе с 16-байтными переменными имеется особенность, описанная в статье Потенциальные проблемы при использовании 16-байтных атомарных операций
    В защищённом режиме имеется ограничение. С использованием данных функций нельзя строить атомарные операции над дескрипторами (указателями). В данных функциях используется автоматическое определение типа, и для дескриптора в реальности будет построена атомарная операция над типом __int128_t, теряющая тэги
  • 6.53 Built-in Functions for Memory Model Aware Atomic Operations

    Поддержано
    При работе с 16-байтными переменными имеется особенность, описанная в статье Потенциальные проблемы при использовании 16-байтных атомарных операций
    В защищённом режиме имеется ограничение. Атомарные операции над дескрипторами (указателями) возможны только при использовании generic-версий функций: т.е. __atomic_load, __atomic_store, __atomic_exchange и __atomic_compare_exchange. Во прочих версиях функций, использующих автоматическое определение типа, для дескриптора в реальности будет построена атомарная операция над типом __int128_t, теряющая тэги
  • 6.54 Built-in Functions to Perform Arithmetic with Overflow Checking

    Поддержано с ограничениями:
    - Если хотя бы один из аргументов или результат функции __builtin_add_overflow, __builtin_sub_overflow или __builtin_mul_overflow имеют размер 128 бит, то все аргументы и результат должны иметь одинаковую знаковость. В противном случае формально требуется проведение вычислений над 129-битными значениями, это пока не поддержано. В случае компилятора для e90 в режиме -m32 в описании “128 бит” заменяется на “64 бита”, т.к. в этом режиме самый широкий целочисленный тип имеет размер 64 бита
    - Функции __builtin_add_overflow_p, __builtin_sub_overflow_p и __builtin_mul_overflow_p НЕ поддерживаются в случаях, где требуется constexpr-выражение (инициализаторы, описатели констант enum’а и т.п.)
  • 6.55 x86-Specific Memory Model Extensions for Transactional Memory

    НЕ поддержано - не было необходимости. При необходимости можно будет реализовать консервативную поддержку
  • 6.56 Object Size Checking Built-in Functions

    Поддержано консервативно: код будет компилироваться и исполняться, но не будет контроля за выходом за границу объекта
  • 6.57 Pointer Bounds Checker Built-in Functions

    НЕ поддержано - не было необходимости. При необходимости можно будет реализовать консервативную поддержку: код будет компилироваться и исполняться, но не будет контроля за выходом за границу выделенной области памяти
  • 6.58 Cilk Plus C/C++ Language Extension Built-in Functions

    НЕ поддержано - в компиляторе отсутствует поддержка языка Cilk Plus C/C++
  • 6.59 Other Built-in Functions Provided by GCC

    Поддержано с ограничениями:
    • При построении NaN’ов допустимое значение мантиссы ограничено 64-мя битами. Это касается:

      __builtin_nanl, __builtin_nansl для e90
      __builtin_nanq, __builtin_nansq для e2k и e90
    • Отсутствует поддержка функций для работы с типами _Decimal32, _Decimal64, _Decimal128 (описание) всвязи с отсутствием поддержки этих типов:

      __builtin_infd32, __builtin_infd64, __builtin_infd128
      __builtin_nand32, __builtin_nand64, __builtin_nand128
      __builtin_signbitd32, __builtin_signbitd64, __builtin_signbitd128
    • Отсутствует поддержка функций для работы с типами _Float32, _Float32x, _Float64, _Float64x, _Float128, _Float128x (описание, не путать с типом __float128) всвязи с отсутствием поддержки этих типов:

      __builtin_copysignf32, __builtin_copysignf64, __builtin_copysignf128
      __builtin_copysignf32x, __builtin_copysignf64x, __builtin_copysignf128x
      __builtin_fabsf32, __builtin_fabsf64, __builtin_fabsf128
      __builtin_fabsf32x, __builtin_fabsf64x, __builtin_fabsf128x
      __builtin_huge_valf32, __builtin_huge_valf64, __builtin_huge_valf128
      __builtin_huge_valf32x, __builtin_huge_valf64x, __builtin_huge_valf128x
      __builtin_inff32, __builtin_inff64, __builtin_inff128
      __builtin_inff32x, __builtin_inff64x, __builtin_inff128x
      __builtin_nanf32, __builtin_nanf64, __builtin_nanf128
      __builtin_nanf32x, __builtin_nanf64x, __builtin_nanf128x
      __builtin_nansf32, __builtin_nansf64, __builtin_nansf128
      __builtin_nansf32x, __builtin_nansf64x, __builtin_nansf128x
    • Отсутствует поддержка функций, т.к. реальной необходимости не было, а по описанию gcc нет чёткого понимания

      __builtin_alloca_with_align
      __builtin_call_with_static_chain
    • Отсутствует поддержка функций, т.к. реальной необходимости не было. При необходимости можно будет поддержать

      __builtin___clear_cache
      __builtin_LINE, __builtin_FUNCTION
  • 6.60.27 SPARC VIS Built-in Functions

    НЕ поддержано - не было необходимости. При необходимости можно будет поддержать
  • 6.60.32 x86 Built-in Functions

    Поддержано с ограничениями:
    - Функции, которые работают с типом __float128, поддержаны только для e2k. Для e90 (как и для родного sparc) они не нужны, т.к. имеется 128-битный long double
    - Функции __builtin_cpu_* на текущий момент поддержаны только для e2k. __builtin_cpu_is имеет свои собственные параметры, отличающиеся от intel’овских, описание см. в статье Поддерживаемые MCST builtin’ы. __builtin_cpu_supports НЕ поддержан, т.к. пока не было необходимости
    - Функции __builtin_ia32_* поддержаны только для e2k, в виде inline-функций, подключаемых через #include <x86intrin.h> или #include <immintrin.h>. Вместо добавления директивы #include можно использовать опции -include x86intrin.h или -include immintrin.h соответственно. НЕ поддержаны функции, реализующие расширения avx512*, а также те специфические расширения, которые не могут быть сделаны без поддержки в аппаратуре. К ним относятся расширения fxsr, lwp, pku, rtm, sgx, xsave*, rtm