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
属性可以应用于函数、变量、类或内联命名空间声明,以修改实体修饰过的名称。它能够区分同一实体的不同版本,但是支持不同的ABI版本。例如,一个类的较新版本可以有一组不同的数据成员,因此具有不同的大小。使用abi_tag
属性,可以为类类型的一个全局变量使用不同的修饰过的名称。因此,旧代码可以继续使用旧的修饰过的名称,而新代码将使用带有tags
的新修饰过的名称。
2.5 acquire_capability, acquire_shared_capability
- 支持语法
GNU | C++11 | C2x | __declspec | Keyword | #pragma | #pragma clang attribute |
|
|
将函数标记为获取capability
。
2.6 alloc_align
- 支持语法
GNU | C++11 | C2x | __declspec | Keyword | #pragma | #pragma clang attribute |
|
|
在一个函数声明上使用_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 |
|
| 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 -gcodeview
或clang-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