Skip to content

Commit f1e5456

Browse files
committed
Fix some issues
1 parent 4b9539e commit f1e5456

File tree

3 files changed

+48
-42
lines changed

3 files changed

+48
-42
lines changed

clang/include/clang/Interpreter/Value.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@
3939
#include "llvm/Support/Compiler.h"
4040
#include <cassert>
4141
#include <cstdint>
42+
#include <mutex>
4243

4344
// NOTE: Since the REPL itself could also include this runtime, extreme caution
4445
// should be taken when MAKING CHANGES to this file, especially when INCLUDE NEW
@@ -176,9 +177,10 @@ class REPL_EXTERNAL_VISIBILITY Value final {
176177
void set##name(type Val) { \
177178
assert(BK == K_Unspecified || BK == K_##name); \
178179
m_##name = Val; \
180+
BK = K_##name; \
179181
} \
180182
type get##name() const { \
181-
assert(BK == K_##name); \
183+
assert(BK != K_Unspecified); \
182184
return m_##name; \
183185
}
184186
REPL_BUILTIN_TYPES
@@ -501,6 +503,7 @@ class ValueResultManager {
501503

502504
ValueId registerPendingResult(QualType QT,
503505
std::optional<ValueCleanup> VC = std::nullopt) {
506+
std::lock_guard<std::mutex> Lock(Mutex);
504507
ValueId NewID = NextID.fetch_add(1, std::memory_order_relaxed);
505508
IdToType.insert({NewID, QT});
506509
if (VC)

clang/lib/Interpreter/InterpreterValuePrinter.cpp

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -275,19 +275,6 @@ std::string ValueToString::PointerToString(const Value &P) {
275275
QualType DesugaredTy = QT.getDesugaredType(Ctx);
276276
QualType NonRefTy = DesugaredTy.getNonReferenceType();
277277

278-
if (auto PtrTy = dyn_cast<PointerType>(QT.getTypePtr())) {
279-
if (!PtrTy)
280-
return "";
281-
282-
auto PointeeTy = PtrTy->getPointeeType();
283-
284-
// char* -> print string literal
285-
if (PointeeTy->isCharType() && P.HasPointee()) {
286-
if (P.getPointerPointee().isStr())
287-
return "\"" + P.getPointerPointee().getStrVal().str() + "\"";
288-
}
289-
}
290-
291278
if ((NonRefTy->isPointerType() || NonRefTy->isMemberPointerType()) &&
292279
NonRefTy->getPointeeType()->isFunctionProtoType())
293280
return FunctionToString(Ctx, QT, (void *)P.getAddr());
@@ -298,6 +285,21 @@ std::string ValueToString::PointerToString(const Value &P) {
298285
if (NonRefTy->isNullPtrType())
299286
return "nullptr\n";
300287

288+
if (NonRefTy->isPointerType()) {
289+
auto PointeeTy = NonRefTy->getPointeeType();
290+
291+
// char* -> print string literal
292+
if (PointeeTy->isCharType()) {
293+
if (P.HasPointee() && P.getPointerPointee().isStr())
294+
return "\"" + P.getPointerPointee().getStrVal().str() + "\"";
295+
return std::to_string(P.getAddr());
296+
}
297+
298+
std::ostringstream OS;
299+
OS << "0x" << std::hex << P.getAddr();
300+
return OS.str();
301+
}
302+
301303
std::ostringstream OS;
302304
OS << "@0x" << std::hex << P.getAddr();
303305
return OS.str();
@@ -509,8 +511,6 @@ class ExprConverter {
509511

510512
ExprResult handleFunctionTypeExpr(const FunctionType *, QualType QTy,
511513
Expr *E) {
512-
if (Ctx.getLangOpts().CPlusPlus)
513-
return CreateAddressOfVoidPtrExpr(QTy, E, /*takeAddr=*/true);
514514
return CreateAddressOfVoidPtrExpr(QTy, E, /*takeAddr=*/false);
515515
}
516516

clang/lib/Interpreter/Value.cpp

Lines changed: 29 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -242,7 +242,8 @@ void ValueCleanup::operator()(Value &V) {
242242
LLVM_DEBUG(dbgs() << "ValueCleanup: destroying value at Addr=" << V.getAddr()
243243
<< ", Type=" << V.getType().getAsString() << "\n");
244244
if (ObjDtor) {
245-
if (auto ObjDtorAddrOrErr = ObjDtor(V.getType())) {
245+
auto ObjDtorAddrOrErr = ObjDtor(V.getType());
246+
if (ObjDtorAddrOrErr && !ObjDtorAddrOrErr->isNull()) {
246247
Error E = Error::success();
247248
orc::ExecutorAddr ObjDtorFn = *ObjDtorAddrOrErr;
248249
orc::ExecutorAddr Addr(V.getAddr());
@@ -255,8 +256,7 @@ void ValueCleanup::operator()(Value &V) {
255256
cantFail(std::move(E));
256257
} else {
257258
LLVM_DEBUG(dbgs() << "ValueCleanup: failed to get ObjDtor address\n");
258-
259-
cantFail(ObjDtorAddrOrErr.takeError());
259+
consumeError(ObjDtorAddrOrErr.takeError());
260260
}
261261
}
262262

@@ -298,40 +298,43 @@ class ValueReadVisitor
298298
: public TypeVisitor<ValueReadVisitor, llvm::Expected<Value>> {
299299
ValueReaderDispatcher &Dispatcher;
300300
llvm::orc::ExecutorAddr Addr;
301+
QualType QT;
301302

302303
public:
303-
ValueReadVisitor(ValueReaderDispatcher &D, llvm::orc::ExecutorAddr A)
304-
: Dispatcher(D), Addr(A) {}
304+
ValueReadVisitor(ValueReaderDispatcher &D, llvm::orc::ExecutorAddr A,
305+
QualType QT)
306+
: Dispatcher(D), Addr(A), QT(QT) {}
305307

306308
llvm::Expected<Value> VisitType(const Type *T) {
307-
return Dispatcher.readOtherObject(QualType(T, 0), Addr);
309+
return Dispatcher.readOtherObject(QT, Addr);
308310
}
309311

310312
llvm::Expected<Value> VisitBuiltinType(const BuiltinType *BT) {
311-
return Dispatcher.readBuiltin(QualType(BT, 0), Addr);
313+
return Dispatcher.readBuiltin(QT, Addr);
312314
}
313315

314316
llvm::Expected<Value> VisitPointerType(const PointerType *PT) {
315-
return Dispatcher.readPointer(QualType(PT, 0), Addr);
317+
return Dispatcher.readPointer(QT, Addr);
316318
}
317319

318320
llvm::Expected<Value> VisitConstantArrayType(const ConstantArrayType *AT) {
319-
return Dispatcher.readArray(QualType(AT, 0), Addr);
321+
return Dispatcher.readArray(QT, Addr);
320322
}
321323

322324
llvm::Expected<Value> VisitEnumType(const EnumType *ET) {
323-
return Dispatcher.readBuiltin(QualType(ET, 0), Addr);
325+
return Dispatcher.readBuiltin(QT, Addr);
324326
}
325327
};
326328

327329
llvm::Expected<Value>
328330
ValueReaderDispatcher::read(QualType QT, llvm::orc::ExecutorAddr Addr) {
329-
ValueReadVisitor V(*this, Addr);
330-
return V.Visit(QT.getTypePtr());
331+
ValueReadVisitor V(*this, Addr, QT);
332+
return V.Visit(QT.getCanonicalType().getTypePtr());
331333
}
332334

333335
llvm::Expected<Value>
334-
ValueReaderDispatcher::readBuiltin(QualType Ty, llvm::orc::ExecutorAddr Addr) {
336+
ValueReaderDispatcher::readBuiltin(QualType QT, llvm::orc::ExecutorAddr Addr) {
337+
QualType Ty = QT.getCanonicalType();
335338
LLVM_DEBUG(llvm::dbgs() << "readBuiltin: start, Addr=" << Addr.getValue()
336339
<< ", Type=" << Ty.getAsString() << "\n");
337340
if (Ty->isVoidType()) {
@@ -351,17 +354,16 @@ ValueReaderDispatcher::readBuiltin(QualType Ty, llvm::orc::ExecutorAddr Addr) {
351354
const auto &Res = *ResOrErr;
352355
LLVM_DEBUG(llvm::dbgs() << "readBuiltin: read succeeded, last byte addr="
353356
<< Res.back().data() << "\n");
354-
return Value(Ty, Res.back());
357+
return Value(QT, Res.back());
355358
}
356359

357360
llvm::Expected<Value>
358-
ValueReaderDispatcher::readPointer(QualType Ty, llvm::orc::ExecutorAddr Addr) {
359-
361+
ValueReaderDispatcher::readPointer(QualType QT, llvm::orc::ExecutorAddr Addr) {
362+
QualType Ty = QT.getCanonicalType();
360363
LLVM_DEBUG(llvm::dbgs() << "readPointer: start, Addr=" << Addr.getValue()
361364
<< "\n");
362365

363-
auto PtrTy = dyn_cast<PointerType>(Ty.getTypePtr());
364-
if (!PtrTy) {
366+
if (!Ty->isPointerType()) {
365367
LLVM_DEBUG(llvm::dbgs() << "readPointer: Not a PointerType!\n");
366368

367369
return llvm::make_error<llvm::StringError>("Not a PointerType",
@@ -374,13 +376,13 @@ ValueReaderDispatcher::readPointer(QualType Ty, llvm::orc::ExecutorAddr Addr) {
374376

375377
if (PtrValAddr == 0) {
376378
LLVM_DEBUG(llvm::dbgs() << "readPointer: null pointer detected\n");
377-
return Value(Ty, PtrValAddr); // null pointer
379+
return Value(QT, PtrValAddr); // null pointer
378380
}
379381

380382
llvm::orc::ExecutorAddr PointeeAddr(PtrValAddr);
381-
Value Val(Ty, PtrValAddr);
383+
Value Val(QT, PtrValAddr);
382384

383-
QualType PointeeTy = PtrTy->getPointeeType();
385+
QualType PointeeTy = Ty->getPointeeType();
384386
LLVM_DEBUG(llvm::dbgs() << "readPointer: pointee type="
385387
<< PointeeTy.getAsString() << "\n");
386388
if (PointeeTy->isCharType()) {
@@ -408,9 +410,10 @@ ValueReaderDispatcher::readPointer(QualType Ty, llvm::orc::ExecutorAddr Addr) {
408410
}
409411

410412
llvm::Expected<Value>
411-
ValueReaderDispatcher::readArray(QualType Ty, llvm::orc::ExecutorAddr Addr) {
413+
ValueReaderDispatcher::readArray(QualType QT, llvm::orc::ExecutorAddr Addr) {
412414
LLVM_DEBUG(llvm::dbgs() << "readArray: start, Addr=" << Addr.getValue()
413415
<< "\n");
416+
QualType Ty = QT.getCanonicalType();
414417
const ConstantArrayType *CAT = Ctx.getAsConstantArrayType(Ty);
415418
if (!CAT) {
416419
LLVM_DEBUG(llvm::dbgs() << "readArray: Not a ConstantArrayType!\n");
@@ -425,7 +428,7 @@ ValueReaderDispatcher::readArray(QualType Ty, llvm::orc::ExecutorAddr Addr) {
425428
LLVM_DEBUG(llvm::dbgs() << "readArray: element type size=" << ElemSize
426429
<< ", element count=" << NumElts << "\n");
427430

428-
Value Val(Value::UninitArr(), Ty, NumElts);
431+
Value Val(Value::UninitArr(), QT, NumElts);
429432
for (size_t i = 0; i < NumElts; ++i) {
430433
auto ElemAddr = Addr + i * ElemSize;
431434
LLVM_DEBUG(llvm::dbgs() << "readArray: reading element[" << i
@@ -510,7 +513,7 @@ void ValueResultManager::deliverResult(SendResultFn SendResult, ValueId ID,
510513
SendResult(llvm::make_error<llvm::StringError>(
511514
"Unknown ValueId in deliverResult", llvm::inconvertibleErrorCode()));
512515
}
513-
Ty = It->second.getCanonicalType();
516+
Ty = It->second;
514517
LLVM_DEBUG(llvm::dbgs() << "Resolved Type for ID=" << ID << "\n");
515518

516519
IdToType.erase(It);
@@ -526,8 +529,8 @@ void ValueResultManager::deliverResult(SendResultFn SendResult, ValueId ID,
526529
}
527530
}
528531

529-
ValueReaderDispatcher Runner(Ctx, MemAcc);
530-
auto BufOrErr = Runner.read(Ty, Addr);
532+
ValueReaderDispatcher Dispatcher(Ctx, MemAcc);
533+
auto BufOrErr = Dispatcher.read(Ty, Addr);
531534

532535
if (!BufOrErr) {
533536
LLVM_DEBUG(llvm::dbgs() << "Failed to read value for ID=" << ID << "\n");

0 commit comments

Comments
 (0)