Author: Timm Bäder Date: 2024-06-22T18:54:42+02:00 New Revision: 170c194ec19c76deee33d8aa8b288368c574f7a0
URL: https://github.com/llvm/llvm-project/commit/170c194ec19c76deee33d8aa8b288368c574f7a0 DIFF: https://github.com/llvm/llvm-project/commit/170c194ec19c76deee33d8aa8b288368c574f7a0.diff LOG: [clang][Interp] Fix CFStringMakeConstantString etc. evaluation We're ultimately expected to return an APValue simply pointing to the CallExpr, not any useful value. Do that by creating a global variable for the call. Added: Modified: clang/lib/AST/Interp/ByteCodeExprGen.cpp clang/lib/AST/Interp/InterpBuiltin.cpp clang/test/CodeGen/cfstring.c Removed: ################################################################################ diff --git a/clang/lib/AST/Interp/ByteCodeExprGen.cpp b/clang/lib/AST/Interp/ByteCodeExprGen.cpp index edc2ec8e50952..72c569f56a788 100644 --- a/clang/lib/AST/Interp/ByteCodeExprGen.cpp +++ b/clang/lib/AST/Interp/ByteCodeExprGen.cpp @@ -3562,6 +3562,17 @@ bool ByteCodeExprGen<Emitter>::VisitBuiltinCallExpr(const CallExpr *E) { if (!Func) return false; + // For these, we're expected to ultimately return an APValue pointing + // to the CallExpr. This is needed to get the correct codegen. + unsigned Builtin = E->getBuiltinCallee(); + if (Builtin == Builtin::BI__builtin___CFStringMakeConstantString || + Builtin == Builtin::BI__builtin___NSStringMakeConstantString || + Builtin == Builtin::BI__builtin_function_start) { + if (std::optional<unsigned> GlobalOffset = P.createGlobal(E)) + return this->emitGetPtrGlobal(*GlobalOffset, E); + return false; + } + QualType ReturnType = E->getType(); std::optional<PrimType> ReturnT = classify(E); diff --git a/clang/lib/AST/Interp/InterpBuiltin.cpp b/clang/lib/AST/Interp/InterpBuiltin.cpp index 44629fe218b1e..af8841c8b4ef8 100644 --- a/clang/lib/AST/Interp/InterpBuiltin.cpp +++ b/clang/lib/AST/Interp/InterpBuiltin.cpp @@ -1329,8 +1329,6 @@ bool InterpretBuiltin(InterpState &S, CodePtr OpPC, const Function *F, break; case Builtin::BI__builtin_launder: - case Builtin::BI__builtin___CFStringMakeConstantString: - case Builtin::BI__builtin___NSStringMakeConstantString: if (!noopPointer(S, OpPC, Frame, F, Call)) return false; break; diff --git a/clang/test/CodeGen/cfstring.c b/clang/test/CodeGen/cfstring.c index 4a84d00d23bd6..86141868bced1 100644 --- a/clang/test/CodeGen/cfstring.c +++ b/clang/test/CodeGen/cfstring.c @@ -1,6 +1,7 @@ // REQUIRES: x86-registered-target // RUN: %clang_cc1 -triple x86_64-macho -emit-llvm %s -o %t +// RUN: %clang_cc1 -triple x86_64-macho -emit-llvm %s -o %t -fexperimental-new-constant-interpreter // Check that the backing store of CFStrings are constant with the // -fwritable-strings flag. _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits