Author: Timm Bäder Date: 2024-05-21T13:20:42+02:00 New Revision: a7521fd162cac93da37df9151d233692fd61998f
URL: https://github.com/llvm/llvm-project/commit/a7521fd162cac93da37df9151d233692fd61998f DIFF: https://github.com/llvm/llvm-project/commit/a7521fd162cac93da37df9151d233692fd61998f.diff LOG: [clang][Interp] Implement __builtin_sycl_unique_stable_name Added: clang/test/AST/Interp/sycl.cpp Modified: clang/lib/AST/Interp/ByteCodeExprGen.cpp clang/lib/AST/Interp/ByteCodeExprGen.h Removed: ################################################################################ diff --git a/clang/lib/AST/Interp/ByteCodeExprGen.cpp b/clang/lib/AST/Interp/ByteCodeExprGen.cpp index a61270c77ea8f..33d69d04487de 100644 --- a/clang/lib/AST/Interp/ByteCodeExprGen.cpp +++ b/clang/lib/AST/Interp/ByteCodeExprGen.cpp @@ -1594,6 +1594,30 @@ bool ByteCodeExprGen<Emitter>::VisitStringLiteral(const StringLiteral *E) { return true; } +template <class Emitter> +bool ByteCodeExprGen<Emitter>::VisitSYCLUniqueStableNameExpr( + const SYCLUniqueStableNameExpr *E) { + if (DiscardResult) + return true; + + assert(!Initializing); + + auto &A = Ctx.getASTContext(); + std::string ResultStr = E->ComputeName(A); + + QualType CharTy = A.CharTy.withConst(); + APInt Size(A.getTypeSize(A.getSizeType()), ResultStr.size() + 1); + QualType ArrayTy = A.getConstantArrayType(CharTy, Size, nullptr, + ArraySizeModifier::Normal, 0); + + StringLiteral *SL = + StringLiteral::Create(A, ResultStr, StringLiteralKind::Ordinary, + /*Pascal=*/false, ArrayTy, E->getLocation()); + + unsigned StringIndex = P.createGlobalString(SL); + return this->emitGetPtrGlobal(StringIndex, E); +} + template <class Emitter> bool ByteCodeExprGen<Emitter>::VisitCharacterLiteral( const CharacterLiteral *E) { diff --git a/clang/lib/AST/Interp/ByteCodeExprGen.h b/clang/lib/AST/Interp/ByteCodeExprGen.h index e73a2f0334cf6..a2e283c866332 100644 --- a/clang/lib/AST/Interp/ByteCodeExprGen.h +++ b/clang/lib/AST/Interp/ByteCodeExprGen.h @@ -90,6 +90,7 @@ class ByteCodeExprGen : public ConstStmtVisitor<ByteCodeExprGen<Emitter>, bool>, bool VisitOpaqueValueExpr(const OpaqueValueExpr *E); bool VisitAbstractConditionalOperator(const AbstractConditionalOperator *E); bool VisitStringLiteral(const StringLiteral *E); + bool VisitSYCLUniqueStableNameExpr(const SYCLUniqueStableNameExpr *E); bool VisitCharacterLiteral(const CharacterLiteral *E); bool VisitCompoundAssignOperator(const CompoundAssignOperator *E); bool VisitFloatCompoundAssignOperator(const CompoundAssignOperator *E); diff --git a/clang/test/AST/Interp/sycl.cpp b/clang/test/AST/Interp/sycl.cpp new file mode 100644 index 0000000000000..5c922eca58091 --- /dev/null +++ b/clang/test/AST/Interp/sycl.cpp @@ -0,0 +1,9 @@ +// RUN: %clang_cc1 %s -std=c++17 -triple x86_64-linux-gnu -fsycl-is-device -verify=both,ref -fsyntax-only -Wno-unused +// RUN: %clang_cc1 %s -std=c++17 -triple x86_64-linux-gnu -fsycl-is-device -verify=both,expected -fsyntax-only -Wno-unused -fexperimental-new-constant-interpreter + +// both-no-diagnostics + +constexpr int a = 0; +constexpr const char *a_name = __builtin_sycl_unique_stable_name(decltype(a)); +static_assert(__builtin_strcmp(a_name, "_ZTSKi") == 0); + _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits