libclc: remove __attribute__((assume)) for clspv targets (#92126)

Instead add a proper attribute in clang, and add convert it to function
metadata to keep the information in the IR. The goal is to remove the
dependency on __attribute__((assume)) that should have not be there in
the first place.

Ref https://github.com/llvm/llvm-project/pull/84934
This commit is contained in:
Romaric Jodin
2024-05-17 15:13:32 +02:00
committed by GitHub
parent 3a32590f25
commit 932ca85680
7 changed files with 38 additions and 2 deletions

View File

@@ -403,6 +403,10 @@ Attribute Changes in Clang
- Clang now warns that the ``exclude_from_explicit_instantiation`` attribute
is ignored when applied to a local class or a member thereof.
- The ``clspv_libclc_builtin`` attribute has been added to allow clspv
(`OpenCL-C to Vulkan SPIR-V compiler <https://github.com/google/clspv>`_) to identify functions coming from libclc
(`OpenCL-C builtin library <https://libclc.llvm.org>`_).
Improvements to Clang's diagnostics
-----------------------------------
- Clang now applies syntax highlighting to the code snippets it

View File

@@ -4561,3 +4561,10 @@ def CodeAlign: StmtAttr {
static constexpr int MaximumAlignment = 4096;
}];
}
def ClspvLibclcBuiltin: InheritableAttr {
let Spellings = [Clang<"clspv_libclc_builtin">];
let Subjects = SubjectList<[Function]>;
let Documentation = [ClspvLibclcBuiltinDoc];
let SimpleHandler = 1;
}

View File

@@ -8087,3 +8087,17 @@ requirement:
}
}];
}
def ClspvLibclcBuiltinDoc : Documentation {
let Category = DocCatFunction;
let Content = [{
Attribute used by `clspv`_ (OpenCL-C to Vulkan SPIR-V compiler) to identify functions coming from `libclc`_ (OpenCL-C builtin library).
.. code-block:: c
void __attribute__((clspv_libclc_builtin)) libclc_builtin() {}
.. _`clspv`: https://github.com/google/clspv
.. _`libclc`: https://libclc.llvm.org
}];
}

View File

@@ -985,6 +985,11 @@ void CodeGenFunction::StartFunction(GlobalDecl GD, QualType RetTy,
EmitKernelMetadata(FD, Fn);
}
if (FD && FD->hasAttr<ClspvLibclcBuiltinAttr>()) {
Fn->setMetadata("clspv_libclc_builtin",
llvm::MDNode::get(getLLVMContext(), {}));
}
// If we are checking function types, emit a function type signature as
// prologue data.
if (FD && SanOpts.has(SanitizerKind::Function)) {

View File

@@ -0,0 +1,6 @@
// RUN: %clang_cc1 -triple spir -emit-llvm %s -o - | FileCheck %s
// CHECK: @foo()
// CHECK-SAME: !clspv_libclc_builtin
void __attribute__((clspv_libclc_builtin)) foo() {}

View File

@@ -48,6 +48,7 @@
// CHECK-NEXT: Capability (SubjectMatchRule_record, SubjectMatchRule_type_alias)
// CHECK-NEXT: CarriesDependency (SubjectMatchRule_variable_is_parameter, SubjectMatchRule_objc_method, SubjectMatchRule_function)
// CHECK-NEXT: Cleanup (SubjectMatchRule_variable_is_local)
// CHECK-NEXT: ClspvLibclcBuiltin (SubjectMatchRule_function)
// CHECK-NEXT: CmseNSEntry (SubjectMatchRule_function)
// CHECK-NEXT: Cold (SubjectMatchRule_function)
// CHECK-NEXT: Common (SubjectMatchRule_variable)

View File

@@ -7,8 +7,7 @@
#if defined(CLC_SPIRV) || defined(CLC_SPIRV64)
#define _CLC_DEF
#elif defined(CLC_CLSPV) || defined(CLC_CLSPV64)
#define _CLC_DEF \
__attribute__((noinline)) __attribute__((assume("clspv_libclc_builtin")))
#define _CLC_DEF __attribute__((noinline)) __attribute__((clspv_libclc_builtin))
#else
#define _CLC_DEF __attribute__((always_inline))
#endif