[clang] [clang-repl] We do not need to call new in the object allocation. (PR #78843)

Vassil Vassilev via cfe-commits cfe-commits at lists.llvm.org
Sat Jan 20 03:41:30 PST 2024


https://github.com/vgvassilev created https://github.com/llvm/llvm-project/pull/78843

This test demonstrates template instantiation via the interpreter code. In order to do that we can allocate the object on the stack and extend its lifetime by boxing it into a clang::Value.

That avoids the subtle problem where we call the new operator on an object only known to the interpreter and we cannot destroy it from compiled code since there is not suitable facility in clang::Value yet.

That should resolve the asan issues that was reported in llvm/llvm-project#76218.

>From eee0a9994ebc872afe074529e328b0387ec0da1f Mon Sep 17 00:00:00 2001
From: Vassil Vassilev <v.g.vassilev at gmail.com>
Date: Sat, 20 Jan 2024 10:44:18 +0000
Subject: [PATCH] [clang-repl] We do not need to call new in the object
 allocation.

This test demonstrates template instantiation via the interpreter code. In order
to do that we can allocate the object on the stack and extend its lifetime by
boxing it into a clang::Value.

That avoids the subtle problem where we call the new operator on an object only
known to the interpreter and we cannot destroy it from compiled code since there
is not suitable facility in clang::Value yet.

That should resolve the asan issues that was reported in llvm/llvm-project#76218.
---
 clang/unittests/Interpreter/InterpreterTest.cpp | 15 ++++++---------
 1 file changed, 6 insertions(+), 9 deletions(-)

diff --git a/clang/unittests/Interpreter/InterpreterTest.cpp b/clang/unittests/Interpreter/InterpreterTest.cpp
index d6eb0684ba49d8..e76c0677db5ead 100644
--- a/clang/unittests/Interpreter/InterpreterTest.cpp
+++ b/clang/unittests/Interpreter/InterpreterTest.cpp
@@ -34,12 +34,6 @@ using namespace clang;
 #define CLANG_INTERPRETER_NO_SUPPORT_EXEC
 #endif
 
-#if LLVM_ADDRESS_SANITIZER_BUILD || LLVM_HWADDRESS_SANITIZER_BUILD
-#include <sanitizer/lsan_interface.h>
-#else
-extern "C" void __lsan_ignore_object(const void *p) {}
-#endif
-
 int Global = 42;
 // JIT reports symbol not found on Windows without the visibility attribute.
 REPL_EXTERNAL_VISIBILITY int getGlobal() { return Global; }
@@ -257,7 +251,12 @@ TEST(IncrementalProcessing, FindMangledNameSymbol) {
 static Value AllocateObject(TypeDecl *TD, Interpreter &Interp) {
   std::string Name = TD->getQualifiedNameAsString();
   Value Addr;
-  cantFail(Interp.ParseAndExecute("new " + Name + "()", &Addr));
+  // FIXME: Consider providing an option in clang::Value to take ownership of
+  // the memory created from the interpreter.
+  // cantFail(Interp.ParseAndExecute("new " + Name + "()", &Addr));
+
+  // The lifetime of the temporary is extended by the clang::Value.
+  cantFail(Interp.ParseAndExecute(Name + "()", &Addr));
   return Addr;
 }
 
@@ -317,8 +316,6 @@ TEST(IncrementalProcessing, InstantiateTemplate) {
   auto fn =
       cantFail(Interp->getSymbolAddress(MangledName)).toPtr<TemplateSpecFn>();
   EXPECT_EQ(42, fn(NewA.getPtr()));
-  // FIXME: release the memory.
-  __lsan_ignore_object(NewA.getPtr());
 }
 
 #ifdef CLANG_INTERPRETER_NO_SUPPORT_EXEC



More information about the cfe-commits mailing list