Skip to content

Commit c285aa9

Browse files
authored
generate and use an extension dictionary (#1131)
* generate and use an extension dictionary * change cl_khr_kernel_clock to use asciidoctor attributes
1 parent 75df78c commit c285aa9

90 files changed

Lines changed: 909 additions & 804 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

OpenCL_C.txt

Lines changed: 166 additions & 166 deletions
Large diffs are not rendered by default.

api/appendix_c.asciidoc

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -389,54 +389,54 @@ include::{generated}/api/version-notes/CL_FLT_EPSILON.asciidoc[]
389389
| {CL_DBL_DIG_anchor}
390390

391391
include::{generated}/api/version-notes/CL_DBL_DIG.asciidoc[]
392-
Also see `<<cl_khr_fp64>>`.
392+
Also see {cl_khr_fp64_EXT}.
393393
| Number of decimal digits of precision for the type {cl_double_TYPE}
394394
| {CL_DBL_MANT_DIG_anchor}
395395

396396
include::{generated}/api/version-notes/CL_DBL_MANT_DIG.asciidoc[]
397-
Also see `<<cl_khr_fp64>>`.
397+
Also see {cl_khr_fp64_EXT}.
398398
| Number of digits in the mantissa of type {cl_double_TYPE}
399399
| {CL_DBL_MAX_10_EXP_anchor}
400400

401401
include::{generated}/api/version-notes/CL_DBL_MAX_10_EXP.asciidoc[]
402-
Also see `<<cl_khr_fp64>>`.
402+
Also see {cl_khr_fp64_EXT}.
403403
| Maximum positive integer such that 10 raised to this power minus one can
404404
be represented as a normalized floating-point number of type {cl_double_TYPE}
405405
| {CL_DBL_MAX_EXP_anchor}
406406

407407
include::{generated}/api/version-notes/CL_DBL_MAX_EXP.asciidoc[]
408-
Also see `<<cl_khr_fp64>>`.
408+
Also see {cl_khr_fp64_EXT}.
409409
| Maximum exponent value of type {cl_double_TYPE}
410410
| {CL_DBL_MIN_10_EXP_anchor}
411411

412412
include::{generated}/api/version-notes/CL_DBL_MIN_10_EXP.asciidoc[]
413-
Also see `<<cl_khr_fp64>>`.
413+
Also see {cl_khr_fp64_EXT}.
414414
| Minimum negative integer such that 10 raised to this power minus one can
415415
be represented as a normalized floating-point number of type {cl_double_TYPE}
416416
| {CL_DBL_MIN_EXP_anchor}
417417

418418
include::{generated}/api/version-notes/CL_DBL_MIN_EXP.asciidoc[]
419-
Also see `<<cl_khr_fp64>>`.
419+
Also see {cl_khr_fp64_EXT}.
420420
| Minimum exponent value of type {cl_double_TYPE}
421421
| {CL_DBL_RADIX_anchor}
422422

423423
include::{generated}/api/version-notes/CL_DBL_RADIX.asciidoc[]
424-
Also see `<<cl_khr_fp64>>`.
424+
Also see {cl_khr_fp64_EXT}.
425425
| Base value of type {cl_double_TYPE}
426426
| {CL_DBL_MAX_anchor}
427427

428428
include::{generated}/api/version-notes/CL_DBL_MAX.asciidoc[]
429-
Also see `<<cl_khr_fp64>>`.
429+
Also see {cl_khr_fp64_EXT}.
430430
| Maximum value of type {cl_double_TYPE}
431431
| {CL_DBL_MIN_anchor}
432432

433433
include::{generated}/api/version-notes/CL_DBL_MIN.asciidoc[]
434-
Also see `<<cl_khr_fp64>>`.
434+
Also see {cl_khr_fp64_EXT}.
435435
| Minimum value of type {cl_double_TYPE}
436436
| {CL_DBL_EPSILON_anchor}
437437

438438
include::{generated}/api/version-notes/CL_DBL_EPSILON.asciidoc[]
439-
Also see `<<cl_khr_fp64>>`.
439+
Also see {cl_khr_fp64_EXT}.
440440
| Minimum positive floating-point number of type {cl_double_TYPE} such that
441441
`1.0 {plus} {CL_DBL_EPSILON} != 1` is true.
442442
| {CL_NAN_anchor}

api/appendix_e.asciidoc

Lines changed: 59 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -74,11 +74,11 @@ The following features are added to the OpenCL C programming language
7474
_section 6.12.3_.
7575
** *async_work_group_strided_copy* defined in section _6.15.11_.
7676
** *vec_step*, *shuffle* and *shuffle2* defined in section _6.15.13_.
77-
* `<<cl_khr_byte_addressable_store>>` extension is a core feature.
78-
* `<<cl_khr_global_int32_base_atomics>>`,
79-
`<<cl_khr_global_int32_extended_atomics>>`,
80-
`<<cl_khr_local_int32_base_atomics>>` and
81-
`<<cl_khr_local_int32_extended_atomics>>` extensions are core features.
77+
* {cl_khr_byte_addressable_store_EXT} extension is a core feature.
78+
* {cl_khr_global_int32_base_atomics_EXT},
79+
{cl_khr_global_int32_extended_atomics_EXT},
80+
{cl_khr_local_int32_base_atomics_EXT} and
81+
{cl_khr_local_int32_extended_atomics_EXT} extensions are core features.
8282
The built-in atomic function names are changed to use the *atomic_*
8383
prefix instead of *atom_*.
8484
* Macros `CL_VERSION_1_0` and `CL_VERSION_1_1`.
@@ -97,13 +97,13 @@ The following features in OpenCL 1.0 are deprecated (see glossary) in OpenCL
9797
* The `-cl-strict-aliasing` build option has been deprecated.
9898
It is no longer required after defining type-based aliasing rules.
9999
// Bugzilla 5593 and 6068
100-
* The `<<cl_khr_select_fprounding_mode>>` extension is deprecated and its
100+
* The {cl_khr_select_fprounding_mode_EXT} extension is deprecated and its
101101
use is no longer recommended.
102102

103103
The following new extensions are added to _section 9_ in OpenCL 1.1:
104104

105-
* `<<cl_khr_gl_event>>` for creating a CL event object from a GL sync object.
106-
* `<<cl_khr_d3d10_sharing>>` for sharing memory objects with Direct3D 10.
105+
* {cl_khr_gl_event_EXT} for creating a CL event object from a GL sync object.
106+
* {cl_khr_d3d10_sharing_EXT} for sharing memory objects with Direct3D 10.
107107

108108
The following modifications are made to the OpenCL ES Profile described in
109109
_section 10_ in OpenCL 1.1:
@@ -146,7 +146,7 @@ runtime (_sections 4 and 5_):
146146
a kernel.
147147
* {clEnqueueMarkerWithWaitList} and {clEnqueueBarrierWithWaitList} APIs.
148148
* {clUnloadPlatformCompiler} to request that a single platform's compiler is
149-
unloaded. This is compatible with the `<<cl_khr_icd>>` extension if that is
149+
unloaded. This is compatible with the {cl_khr_icd_EXT} extension if that is
150150
supported, unlike {clUnloadCompiler}.
151151

152152
The following features are added to the OpenCL C programming language
@@ -183,7 +183,7 @@ The following APIs in OpenCL 1.1 are deprecated (see glossary) in OpenCL
183183
// Bugzilla 5391 - cl_khr_icd specification
184184
* {clUnloadCompiler} and {clGetExtensionFunctionAddress} APIs are deprecated.
185185
The {clUnloadPlatformCompiler} and {clGetExtensionFunctionAddressForPlatform}
186-
APIs provide equivalent functionality are compatible with the `<<cl_khr_icd>>`
186+
APIs provide equivalent functionality are compatible with the {cl_khr_icd_EXT}
187187
extension.
188188

189189
The following queries are deprecated (see glossary) in OpenCL 1.2:
@@ -465,14 +465,14 @@ Changes from *v3.0.5*:
465465

466466
* Fixed the calculation in "mapping work-items onto an ND-range".
467467
* Added new extensions:
468-
** `<<cl_khr_extended_versioning>>`
469-
** `<<cl_khr_subgroup_extended_types>>`
470-
** `<<cl_khr_subgroup_non_uniform_vote>>`
471-
** `<<cl_khr_subgroup_ballot>>`
472-
** `<<cl_khr_subgroup_non_uniform_arithmetic>>`
473-
** `<<cl_khr_subgroup_shuffle>>`
474-
** `<<cl_khr_subgroup_shuffle_relative>>`
475-
** `<<cl_khr_subgroup_clustered_reduce>>`
468+
** {cl_khr_extended_versioning_EXT}
469+
** {cl_khr_subgroup_extended_types_EXT}
470+
** {cl_khr_subgroup_non_uniform_vote_EXT}
471+
** {cl_khr_subgroup_ballot_EXT}
472+
** {cl_khr_subgroup_non_uniform_arithmetic_EXT}
473+
** {cl_khr_subgroup_shuffle_EXT}
474+
** {cl_khr_subgroup_shuffle_relative_EXT}
475+
** {cl_khr_subgroup_clustered_reduce_EXT}
476476

477477
Changes from *v3.0.6*:
478478

@@ -481,38 +481,38 @@ Changes from *v3.0.6*:
481481
* Clarified the table structure in the backwards compatibility appendix.
482482
* Clarified that `-cl-unsafe-math-optimizations` also implies `-cl-denorms-are-zero`.
483483
* Added new extensions:
484-
** `<<cl_khr_extended_bit_ops>>`
485-
** `<<cl_khr_pci_bus_info>>`
486-
** `<<cl_khr_spirv_extended_debug_info>>`
487-
** `<<cl_khr_spirv_linkonce_odr>>`
488-
** `<<cl_khr_suggested_local_work_size>>`
484+
** {cl_khr_extended_bit_ops_EXT}
485+
** {cl_khr_pci_bus_info_EXT}
486+
** {cl_khr_spirv_extended_debug_info_EXT}
487+
** {cl_khr_spirv_linkonce_odr_EXT}
488+
** {cl_khr_suggested_local_work_size_EXT}
489489

490490
Changes from *v3.0.7*:
491491

492492
* Clarified optionality support for double-precision literals.
493493
* Removed unnecessary phrase from sub-group mask function descriptions.
494494
* Added _input_slice_pitch_ error condition for read and write image APIs.
495495
* Added new extension:
496-
** `<<cl_khr_integer_dot_product>>`
496+
** {cl_khr_integer_dot_product_EXT}
497497

498498
Changes from *v3.0.8*:
499499

500500
* Added a missing error condition for {clGetKernelSuggestedLocalWorkSizeKHR}.
501501
* Clarified requirements for {CL_DEVICE_DOUBLE_FP_CONFIG} prior to OpenCL 2.0.
502502
* Clarified the behavior of ballot operations for remainder sub-groups.
503503
* Added new extensions:
504-
** `<<cl_khr_integer_dot_product>>` (version 2)
505-
** `<<cl_khr_semaphore>>` (provisional)
506-
** `<<cl_khr_external_semaphore>>` (provisional)
507-
** `<<cl_khr_external_semaphore_dx_fence>>` (provisional)
508-
** `<<cl_khr_external_semaphore_opaque_fd>>` (provisional)
509-
** `<<cl_khr_external_semaphore_sync_fd>>` (provisional)
510-
** `<<cl_khr_external_semaphore_win32>>` (provisional)
511-
** `<<cl_khr_external_memory>>` (provisional)
512-
** `<<cl_khr_external_memory_dma_buf>>` (provisional)
513-
** `<<cl_khr_external_memory_dx>>` (provisional)
514-
** `<<cl_khr_external_memory_opaque_fd>>` (provisional)
515-
** `<<cl_khr_external_memory_win32>>` (provisional)
504+
** {cl_khr_integer_dot_product_EXT} (version 2)
505+
** {cl_khr_semaphore_EXT} (provisional)
506+
** {cl_khr_external_semaphore_EXT} (provisional)
507+
** {cl_khr_external_semaphore_dx_fence_EXT} (provisional)
508+
** {cl_khr_external_semaphore_opaque_fd_EXT} (provisional)
509+
** {cl_khr_external_semaphore_sync_fd_EXT} (provisional)
510+
** {cl_khr_external_semaphore_win32_EXT} (provisional)
511+
** {cl_khr_external_memory_EXT} (provisional)
512+
** {cl_khr_external_memory_dma_buf_EXT} (provisional)
513+
** {cl_khr_external_memory_dx_EXT} (provisional)
514+
** {cl_khr_external_memory_opaque_fd_EXT} (provisional)
515+
** {cl_khr_external_memory_win32_EXT} (provisional)
516516

517517
Changes from *v3.0.9*:
518518

@@ -521,10 +521,10 @@ Changes from *v3.0.9*:
521521
* Clarified that {clCompileProgram} is valid for programs created from SPIR.
522522
* Documented the possible state of a kernel object after a failed call to {clSetKernelArg}.
523523
* Added new extensions:
524-
** `<<cl_khr_async_work_group_copy_fence>>` (final)
525-
** `<<cl_khr_extended_async_copies>>` (final)
526-
** `<<cl_khr_expect_assume>>`
527-
** `<<cl_khr_command_buffer>>` (provisional)
524+
** {cl_khr_async_work_group_copy_fence_EXT} (final)
525+
** {cl_khr_extended_async_copies_EXT} (final)
526+
** {cl_khr_expect_assume_EXT}
527+
** {cl_khr_command_buffer_EXT} (provisional)
528528

529529
Changes from *v3.0.10*:
530530

@@ -537,38 +537,38 @@ Changes from *v3.0.10*:
537537
* Clarified that the extended versioning extension is a core OpenCL 3.0 feature.
538538
* Clarified sub-group clustered reduction behavior when the cluster size is not an integer constant or a power of two.
539539
* Added new extensions:
540-
** `<<cl_khr_subgroup_rotate>>`
541-
** `<<cl_khr_work_group_uniform_arithmetic>>`
540+
** {cl_khr_subgroup_rotate_EXT}
541+
** {cl_khr_work_group_uniform_arithmetic_EXT}
542542

543543
Changes from *v3.0.11*:
544544

545545
* Added a definition for a valid object and requirements for testing for valid objects.
546546
* Added a maximum limit for the number of arguments supported by a kernel.
547547
* Clarified requirements for comparability and uniqueness of object handles.
548548
* Clarified behavior for invalid device-side enqueue `clk_event_t` handles.
549-
* Clarified `<<cl_khr_command_buffer>>` interactions with other extensions.
549+
* Clarified {cl_khr_command_buffer_EXT} interactions with other extensions.
550550
* Specified error behavior when a command buffer is finalized multiple times.
551551
* Added new extension:
552-
** `<<cl_khr_command_buffer_mutable_dispatch>>` (provisional)
552+
** {cl_khr_command_buffer_mutable_dispatch_EXT} (provisional)
553553

554554
Changes from *v3.0.12*:
555555

556556
* Fixed the accuracy requirements description for half-precision math functions (those prefixed by `half_`).
557557
* Clarified that the semaphore type must always be provided when creating a semaphore.
558558
* Removed an unnecessary and contradictory error condition when creating a semaphore.
559-
* Added an issue regarding non-linear image import to the `<<cl_khr_external_memory>>` extension.
560-
* Added missing calls to {clBuildProgram} to the `<<cl_khr_command_buffer>>` and `<<cl_khr_command_buffer_mutable_dispatch>>` sample code.
559+
* Added an issue regarding non-linear image import to the {cl_khr_external_memory_EXT} extension.
560+
* Added missing calls to {clBuildProgram} to the {cl_khr_command_buffer_EXT} and {cl_khr_command_buffer_mutable_dispatch_EXT} sample code.
561561
* Fixed a copy-paste error in the extensions quick reference appendix.
562562
* Fixed typos and improved formatting consistency in the extensions spec.
563563

564564
Changes from *v3.0.13*:
565565

566-
* Corrected the precision for `cross` and `dot` to be based on `HALF_EPSILON` in `<<cl_khr_fp16>>`, see {khronos-opencl-pr}/893[#893].
567-
* Added a context query for command-buffers to `<<cl_khr_command_buffer>>`, see {khronos-opencl-pr}/899[#899].
568-
* Updated the semaphore wait and signal rules for binary semaphores in `<<cl_khr_semaphore>>`, see {khronos-opencl-pr}/882[#882].
569-
* Removed redundant error conditions from `<<cl_khr_external_semaphore>>` and `<<cl_khr_external_memory>>`, see {khronos-opencl-pr}/903[#903] and {khronos-opencl-pr}/904[#904].
566+
* Corrected the precision for `cross` and `dot` to be based on `HALF_EPSILON` in {cl_khr_fp16_EXT}, see {khronos-opencl-pr}/893[#893].
567+
* Added a context query for command-buffers to {cl_khr_command_buffer_EXT}, see {khronos-opencl-pr}/899[#899].
568+
* Updated the semaphore wait and signal rules for binary semaphores in {cl_khr_semaphore_EXT}, see {khronos-opencl-pr}/882[#882].
569+
* Removed redundant error conditions from {cl_khr_external_semaphore_EXT} and {cl_khr_external_memory_EXT}, see {khronos-opencl-pr}/903[#903] and {khronos-opencl-pr}/904[#904].
570570
* Added new extension:
571-
** `<<cl_khr_command_buffer_multi_device>>` (provisional)
571+
** {cl_khr_command_buffer_multi_device_EXT} (provisional)
572572

573573
Changes from *v3.0.14*:
574574

@@ -578,28 +578,28 @@ Changes from *v3.0.14*:
578578
* Clarified that {clSetCommandQueueProperty} is only required for OpenCL 1.0 devices and may return an error otherwise, see {khronos-opencl-pr}/980[#980].
579579
* Clarified that the application must ensure the free function passed to {clEnqueueSVMFree} is thread safe, see {khronos-opencl-pr}/1016[#1016].
580580
* Clarified that the application must ensure the user function passed to {clEnqueueNativeKernel} is thread safe, see {khronos-opencl-pr}/1026[#1026].
581-
* `<<cl_khr_command_buffer>>` (provisional):
581+
* {cl_khr_command_buffer_EXT} (provisional):
582582
** Removed the "invalid" command buffer state, see {khronos-opencl-pr}/885[#885].
583583
** Added support for recording SVM memory copies and memory fills in a command buffer, see {khronos-opencl-pr}/915[#915].
584-
* `<<cl_khr_command_buffer_multi_device>>` (provisional):
584+
* {cl_khr_command_buffer_multi_device_EXT} (provisional):
585585
** Clarified that the sync devices query should only return root devices, see {khronos-opencl-pr}/925[#925].
586-
* `<<cl_khr_external_memory>>` (provisional):
586+
* {cl_khr_external_memory_EXT} (provisional):
587587
** Disallowed specifying a device handle list without also specifying an external memory handle, see {khronos-opencl-pr}/922[#922].
588588
** Added a query to determine the handle types an implementation will assume have a linear memory layout, see {khronos-opencl-pr}/940[#940].
589589
** Added an external memory-specific device handle list enum, see {khronos-opencl-pr}/956[#956].
590590
** Clarified that implementations may acquire information about an image from an external memory handle when the image is created, see {khronos-opencl-pr}/970[#970].
591-
* `<<cl_khr_external_semaphore>>` (provisional):
591+
* {cl_khr_external_semaphore_EXT} (provisional):
592592
** Added the ability to re-import "sync fd" handles into an existing semaphore, see {khronos-opencl-pr}/939[#939].
593593
** Clarified that a semaphore may only export one handle type, and that a semaphore created from an external handle cannot also export a handle, see {khronos-opencl-pr}/975[#975].
594-
** Clarified that `<<cl_khr_external_semaphore>>` requires support for `<<cl_khr_semaphore>>`, see {khronos-opencl-pr}/976[#976].
594+
** Clarified that {cl_khr_external_semaphore_EXT} requires support for {cl_khr_semaphore_EXT}, see {khronos-opencl-pr}/976[#976].
595595
** Added a query to determine if a semaphore may export an external handle, see {khronos-opencl-pr}/997[#997].
596-
* `<<cl_khr_semaphore>>` (provisional):
596+
* {cl_khr_semaphore_EXT} (provisional):
597597
** Added an semaphore-specific device handle list enum, see {khronos-opencl-pr}/956[#956].
598598
** Restricted semaphores to a single associated device, see {khronos-opencl-pr}/996[#996].
599-
* `<<cl_khr_subgroup_rotate>>`:
599+
* {cl_khr_subgroup_rotate_EXT}:
600600
** Clarified that only rotating within a subgroup is supported, see {khronos-opencl-pr}/967[#967].
601601

602602
Changes from *v3.0.15*:
603603

604604
* Added new extensions:
605-
** `<<cl_khr_kernel_clock>>` (provisional)
605+
** {cl_khr_kernel_clock_EXT} (provisional)

api/appendix_h.asciidoc

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -313,7 +313,7 @@ When creating a 2D image from a buffer is not supported:
313313

314314
| {clGetDeviceInfo}, passing +
315315
{CL_DEVICE_EXTENSIONS}
316-
| Will not describe support for the `<<cl_khr_image2d_from_buffer>>` extension if _device_ does not support creating a 2D image from a buffer.
316+
| Will not describe support for the {cl_khr_image2d_from_buffer_EXT} extension if _device_ does not support creating a 2D image from a buffer.
317317

318318
| {clCreateImage} or +
319319
{clCreateImageWithProperties}, passing +
@@ -424,7 +424,7 @@ When sub-groups are not supported:
424424

425425
| {clGetDeviceInfo}, passing +
426426
{CL_DEVICE_EXTENSIONS}
427-
| Will not describe support for the `<<cl_khr_subgroups>>` extension if _device_ does not support sub-groups.
427+
| Will not describe support for the {cl_khr_subgroups_EXT} extension if _device_ does not support sub-groups.
428428

429429
| {clGetKernelSubGroupInfo}
430430
| Returns {CL_INVALID_OPERATION} if _device_ does not support sub-groups.
@@ -468,7 +468,7 @@ When writing to 3D image objects is not supported:
468468

469469
| {clGetDeviceInfo}, passing +
470470
{CL_DEVICE_EXTENSIONS}
471-
| Will not describe support for the `<<cl_khr_3d_image_writes>>` extension if _device_ does not support writing to 3D image objects.
471+
| Will not describe support for the {cl_khr_3d_image_writes_EXT} extension if _device_ does not support writing to 3D image objects.
472472

473473
| {clGetSupportedImageFormats}, passing +
474474
{CL_MEM_OBJECT_IMAGE3D} and one of +

api/cl_khr_3d_image_writes.asciidoc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ include::{generated}/meta/{refprefix}cl_khr_3d_image_writes.txt[]
1414

1515
=== Description
1616

17-
`cl_khr_3d_image_writes` adds built-in OpenCL C functions that allow a
17+
{cl_khr_3d_image_writes_EXT} adds built-in OpenCL C functions that allow a
1818
kernel to write to 3D image objects in addition to 2D image objects.
1919

2020
See the link:{OpenCLCSpecURL}#cl_khr_3d_image_writes[3D Image Writes]

api/cl_khr_async_work_group_copy_fence.asciidoc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ include::{generated}/meta/{refprefix}cl_khr_async_work_group_copy_fence.txt[]
1414

1515
=== Description
1616

17-
`cl_khr_async_work_group_copy_fence` adds a new built-in OpenCL C function
17+
{cl_khr_async_work_group_copy_fence_EXT} adds a new built-in OpenCL C function
1818
to establish a memory synchronization ordering of asynchronous copies.
1919

2020
See the link:{OpenCLCSpecURL}#cl_khr_async_work_group_copy_fence[Async

api/cl_khr_byte_addressable_store.asciidoc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ include::{generated}/meta/{refprefix}cl_khr_byte_addressable_store.txt[]
1616

1717
=== Description
1818

19-
`cl_khr_byte_addressable_store` relaxes restrictions on pointers to `char`,
19+
{cl_khr_byte_addressable_store_EXT} relaxes restrictions on pointers to `char`,
2020
`uchar`, `char2`, `uchar2`, `short`, `ushort` and `half` that were present
2121
in _Section 6.8m: Restrictions_ of the OpenCL 1.0 specification.
2222
With this extension, applications are able to read from and write to

0 commit comments

Comments
 (0)