@@ -242,7 +242,8 @@ void ValueCleanup::operator()(Value &V) {
242
242
LLVM_DEBUG (dbgs () << " ValueCleanup: destroying value at Addr=" << V.getAddr ()
243
243
<< " , Type=" << V.getType ().getAsString () << " \n " );
244
244
if (ObjDtor) {
245
- if (auto ObjDtorAddrOrErr = ObjDtor (V.getType ())) {
245
+ auto ObjDtorAddrOrErr = ObjDtor (V.getType ());
246
+ if (ObjDtorAddrOrErr && !ObjDtorAddrOrErr->isNull ()) {
246
247
Error E = Error::success ();
247
248
orc::ExecutorAddr ObjDtorFn = *ObjDtorAddrOrErr;
248
249
orc::ExecutorAddr Addr (V.getAddr ());
@@ -255,8 +256,7 @@ void ValueCleanup::operator()(Value &V) {
255
256
cantFail (std::move (E));
256
257
} else {
257
258
LLVM_DEBUG (dbgs () << " ValueCleanup: failed to get ObjDtor address\n " );
258
-
259
- cantFail (ObjDtorAddrOrErr.takeError ());
259
+ consumeError (ObjDtorAddrOrErr.takeError ());
260
260
}
261
261
}
262
262
@@ -298,40 +298,43 @@ class ValueReadVisitor
298
298
: public TypeVisitor<ValueReadVisitor, llvm::Expected<Value>> {
299
299
ValueReaderDispatcher &Dispatcher;
300
300
llvm::orc::ExecutorAddr Addr;
301
+ QualType QT;
301
302
302
303
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) {}
305
307
306
308
llvm::Expected<Value> VisitType (const Type *T) {
307
- return Dispatcher.readOtherObject (QualType (T, 0 ) , Addr);
309
+ return Dispatcher.readOtherObject (QT , Addr);
308
310
}
309
311
310
312
llvm::Expected<Value> VisitBuiltinType (const BuiltinType *BT) {
311
- return Dispatcher.readBuiltin (QualType (BT, 0 ) , Addr);
313
+ return Dispatcher.readBuiltin (QT , Addr);
312
314
}
313
315
314
316
llvm::Expected<Value> VisitPointerType (const PointerType *PT) {
315
- return Dispatcher.readPointer (QualType (PT, 0 ) , Addr);
317
+ return Dispatcher.readPointer (QT , Addr);
316
318
}
317
319
318
320
llvm::Expected<Value> VisitConstantArrayType (const ConstantArrayType *AT) {
319
- return Dispatcher.readArray (QualType (AT, 0 ) , Addr);
321
+ return Dispatcher.readArray (QT , Addr);
320
322
}
321
323
322
324
llvm::Expected<Value> VisitEnumType (const EnumType *ET) {
323
- return Dispatcher.readBuiltin (QualType (ET, 0 ) , Addr);
325
+ return Dispatcher.readBuiltin (QT , Addr);
324
326
}
325
327
};
326
328
327
329
llvm::Expected<Value>
328
330
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 ());
331
333
}
332
334
333
335
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 ();
335
338
LLVM_DEBUG (llvm::dbgs () << " readBuiltin: start, Addr=" << Addr.getValue ()
336
339
<< " , Type=" << Ty.getAsString () << " \n " );
337
340
if (Ty->isVoidType ()) {
@@ -351,17 +354,16 @@ ValueReaderDispatcher::readBuiltin(QualType Ty, llvm::orc::ExecutorAddr Addr) {
351
354
const auto &Res = *ResOrErr;
352
355
LLVM_DEBUG (llvm::dbgs () << " readBuiltin: read succeeded, last byte addr="
353
356
<< Res.back ().data () << " \n " );
354
- return Value (Ty , Res.back ());
357
+ return Value (QT , Res.back ());
355
358
}
356
359
357
360
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 ();
360
363
LLVM_DEBUG (llvm::dbgs () << " readPointer: start, Addr=" << Addr.getValue ()
361
364
<< " \n " );
362
365
363
- auto PtrTy = dyn_cast<PointerType>(Ty.getTypePtr ());
364
- if (!PtrTy) {
366
+ if (!Ty->isPointerType ()) {
365
367
LLVM_DEBUG (llvm::dbgs () << " readPointer: Not a PointerType!\n " );
366
368
367
369
return llvm::make_error<llvm::StringError>(" Not a PointerType" ,
@@ -374,13 +376,13 @@ ValueReaderDispatcher::readPointer(QualType Ty, llvm::orc::ExecutorAddr Addr) {
374
376
375
377
if (PtrValAddr == 0 ) {
376
378
LLVM_DEBUG (llvm::dbgs () << " readPointer: null pointer detected\n " );
377
- return Value (Ty , PtrValAddr); // null pointer
379
+ return Value (QT , PtrValAddr); // null pointer
378
380
}
379
381
380
382
llvm::orc::ExecutorAddr PointeeAddr (PtrValAddr);
381
- Value Val (Ty , PtrValAddr);
383
+ Value Val (QT , PtrValAddr);
382
384
383
- QualType PointeeTy = PtrTy ->getPointeeType ();
385
+ QualType PointeeTy = Ty ->getPointeeType ();
384
386
LLVM_DEBUG (llvm::dbgs () << " readPointer: pointee type="
385
387
<< PointeeTy.getAsString () << " \n " );
386
388
if (PointeeTy->isCharType ()) {
@@ -408,9 +410,10 @@ ValueReaderDispatcher::readPointer(QualType Ty, llvm::orc::ExecutorAddr Addr) {
408
410
}
409
411
410
412
llvm::Expected<Value>
411
- ValueReaderDispatcher::readArray (QualType Ty , llvm::orc::ExecutorAddr Addr) {
413
+ ValueReaderDispatcher::readArray (QualType QT , llvm::orc::ExecutorAddr Addr) {
412
414
LLVM_DEBUG (llvm::dbgs () << " readArray: start, Addr=" << Addr.getValue ()
413
415
<< " \n " );
416
+ QualType Ty = QT.getCanonicalType ();
414
417
const ConstantArrayType *CAT = Ctx.getAsConstantArrayType (Ty);
415
418
if (!CAT) {
416
419
LLVM_DEBUG (llvm::dbgs () << " readArray: Not a ConstantArrayType!\n " );
@@ -425,7 +428,7 @@ ValueReaderDispatcher::readArray(QualType Ty, llvm::orc::ExecutorAddr Addr) {
425
428
LLVM_DEBUG (llvm::dbgs () << " readArray: element type size=" << ElemSize
426
429
<< " , element count=" << NumElts << " \n " );
427
430
428
- Value Val (Value::UninitArr (), Ty , NumElts);
431
+ Value Val (Value::UninitArr (), QT , NumElts);
429
432
for (size_t i = 0 ; i < NumElts; ++i) {
430
433
auto ElemAddr = Addr + i * ElemSize;
431
434
LLVM_DEBUG (llvm::dbgs () << " readArray: reading element[" << i
@@ -510,7 +513,7 @@ void ValueResultManager::deliverResult(SendResultFn SendResult, ValueId ID,
510
513
SendResult (llvm::make_error<llvm::StringError>(
511
514
" Unknown ValueId in deliverResult" , llvm::inconvertibleErrorCode ()));
512
515
}
513
- Ty = It->second . getCanonicalType () ;
516
+ Ty = It->second ;
514
517
LLVM_DEBUG (llvm::dbgs () << " Resolved Type for ID=" << ID << " \n " );
515
518
516
519
IdToType.erase (It);
@@ -526,8 +529,8 @@ void ValueResultManager::deliverResult(SendResultFn SendResult, ValueId ID,
526
529
}
527
530
}
528
531
529
- ValueReaderDispatcher Runner (Ctx, MemAcc);
530
- auto BufOrErr = Runner .read (Ty, Addr);
532
+ ValueReaderDispatcher Dispatcher (Ctx, MemAcc);
533
+ auto BufOrErr = Dispatcher .read (Ty, Addr);
531
534
532
535
if (!BufOrErr) {
533
536
LLVM_DEBUG (llvm::dbgs () << " Failed to read value for ID=" << ID << " \n " );
0 commit comments