https://github.com/makslevental updated https://github.com/llvm/llvm-project/pull/69072
>From d7c57d94d7e75ed1e0df87ebf3c4464e7b951453 Mon Sep 17 00:00:00 2001 From: max <maksim.leven...@gmail.com> Date: Sat, 14 Oct 2023 12:46:42 -0500 Subject: [PATCH 1/3] [clang][repl] fix `new` --- clang/lib/Interpreter/Interpreter.cpp | 2 +- clang/test/Interpreter/execute.cpp | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/clang/lib/Interpreter/Interpreter.cpp b/clang/lib/Interpreter/Interpreter.cpp index 7968c62cbd3e7b3..ddfbc9ac01c6743 100644 --- a/clang/lib/Interpreter/Interpreter.cpp +++ b/clang/lib/Interpreter/Interpreter.cpp @@ -248,7 +248,7 @@ Interpreter::~Interpreter() { // can't find the precise resource directory in unittests so we have to hard // code them. const char *const Runtimes = R"( - void* operator new(__SIZE_TYPE__, void* __p) noexcept; + #include <new> void *__clang_Interpreter_SetValueWithAlloc(void*, void*, void*); void __clang_Interpreter_SetValueNoAlloc(void*, void*, void*); void __clang_Interpreter_SetValueNoAlloc(void*, void*, void*, void*); diff --git a/clang/test/Interpreter/execute.cpp b/clang/test/Interpreter/execute.cpp index 6e73ed3927e8155..d54ab99749c1bac 100644 --- a/clang/test/Interpreter/execute.cpp +++ b/clang/test/Interpreter/execute.cpp @@ -20,4 +20,6 @@ auto r2 = printf("S[f=%f, m=0x%llx]\n", s.f, reinterpret_cast<unsigned long long inline int foo() { return 42; } int r3 = foo(); +#include <memory> + %quit >From b3c62d0d295129ad94f94fc641e789038c78f03a Mon Sep 17 00:00:00 2001 From: Maksim Levental <maksim.leven...@gmail.com> Date: Sat, 14 Oct 2023 19:26:04 -0500 Subject: [PATCH 2/3] Update clang/lib/Interpreter/Interpreter.cpp Remove include new Co-authored-by: Vassil Vassilev <v.g.vassi...@gmail.com> --- clang/lib/Interpreter/Interpreter.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/clang/lib/Interpreter/Interpreter.cpp b/clang/lib/Interpreter/Interpreter.cpp index ddfbc9ac01c6743..30348e1c03f8c76 100644 --- a/clang/lib/Interpreter/Interpreter.cpp +++ b/clang/lib/Interpreter/Interpreter.cpp @@ -248,7 +248,6 @@ Interpreter::~Interpreter() { // can't find the precise resource directory in unittests so we have to hard // code them. const char *const Runtimes = R"( - #include <new> void *__clang_Interpreter_SetValueWithAlloc(void*, void*, void*); void __clang_Interpreter_SetValueNoAlloc(void*, void*, void*); void __clang_Interpreter_SetValueNoAlloc(void*, void*, void*, void*); >From 9a071b39c2b31aa9bb1c2dfdd5de139666a06c1d Mon Sep 17 00:00:00 2001 From: max <maksim.leven...@gmail.com> Date: Sat, 14 Oct 2023 23:44:01 -0500 Subject: [PATCH 3/3] branch on isdarwin --- clang/lib/Interpreter/Interpreter.cpp | 28 +------------------ clang/test/Interpreter/ClangReplPrologue.h | 26 +++++++++++++++++ clang/test/Interpreter/code-undo.cpp | 5 +++- clang/test/Interpreter/const.cpp | 6 ++-- .../Interpreter/disambiguate-decl-stmt.cpp | 6 ++-- clang/test/Interpreter/dynamic-library.cpp | 4 ++- clang/test/Interpreter/execute-stmts.cpp | 5 ++-- clang/test/Interpreter/execute-weak.cpp | 4 ++- clang/test/Interpreter/execute.cpp | 7 +++-- clang/test/Interpreter/fail.cpp | 5 +++- clang/test/Interpreter/global-dtor.cpp | 4 ++- clang/test/Interpreter/inline-virtual.cpp | 6 ++-- clang/test/Interpreter/lambda.cpp | 7 +++-- clang/test/Interpreter/multiline.cpp | 4 ++- clang/test/Interpreter/plugins.cpp | 4 ++- clang/test/Interpreter/simple-exception.cpp | 4 ++- clang/test/Interpreter/stmt-serialization.cpp | 4 ++- 17 files changed, 81 insertions(+), 48 deletions(-) create mode 100644 clang/test/Interpreter/ClangReplPrologue.h diff --git a/clang/lib/Interpreter/Interpreter.cpp b/clang/lib/Interpreter/Interpreter.cpp index 30348e1c03f8c76..a249a12b3a1aaf9 100644 --- a/clang/lib/Interpreter/Interpreter.cpp +++ b/clang/lib/Interpreter/Interpreter.cpp @@ -244,28 +244,6 @@ Interpreter::~Interpreter() { } } -// These better to put in a runtime header but we can't. This is because we -// can't find the precise resource directory in unittests so we have to hard -// code them. -const char *const Runtimes = R"( - void *__clang_Interpreter_SetValueWithAlloc(void*, void*, void*); - void __clang_Interpreter_SetValueNoAlloc(void*, void*, void*); - void __clang_Interpreter_SetValueNoAlloc(void*, void*, void*, void*); - void __clang_Interpreter_SetValueNoAlloc(void*, void*, void*, float); - void __clang_Interpreter_SetValueNoAlloc(void*, void*, void*, double); - void __clang_Interpreter_SetValueNoAlloc(void*, void*, void*, long double); - void __clang_Interpreter_SetValueNoAlloc(void*,void*,void*,unsigned long long); - template <class T, class = T (*)() /*disable for arrays*/> - void __clang_Interpreter_SetValueCopyArr(T* Src, void* Placement, unsigned long Size) { - for (auto Idx = 0; Idx < Size; ++Idx) - new ((void*)(((T*)Placement) + Idx)) T(Src[Idx]); - } - template <class T, unsigned long N> - void __clang_Interpreter_SetValueCopyArr(const T (*Src)[N], void* Placement, unsigned long Size) { - __clang_Interpreter_SetValueCopyArr(Src[0], Placement, Size); - } -)"; - llvm::Expected<std::unique_ptr<Interpreter>> Interpreter::create(std::unique_ptr<CompilerInstance> CI) { llvm::Error Err = llvm::Error::success(); @@ -274,10 +252,6 @@ Interpreter::create(std::unique_ptr<CompilerInstance> CI) { if (Err) return std::move(Err); - auto PTU = Interp->Parse(Runtimes); - if (!PTU) - return PTU.takeError(); - Interp->ValuePrintingInfo.resize(3); // FIXME: This is a ugly hack. Undo command checks its availability by looking // at the size of the PTU list. However we have parsed something in the @@ -351,7 +325,7 @@ Interpreter::Parse(llvm::StringRef Code) { return std::move(E); } - // Tell the interpreter sliently ignore unused expressions since value + // Tell the interpreter silently ignore unused expressions since value // printing could cause it. getCompilerInstance()->getDiagnostics().setSeverity( clang::diag::warn_unused_expr, diag::Severity::Ignored, SourceLocation()); diff --git a/clang/test/Interpreter/ClangReplPrologue.h b/clang/test/Interpreter/ClangReplPrologue.h new file mode 100644 index 000000000000000..4ae820cd35e7da8 --- /dev/null +++ b/clang/test/Interpreter/ClangReplPrologue.h @@ -0,0 +1,26 @@ +// +// Created by maksim on 10/19/23. +// + +#ifndef LLVM_CLANGREPLPROLOGUE_H +#define LLVM_CLANGREPLPROLOGUE_H + +void* operator new(__SIZE_TYPE__, void* __p) noexcept; +void *__clang_Interpreter_SetValueWithAlloc(void*, void*, void*); +void __clang_Interpreter_SetValueNoAlloc(void*, void*, void*); +void __clang_Interpreter_SetValueNoAlloc(void*, void*, void*, void*); +void __clang_Interpreter_SetValueNoAlloc(void*, void*, void*, float); +void __clang_Interpreter_SetValueNoAlloc(void*, void*, void*, double); +void __clang_Interpreter_SetValueNoAlloc(void*, void*, void*, long double); +void __clang_Interpreter_SetValueNoAlloc(void*,void*,void*,unsigned long long); +template <class T, class = T (*)() /*disable for arrays*/> +void __clang_Interpreter_SetValueCopyArr(T* Src, void* Placement, unsigned long Size) { + for (auto Idx = 0; Idx < Size; ++Idx) + new ((void*)(((T*)Placement) + Idx)) T(Src[Idx]); +} +template <class T, unsigned long N> +void __clang_Interpreter_SetValueCopyArr(const T (*Src)[N], void* Placement, unsigned long Size) { + __clang_Interpreter_SetValueCopyArr(Src[0], Placement, Size); +} + +#endif //LLVM_CLANGREPLPROLOGUE_H diff --git a/clang/test/Interpreter/code-undo.cpp b/clang/test/Interpreter/code-undo.cpp index 83ade0ec9158ba3..6aa9c7fd104a5ed 100644 --- a/clang/test/Interpreter/code-undo.cpp +++ b/clang/test/Interpreter/code-undo.cpp @@ -1,5 +1,8 @@ // UNSUPPORTED: system-aix -// RUN: cat %s | clang-repl | FileCheck %s +// RUN: cat %s | clang-repl -Xcc -I %S | FileCheck %s + +#include "ClangReplPrologue.h" + extern "C" int printf(const char *, ...); int x1 = 0; int x2 = 42; diff --git a/clang/test/Interpreter/const.cpp b/clang/test/Interpreter/const.cpp index 4b6ce65e3643e64..91db774a4492da8 100644 --- a/clang/test/Interpreter/const.cpp +++ b/clang/test/Interpreter/const.cpp @@ -2,8 +2,10 @@ // see https://github.com/llvm/llvm-project/issues/68092 // XFAIL: system-windows -// RUN: cat %s | clang-repl | FileCheck %s -// RUN: cat %s | clang-repl -Xcc -O2 | FileCheck %s +// RUN: cat %s | clang-repl -Xcc -I %S | FileCheck %s +// RUN: cat %s | clang-repl -Xcc -O2 -Xcc -I %S | FileCheck %s + +#include "ClangReplPrologue.h" extern "C" int printf(const char*, ...); diff --git a/clang/test/Interpreter/disambiguate-decl-stmt.cpp b/clang/test/Interpreter/disambiguate-decl-stmt.cpp index a49d7013c540ac2..8355cf7d6465b2d 100644 --- a/clang/test/Interpreter/disambiguate-decl-stmt.cpp +++ b/clang/test/Interpreter/disambiguate-decl-stmt.cpp @@ -1,5 +1,7 @@ -// RUN: %clang_cc1 -fsyntax-only -verify -fincremental-extensions -std=c++20 %s -// RUN: %clang_cc1 -fsyntax-only -DMS -fms-extensions -verify -fincremental-extensions -std=c++20 %s +// RUN: %clang_cc1 -fsyntax-only -verify -fincremental-extensions -std=c++20 -I %S %s +// RUN: %clang_cc1 -fsyntax-only -DMS -fms-extensions -verify -fincremental-extensions -std=c++20 -I %S %s + +#include "ClangReplPrologue.h" extern "C" int printf(const char*,...); diff --git a/clang/test/Interpreter/dynamic-library.cpp b/clang/test/Interpreter/dynamic-library.cpp index 6c4621f729c1c88..c7c74fd281d966e 100644 --- a/clang/test/Interpreter/dynamic-library.cpp +++ b/clang/test/Interpreter/dynamic-library.cpp @@ -14,7 +14,9 @@ // // } -// RUN: cat %s | env LD_LIBRARY_PATH=%S/Inputs:$LD_LIBRARY_PATH clang-repl | FileCheck %s +// RUN: cat %s | env LD_LIBRARY_PATH=%S/Inputs:$LD_LIBRARY_PATH clang-repl -Xcc -I %S | FileCheck %s + +#include "ClangReplPrologue.h" extern "C" int printf(const char* format, ...); diff --git a/clang/test/Interpreter/execute-stmts.cpp b/clang/test/Interpreter/execute-stmts.cpp index 2d4c17e0c91e661..33ea246ee802e05 100644 --- a/clang/test/Interpreter/execute-stmts.cpp +++ b/clang/test/Interpreter/execute-stmts.cpp @@ -1,7 +1,7 @@ // REQUIRES: host-supports-jit // UNSUPPORTED: system-aix -// RUN: cat %s | clang-repl -Xcc -Xclang -Xcc -verify | FileCheck %s -// RUN: %clang_cc1 -verify -fincremental-extensions -emit-llvm -o - %s \ +// RUN: cat %s | clang-repl -Xcc -Xclang -Xcc -verify -Xcc -I %S | FileCheck %s +// RUN: %clang_cc1 -verify -fincremental-extensions -emit-llvm -I %S -o - %s \ // RUN: | FileCheck --check-prefix=CODEGEN-CHECK %s // expected-no-diagnostics @@ -9,6 +9,7 @@ //CODEGEN-CHECK-COUNT-2: define internal void @__stmts__ //CODEGEN-CHECK-NOT: define internal void @__stmts__ +#include "ClangReplPrologue.h" extern "C" int printf(const char*,...); diff --git a/clang/test/Interpreter/execute-weak.cpp b/clang/test/Interpreter/execute-weak.cpp index 85fa5d276f5f468..67187a3c2a9a83a 100644 --- a/clang/test/Interpreter/execute-weak.cpp +++ b/clang/test/Interpreter/execute-weak.cpp @@ -1,5 +1,7 @@ // UNSUPPORTED: system-aix, system-windows -// RUN: cat %s | clang-repl | FileCheck %s +// RUN: cat %s | clang-repl -Xcc -I %S | FileCheck %s + +#include "ClangReplPrologue.h" extern "C" int printf(const char *, ...); int __attribute__((weak)) bar() { return 42; } diff --git a/clang/test/Interpreter/execute.cpp b/clang/test/Interpreter/execute.cpp index d54ab99749c1bac..968e498e43e1338 100644 --- a/clang/test/Interpreter/execute.cpp +++ b/clang/test/Interpreter/execute.cpp @@ -5,8 +5,11 @@ // RUN: 'auto r1 = printf("i = %d\n", i);' | FileCheck --check-prefix=CHECK-DRIVER %s // CHECK-DRIVER: i = 10 -// RUN: cat %s | clang-repl | FileCheck %s -// RUN: cat %s | clang-repl -Xcc -O2 | FileCheck %s +// RUN: cat %s | clang-repl -Xcc -I %S | FileCheck %s +// RUN: cat %s | clang-repl -Xcc -O2 -Xcc -I %S | FileCheck %s + +#include "ClangReplPrologue.h" + extern "C" int printf(const char *, ...); int i = 42; auto r1 = printf("i = %d\n", i); diff --git a/clang/test/Interpreter/fail.cpp b/clang/test/Interpreter/fail.cpp index 4e301f37548f1f9..dbf36be75976f82 100644 --- a/clang/test/Interpreter/fail.cpp +++ b/clang/test/Interpreter/fail.cpp @@ -5,7 +5,10 @@ // RUN: clang-repl "int x = 10;" "int y=7; err;" "int y = 10;" // REQUIRES: host-supports-jit // UNSUPPORTED: system-aix -// RUN: cat %s | not clang-repl | FileCheck %s +// RUN: cat %s | not clang-repl -Xcc -I %S | FileCheck %s + +#include "ClangReplPrologue.h" + BOOM! extern "C" int printf(const char *, ...); int i = 42; diff --git a/clang/test/Interpreter/global-dtor.cpp b/clang/test/Interpreter/global-dtor.cpp index 1f241d9f19317e6..728816a8650e162 100644 --- a/clang/test/Interpreter/global-dtor.cpp +++ b/clang/test/Interpreter/global-dtor.cpp @@ -3,7 +3,9 @@ // // Tests that a global destructor is ran on platforms with gnu exception support. // -// RUN: cat %s | clang-repl | FileCheck %s +// RUN: cat %s | clang-repl -Xcc -I %S | FileCheck %s + +#include "ClangReplPrologue.h" extern "C" int printf(const char *, ...); diff --git a/clang/test/Interpreter/inline-virtual.cpp b/clang/test/Interpreter/inline-virtual.cpp index 79ab8ed337ffeaf..3695fbac99a7bf4 100644 --- a/clang/test/Interpreter/inline-virtual.cpp +++ b/clang/test/Interpreter/inline-virtual.cpp @@ -3,8 +3,10 @@ // // We disable RTTI to avoid problems on Windows for non-RTTI builds of LLVM // where the JIT cannot find ??_7type_info@@6B@. -// RUN: cat %s | clang-repl -Xcc -fno-rtti | FileCheck %s -// RUN: cat %s | clang-repl -Xcc -fno-rtti -Xcc -O2 | FileCheck %s +// RUN: cat %s | clang-repl -Xcc -fno-rtti -Xcc -I %S | FileCheck %s +// RUN: cat %s | clang-repl -Xcc -fno-rtti -Xcc -O2 -Xcc -I %S | FileCheck %s + +#include "ClangReplPrologue.h" extern "C" int printf(const char *, ...); diff --git a/clang/test/Interpreter/lambda.cpp b/clang/test/Interpreter/lambda.cpp index df75274a050b29a..78e96e391a9ae54 100644 --- a/clang/test/Interpreter/lambda.cpp +++ b/clang/test/Interpreter/lambda.cpp @@ -1,7 +1,10 @@ // REQUIRES: host-supports-jit // UNSUPPORTED: system-aix -// RUN: cat %s | clang-repl | FileCheck %s -// RUN: cat %s | clang-repl -Xcc -O2 | FileCheck %s +// RUN: cat %s | clang-repl -Xcc -I %S | FileCheck %s +// RUN: cat %s | clang-repl -Xcc -O2 -Xcc -I %S | FileCheck %s + +#include "ClangReplPrologue.h" + extern "C" int printf(const char *, ...); auto l1 = []() { printf("ONE\n"); return 42; }; diff --git a/clang/test/Interpreter/multiline.cpp b/clang/test/Interpreter/multiline.cpp index 054e61a7e3d62ec..db0d6885e1268da 100644 --- a/clang/test/Interpreter/multiline.cpp +++ b/clang/test/Interpreter/multiline.cpp @@ -1,6 +1,8 @@ // REQUIRES: host-supports-jit // UNSUPPORTED: system-aix -// RUN: cat %s | clang-repl | FileCheck %s +// RUN: cat %s | clang-repl -Xcc -I %S | FileCheck %s + +#include "ClangReplPrologue.h" extern "C" int printf(const char*,...); int i = \ diff --git a/clang/test/Interpreter/plugins.cpp b/clang/test/Interpreter/plugins.cpp index 59e4f2f29240980..8b72bcdc54e53b2 100644 --- a/clang/test/Interpreter/plugins.cpp +++ b/clang/test/Interpreter/plugins.cpp @@ -1,8 +1,10 @@ // RUN: cat %s | clang-repl -Xcc -Xclang -Xcc -load -Xcc -Xclang \ // RUN: -Xcc %llvmshlibdir/PrintFunctionNames%pluginext -Xcc -Xclang\ -// RUN: -Xcc -add-plugin -Xcc -Xclang -Xcc print-fns 2>&1 | FileCheck %s +// RUN: -Xcc -add-plugin -Xcc -Xclang -Xcc print-fns -Xcc -I %S 2>&1 | FileCheck %s // REQUIRES: plugins, examples +#include "ClangReplPrologue.h" + int i = 10; extern "C" int printf(const char*,...); auto r1 = printf("i = %d\n", i); diff --git a/clang/test/Interpreter/simple-exception.cpp b/clang/test/Interpreter/simple-exception.cpp index 8741886a0a621cc..fabda06cb78c72a 100644 --- a/clang/test/Interpreter/simple-exception.cpp +++ b/clang/test/Interpreter/simple-exception.cpp @@ -2,12 +2,14 @@ // UNSUPPORTED: system-aix // XFAIL for arm, arm64, riscv, or running on Windows. // XFAIL: target={{(arm|riscv).*}}, system-windows -// RUN: cat %s | clang-repl | FileCheck %s +// RUN: cat %s | clang-repl -Xcc -I %S | FileCheck %s // Incompatible with msan. It passes with -O3 but fail -Oz. Interpreter // generates non-instrumented code, which may call back to instrumented. // UNSUPPORTED: msan +#include "ClangReplPrologue.h" + extern "C" int printf(const char *, ...); int f() { throw "Simple exception"; return 0; } diff --git a/clang/test/Interpreter/stmt-serialization.cpp b/clang/test/Interpreter/stmt-serialization.cpp index 4d97a3dc5c64c34..d88a4e09a2ed026 100644 --- a/clang/test/Interpreter/stmt-serialization.cpp +++ b/clang/test/Interpreter/stmt-serialization.cpp @@ -1,8 +1,10 @@ // RUN: rm -rf %t // RUN: %clang_cc1 -std=c++20 -fincremental-extensions -fmodules-cache-path=%t \ -// RUN: -x c++ %s -verify +// RUN: -I %S -x c++ %s -verify // expected-no-diagnostics +#include "ClangReplPrologue.h" + #pragma clang module build TopLevelStmt module TopLevelStmt { module Statements {} } #pragma clang module contents _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits