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:
@@ -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
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}];
|
||||
}
|
||||
|
||||
@@ -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)) {
|
||||
|
||||
6
clang/test/CodeGen/clspv_libclc_builtin.c
Normal file
6
clang/test/CodeGen/clspv_libclc_builtin.c
Normal 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() {}
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user