Clang 中的属性(待完成)

  • 1. 介绍
  • 2. 函数属性
  • 2.1 #pragma omp declare simd
  • 2.2 #pragma omp declare target
  • 2.3 _Noreturn
  • 2.4 abi_tag
  • 2.5 acquire_capability, acquire_shared_capability
  • 2.6 alloc_align
  • 2.7 alloc_size
  • 2.8 allocator
  • 2.9 artificial
  • 2.10 assert_capability, assert_shared_capability
  • 2.11 assume_aligned
  • 2.12 availability
  • 2.13 callback
  • 2.14 carries_dependency
  • 2.15 cf_consumed
  • 2.16 cf_returns_not_retained
  • 2.17 cf_returns_retained
  • 2.18 code_seg
  • 2.19 convergent
  • 2.20 cpu_dispatch
  • 2.21 cpu_specific
  • 2.22 diagnose_if
  • 2.23 disable_tail_calls
  • 2.24 enable_if
  • 2.25 exclude_from_explicit_instantiation
  • 2.26 flatten
  • 2.27 force_align_arg_pointer
  • 2.28 format
  • 2.29 gnu_inline
  • 2.30 ifunc
  • 2.31 import_module
  • 2.32 import_name
  • 2.33 internal_linkage
  • 2.34 interrupt (ARM)
  • 2.35 interrupt (AVR)
  • 2.36 interrupt (MIPS)
  • 2.37 interrupt (RISCV)
  • 2.38 kernel
  • 2.39 lifetimebound
  • 2.40 long_call, far
  • 2.41 micromips
  • 2.42 mig_server_routine
  • 2.43 min_vector_width
  • 2.44 no_caller_saved_registers
  • 2.45 no_sanitize
  • 2.46 no_sanitize_address, no_address_safety_analysis
  • 2.47 no_sanitize_memory
  • 2.48 no_sanitize_thread
  • 2.49 no_speculative_load_hardening
  • 2.50 no_split_stack
  • 2.51 no_stack_protector
  • 2.52 noalias
  • 2.53 nocf_check
  • 2.54 nodiscard, warn_unused_result
  • 2.55 noduplicate
  • 2.56 nomicromips
  • 2.57 noreturn
  • 2.58 not_tail_called
  • 2.59 nothrow
  • 2.60 ns_consumed
  • 2.61 ns_consumes_self
  • 2.62 ns_returns_autoreleased
  • 2.63 ns_returns_not_retained
  • 2.64 ns_returns_retained
  • 2.65 objc_method_family
  • 2.66 objc_requires_super
  • 2.67 optnone
  • 2.68 os_consumed
  • 2.69 os_consumes_this
  • 2.70 os_returns_not_retained
  • 2.71 os_returns_retained
  • 2.72 os_returns_retained_on_non_zero
  • 2.73 os_returns_retained_on_zero
  • 2.74 overloadable
  • 2.75 reinitializes
  • 2.76 release_capability, release_shared_capability
  • 2.77 short_call, near
  • 2.78 signal
  • 2.79 speculative_load_hardening
  • 2.80 target
  • 2.81 try_acquire_capability, try_acquire_shared_capability
  • 2.82 xray_always_instrument, xray_never_instrument, xray_log_args
  • 2.83 xray_always_instrument, xray_never_instrument, xray_log_args
  • 3. 变量属性
  • 3.1 always_destroy
  • 3.2 dllexport
  • 3.3 dllimport
  • 3.4 init_seg
  • 3.5 maybe_unused, unused
  • 3.6 no_destroy
  • 3.7 nodebug
  • 3.8 noescape
  • 3.9 nosvm
  • 3.10 objc_externally_retained
  • 3.11 pass_object_size, pass_dynamic_object_size
  • 3.12 require_constant_initialization
  • 3.13 section, __declspec(allocate)
  • 3.14 swift_context
  • 3.15 swift_error_result
  • 3.16 swift_indirect_result
  • 3.17 swiftcall
  • 3.18 thread
  • 3.19 tls_model
  • 3.20 uninitialized



本文为译文,点击

此处查看原文。

1. 介绍

这个页面列出了 Clang 当前支持的属性。

2. 函数属性

pragma:编译指示
declare:声明
SIMD:单指令多数据结构(Single Instruction Multiple Data)
declspec:关键字详细用法

