After significant problems in our downstream with the previous implementation, the SYCL standard has opted to make using macros/etc to change kernel-naming-lambdas in any way UB (even passively). As a result, we are able to just emit the itanium mangling. However, this DOES require a little work in the CXXABI, as the microsoft and itanium mangler use different numbering schemes for lambdas. This patch adds a pair of mangling contexts that use the normal 'itanium' mangling strategy to fill in the "DeviceManglingNumber" used previously by CUDA. Differential Revision: https://reviews.llvm.org/D110281
51 lines
2.1 KiB
C++
51 lines
2.1 KiB
C++
//===- SemaSYCL.cpp - Semantic Analysis for SYCL constructs ---------------===//
|
|
//
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
// This implements Semantic Analysis for SYCL constructs.
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "clang/AST/Mangle.h"
|
|
#include "clang/Sema/Sema.h"
|
|
#include "clang/Sema/SemaDiagnostic.h"
|
|
|
|
using namespace clang;
|
|
|
|
// -----------------------------------------------------------------------------
|
|
// SYCL device specific diagnostics implementation
|
|
// -----------------------------------------------------------------------------
|
|
|
|
Sema::SemaDiagnosticBuilder Sema::SYCLDiagIfDeviceCode(SourceLocation Loc,
|
|
unsigned DiagID) {
|
|
assert(getLangOpts().SYCLIsDevice &&
|
|
"Should only be called during SYCL compilation");
|
|
FunctionDecl *FD = dyn_cast<FunctionDecl>(getCurLexicalContext());
|
|
SemaDiagnosticBuilder::Kind DiagKind = [this, FD] {
|
|
if (!FD)
|
|
return SemaDiagnosticBuilder::K_Nop;
|
|
if (getEmissionStatus(FD) == Sema::FunctionEmissionStatus::Emitted)
|
|
return SemaDiagnosticBuilder::K_ImmediateWithCallStack;
|
|
return SemaDiagnosticBuilder::K_Deferred;
|
|
}();
|
|
return SemaDiagnosticBuilder(DiagKind, Loc, DiagID, FD, *this);
|
|
}
|
|
|
|
bool Sema::checkSYCLDeviceFunction(SourceLocation Loc, FunctionDecl *Callee) {
|
|
assert(getLangOpts().SYCLIsDevice &&
|
|
"Should only be called during SYCL compilation");
|
|
assert(Callee && "Callee may not be null.");
|
|
|
|
// Errors in unevaluated context don't need to be generated,
|
|
// so we can safely skip them.
|
|
if (isUnevaluatedContext() || isConstantEvaluated())
|
|
return true;
|
|
|
|
SemaDiagnosticBuilder::Kind DiagKind = SemaDiagnosticBuilder::K_Nop;
|
|
|
|
return DiagKind != SemaDiagnosticBuilder::K_Immediate &&
|
|
DiagKind != SemaDiagnosticBuilder::K_ImmediateWithCallStack;
|
|
}
|