Skip to content

Commit 891cdd5

Browse files
committed
[clang][repl] fix new
1 parent 47826b3 commit 891cdd5

File tree

2 files changed

+32
-11
lines changed

2 files changed

+32
-11
lines changed

clang/lib/Interpreter/Interpreter.cpp

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -248,7 +248,6 @@ Interpreter::~Interpreter() {
248248
// can't find the precise resource directory in unittests so we have to hard
249249
// code them.
250250
const char *const Runtimes = R"(
251-
void* operator new(__SIZE_TYPE__, void* __p) noexcept;
252251
void *__clang_Interpreter_SetValueWithAlloc(void*, void*, void*);
253252
void __clang_Interpreter_SetValueNoAlloc(void*, void*, void*);
254253
void __clang_Interpreter_SetValueNoAlloc(void*, void*, void*, void*);
@@ -257,14 +256,9 @@ const char *const Runtimes = R"(
257256
void __clang_Interpreter_SetValueNoAlloc(void*, void*, void*, long double);
258257
void __clang_Interpreter_SetValueNoAlloc(void*,void*,void*,unsigned long long);
259258
template <class T, class = T (*)() /*disable for arrays*/>
260-
void __clang_Interpreter_SetValueCopyArr(T* Src, void* Placement, unsigned long Size) {
261-
for (auto Idx = 0; Idx < Size; ++Idx)
262-
new ((void*)(((T*)Placement) + Idx)) T(Src[Idx]);
263-
}
259+
void __clang_Interpreter_SetValueCopyArr(T* Src, void* Placement, unsigned long Size);
264260
template <class T, unsigned long N>
265-
void __clang_Interpreter_SetValueCopyArr(const T (*Src)[N], void* Placement, unsigned long Size) {
266-
__clang_Interpreter_SetValueCopyArr(Src[0], Placement, Size);
267-
}
261+
void __clang_Interpreter_SetValueCopyArr(const T (*Src)[N], void* Placement, unsigned long Size);
268262
)";
269263

270264
llvm::Expected<std::unique_ptr<Interpreter>>
@@ -762,6 +756,20 @@ __clang_Interpreter_SetValueNoAlloc(void *This, void *OutVal,
762756
VRef = Value(static_cast<Interpreter *>(This), OpaqueType);
763757
}
764758

759+
template <class T, class>
760+
REPL_EXTERNAL_VISIBILITY void
761+
__clang_Interpreter_SetValueCopyArr(T *Src, void *Placement,
762+
unsigned long Size) {
763+
for (unsigned long Idx = 0; Idx < Size; ++Idx)
764+
new ((void *)(((T *)Placement) + Idx)) T(Src[Idx]);
765+
}
766+
template <class T, unsigned long N>
767+
REPL_EXTERNAL_VISIBILITY void
768+
__clang_Interpreter_SetValueCopyArr(const T (*Src)[N], void *Placement,
769+
unsigned long Size) {
770+
__clang_Interpreter_SetValueCopyArr(Src[0], Placement, Size);
771+
}
772+
765773
static void SetValueDataBasedOnQualType(Value &V, unsigned long long Data) {
766774
QualType QT = V.getType();
767775
if (const auto *ET = QT->getAs<EnumType>())

clang/unittests/Interpreter/InterpreterTest.cpp

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
#include "llvm/ExecutionEngine/Orc/LLJIT.h"
2525
#include "llvm/Support/ManagedStatic.h"
2626
#include "llvm/Support/TargetSelect.h"
27+
#include "llvm/TargetParser/Host.h"
2728

2829
#include "gmock/gmock.h"
2930
#include "gtest/gtest.h"
@@ -45,13 +46,25 @@ static std::unique_ptr<Interpreter>
4546
createInterpreter(const Args &ExtraArgs = {},
4647
DiagnosticConsumer *Client = nullptr) {
4748
Args ClangArgs = {"-Xclang", "-emit-llvm-only"};
49+
if (llvm::Triple(llvm::sys::getProcessTriple()).isOSDarwin()) {
50+
Args macOsArgs = {"-Xcc", "-isysroot",
51+
"/Applications/Xcode.app/Contents/Developer/Platforms/"
52+
"MacOSX.platform/Developer/SDKs/MacOSX.sdk"};
53+
ClangArgs.insert(ClangArgs.end(), macOsArgs.begin(), macOsArgs.end());
54+
}
4855
ClangArgs.insert(ClangArgs.end(), ExtraArgs.begin(), ExtraArgs.end());
4956
auto CB = clang::IncrementalCompilerBuilder();
5057
CB.SetCompilerArgs(ClangArgs);
5158
auto CI = cantFail(CB.CreateCpp());
5259
if (Client)
5360
CI->getDiagnostics().setClient(Client, /*ShouldOwnClient=*/false);
54-
return cantFail(clang::Interpreter::create(std::move(CI)));
61+
auto interp = cantFail(clang::Interpreter::create(std::move(CI)));
62+
if (llvm::Triple(llvm::sys::getProcessTriple()).isOSDarwin())
63+
(void)cantFail(interp->Parse("#include <new>"));
64+
else
65+
(void)cantFail(interp->Parse(
66+
"void* operator new(__SIZE_TYPE__, void* __p) noexcept;"));
67+
return interp;
5568
}
5669

5770
static size_t DeclsSize(TranslationUnitDecl *PTUDecl) {
@@ -148,12 +161,12 @@ TEST(InterpreterTest, UndoCommand) {
148161
auto Interp = createInterpreter(ExtraArgs, DiagPrinter.get());
149162

150163
// Fail to undo.
151-
auto Err1 = Interp->Undo();
164+
auto Err1 = Interp->Undo(2);
152165
EXPECT_EQ("Operation failed. Too many undos",
153166
llvm::toString(std::move(Err1)));
154167
auto Err2 = Interp->Parse("int foo = 42;");
155168
EXPECT_TRUE(!!Err2);
156-
auto Err3 = Interp->Undo(2);
169+
auto Err3 = Interp->Undo(3);
157170
EXPECT_EQ("Operation failed. Too many undos",
158171
llvm::toString(std::move(Err3)));
159172

0 commit comments

Comments
 (0)