2.1 #pragma omp declare simd
  • 支持语法

GNU

C++11

C2x

__declspec

Keyword

#pragma

#pragma clang attribute

omp declare simd

可以将declare simd构造应用于一个函数,以支持创建一个或多个版本,这些版本可以使用来着一个SIMD循环中单个调用的SIMD指令处理多个参数。declare simd指示是一个声明性指示。一个函数可能有多个declare simd指示。对函数使用declare simd构造可以创建关联函数的SIMD版本,该版本可用于同时处理来自一个SIMD循环的单个调用的多个参数。declare simd构造的语法如下:

#pragma omp declare simd [clause[[,] clause] ...] new-line
[#pragma omp declare simd [clause[[,] clause] ...] new-line]
[...]
function definition or declaration

这里的clause是下列clause之一:

simdlen(length)
linear(argument-list[:constant-linear-step])
aligned(argument-list[:alignment])
uniform(argument-list)
inbranch
notinbranch
2.2 #pragma omp declare target
  • 支持语法

GNU

C++11

C2x

__declspec

Keyword

#pragma

#pragma clang attribute

omp declare target

declare target指示指定将变量和函数映射到一个用于 OpenMP offload 机制的设备。
declare target指示的语法如下:

#pragma omp declare target new-line
declarations-definition-seq
#pragma omp end declare target new-line
2.3 _Noreturn
  • 支持语法

GNU

C++11

C2x

__declspec

Keyword

#pragma

#pragma clang attribute

_Noreturn

声明为_Noreturn的函数不会返回给调用者。编译器将为声明为_Noreturn的函数生成诊断(diagnostic),该诊断似乎能够返回给调用者。

2.4 abi_tag
  • 支持语法

GNU

C++11

C2x

__declspec

Keyword

#pragma

#pragma clang attribute

abi_tag

gnu::abi_tag

abi_tag属性可以应用于函数、变量、类或内联命名空间声明,以修改实体修饰过的名称。它能够区分同一实体的不同版本,但是支持不同的ABI版本。例如,一个类的较新版本可以有一组不同的数据成员,因此具有不同的大小。使用abi_tag属性,可以为类类型的一个全局变量使用不同的修饰过的名称。因此,旧代码可以继续使用旧的修饰过的名称,而新代码将使用带有tags的新修饰过的名称。

2.5 acquire_capability, acquire_shared_capability
  • 支持语法

GNU

C++11

C2x

__declspec

Keyword

#pragma

#pragma clang attribute

acquire_capability acquire_shared_capability exclusive_lock_function shared_lock_function

clang::acquire_capability clang::acquire_shared_capability

将函数标记为获取capability

2.6 alloc_align
  • 支持语法

GNU

C++11

C2x

__declspec

Keyword

#pragma

#pragma clang attribute

alloc_align

gnu::alloc_align

在一个函数声明上使用_attribute__((alloc_align(<alignment>))来指定此函数的返回值(必须是指针类型)至少与指定参数的值对齐。、该参数由其在形式参数列表中的索引给出;第一个参数有索引1,除非该函数是一个 C++ 非静态成员函数,在这种情况下,第一个参数有索引2来解释隐式的this参数。

// 返回的指针具有由第一个参数指定的对齐方式。
void *a(size_t align) __attribute__((alloc_align(1)));

// 返回的指针具有由第二个参数指定的对齐方式。
void *b(void *v, size_t align) __attribute__((alloc_align(2)));

// 返回的指针具有由第二个可见参数指定的对齐方式,但是必须为隐式的“this”参数进行调整。
void *Foo::b(void *v, size_t align) __attribute__((alloc_align(3)));

注意,这个属性只是通知编译器,一个函数总是返回一个足够对齐的指针。它不会导致编译器发出代码来强制执行这种对齐。如果返回的指针没有充分对齐,则该行为是未定义的。

2.7 alloc_size
  • 支持语法

GNU

C++11

C2x

__declspec

Keyword

#pragma

#pragma clang attribute

alloc_size

gnu::alloc_size

Yes

可以将alloc_size属性放在返回指针的函数上,以便向编译器提示返回指针上可用的内存字节数。alloc_size接受一个或两个参数。

  • alloc_size(N)表示参数数字N等于返回指针上可用字节数。
  • alloc_size(N, M)表示参数数字N和参数数字M的乘积等于返回指针上可用字节数。

参数数字是基于1的。
如何使用alloc_size的示例:

void *my_malloc(int a) __attribute__((alloc_size(1)));
void *my_calloc(int a, int b) __attribute__((alloc_size(1, 2)));

int main() {
  void *const p = my_malloc(100);
  assert(__builtin_object_size(p, 0) == 100);
  void *const a = my_calloc(20, 5);
  assert(__builtin_object_size(a, 0) == 100);
}

注意
这个属性在 Clang 中的工作方式与在 GCC 中的工作方式不同。具体来说, clang 将只跟踪const指针(如上所述);我们放弃了没有标记为const的指针。在大多数情况下,这并不重要,因为 LLVM 支持alloc_size属性。然而,当与其他属性(如enable_if)一起使用时,这可能会导致轻微的不直观行为。

2.8 allocator
  • 支持语法

GNU

C++11

C2x

__declspec

Keyword

#pragma

#pragma clang attribute

allocator

__declspec(allocator)属性用于分配内存的函数,比如 C++ 中的new操作符。当发出 CodeView 调试信息(由clang -gcodeviewclang-cl /Z7启用)时,Clang 将尝试在调试信息中记录堆分配调用站点的代码偏移量。它还将记录使用一些本地启发式分配的类型。Visual Studio调试器使用这些信息来分析内存使用情况
与GCC的__attribute__((malloc))不同,这个属性不会以任何方式影响优化。

2.9 artificial
2.10 assert_capability, assert_shared_capability
2.11 assume_aligned
2.12 availability
2.13 callback
2.14 carries_dependency
2.15 cf_consumed
2.16 cf_returns_not_retained
2.17 cf_returns_retained
2.18 code_seg
2.19 convergent
2.20 cpu_dispatch
2.21 cpu_specific
2.22 diagnose_if
2.23 disable_tail_calls
2.24 enable_if
2.25 exclude_from_explicit_instantiation
2.26 flatten
2.27 force_align_arg_pointer
2.28 format
2.29 gnu_inline
2.30 ifunc
2.31 import_module
2.32 import_name
2.33 internal_linkage
2.34 interrupt (ARM)
2.35 interrupt (AVR)
2.36 interrupt (MIPS)
2.37 interrupt (RISCV)
2.38 kernel
2.39 lifetimebound
2.40 long_call, far
2.41 micromips
2.42 mig_server_routine
2.43 min_vector_width
2.44 no_caller_saved_registers
2.45 no_sanitize
2.46 no_sanitize_address, no_address_safety_analysis
2.47 no_sanitize_memory
2.48 no_sanitize_thread
2.49 no_speculative_load_hardening
2.50 no_split_stack
2.51 no_stack_protector
2.52 noalias
2.53 nocf_check
2.54 nodiscard, warn_unused_result
2.55 noduplicate
2.56 nomicromips
2.57 noreturn
2.58 not_tail_called
2.59 nothrow
2.60 ns_consumed
2.61 ns_consumes_self
2.62 ns_returns_autoreleased
2.63 ns_returns_not_retained
2.64 ns_returns_retained
2.65 objc_method_family
2.66 objc_requires_super
2.67 optnone
2.68 os_consumed
2.69 os_consumes_this
2.70 os_returns_not_retained
2.71 os_returns_retained
2.72 os_returns_retained_on_non_zero
2.73 os_returns_retained_on_zero
2.74 overloadable
2.75 reinitializes
2.76 release_capability, release_shared_capability
2.77 short_call, near
2.78 signal
2.79 speculative_load_hardening
2.80 target
2.81 try_acquire_capability, try_acquire_shared_capability
2.82 xray_always_instrument, xray_never_instrument, xray_log_args
2.83 xray_always_instrument, xray_never_instrument, xray_log_args

3. 变量属性

3.1 always_destroy
3.2 dllexport
3.3 dllimport
3.4 init_seg
3.5 maybe_unused, unused
3.6 no_destroy
3.7 nodebug
3.8 noescape
3.9 nosvm
3.10 objc_externally_retained
3.11 pass_object_size, pass_dynamic_object_size
3.12 require_constant_initialization
3.13 section, __declspec(allocate)
3.14 swift_context
3.15 swift_error_result
3.16 swift_indirect_result
3.17 swiftcall
3.18 thread
3.19 tls_model
3.20 uninitialized