@@ -106,7 +106,8 @@ namespace {
106
106
107
107
// / Turn an atomic-layout object into an r-value.
108
108
RValue convertTempToRValue (llvm::Value *addr,
109
- AggValueSlot resultSlot) const ;
109
+ AggValueSlot resultSlot,
110
+ SourceLocation loc) const ;
110
111
111
112
// / Copy an atomic r-value into atomic-layout memory.
112
113
void emitCopyIntoMemory (RValue rvalue, LValue lvalue) const ;
@@ -321,11 +322,12 @@ EmitValToTemp(CodeGenFunction &CGF, Expr *E) {
321
322
322
323
static void
323
324
AddDirectArgument (CodeGenFunction &CGF, CallArgList &Args,
324
- bool UseOptimizedLibcall, llvm::Value *Val, QualType ValTy) {
325
+ bool UseOptimizedLibcall, llvm::Value *Val, QualType ValTy,
326
+ SourceLocation Loc) {
325
327
if (UseOptimizedLibcall) {
326
328
// Load value and pass it to the function directly.
327
329
unsigned Align = CGF.getContext ().getTypeAlignInChars (ValTy).getQuantity ();
328
- Val = CGF.EmitLoadOfScalar (Val, false , Align, ValTy);
330
+ Val = CGF.EmitLoadOfScalar (Val, false , Align, ValTy, Loc );
329
331
Args.add (RValue::get (Val), ValTy);
330
332
} else {
331
333
// Non-optimized functions always take a reference.
@@ -490,9 +492,9 @@ RValue CodeGenFunction::EmitAtomicExpr(AtomicExpr *E, llvm::Value *Dest) {
490
492
LibCallName = " __atomic_compare_exchange" ;
491
493
RetTy = getContext ().BoolTy ;
492
494
HaveRetTy = true ;
493
- Args.add (RValue::get (EmitCastToVoidPtr (Val1)),
494
- getContext (). VoidPtrTy );
495
- AddDirectArgument (* this , Args, UseOptimizedLibcall, Val2, MemTy );
495
+ Args.add (RValue::get (EmitCastToVoidPtr (Val1)), getContext (). VoidPtrTy );
496
+ AddDirectArgument (* this , Args, UseOptimizedLibcall, Val2, MemTy,
497
+ E-> getExprLoc () );
496
498
Args.add (RValue::get (Order), getContext ().IntTy );
497
499
Order = OrderFail;
498
500
break ;
@@ -503,7 +505,8 @@ RValue CodeGenFunction::EmitAtomicExpr(AtomicExpr *E, llvm::Value *Dest) {
503
505
case AtomicExpr::AO__atomic_exchange_n:
504
506
case AtomicExpr::AO__atomic_exchange:
505
507
LibCallName = " __atomic_exchange" ;
506
- AddDirectArgument (*this , Args, UseOptimizedLibcall, Val1, MemTy);
508
+ AddDirectArgument (*this , Args, UseOptimizedLibcall, Val1, MemTy,
509
+ E->getExprLoc ());
507
510
break ;
508
511
// void __atomic_store(size_t size, void *mem, void *val, int order)
509
512
// void __atomic_store_N(T *mem, T val, int order)
@@ -513,7 +516,8 @@ RValue CodeGenFunction::EmitAtomicExpr(AtomicExpr *E, llvm::Value *Dest) {
513
516
LibCallName = " __atomic_store" ;
514
517
RetTy = getContext ().VoidTy ;
515
518
HaveRetTy = true ;
516
- AddDirectArgument (*this , Args, UseOptimizedLibcall, Val1, MemTy);
519
+ AddDirectArgument (*this , Args, UseOptimizedLibcall, Val1, MemTy,
520
+ E->getExprLoc ());
517
521
break ;
518
522
// void __atomic_load(size_t size, void *mem, void *return, int order)
519
523
// T __atomic_load_N(T *mem, int order)
@@ -526,31 +530,36 @@ RValue CodeGenFunction::EmitAtomicExpr(AtomicExpr *E, llvm::Value *Dest) {
526
530
case AtomicExpr::AO__c11_atomic_fetch_add:
527
531
case AtomicExpr::AO__atomic_fetch_add:
528
532
LibCallName = " __atomic_fetch_add" ;
529
- AddDirectArgument (*this , Args, UseOptimizedLibcall, Val1, MemTy);
533
+ AddDirectArgument (*this , Args, UseOptimizedLibcall, Val1, MemTy,
534
+ E->getExprLoc ());
530
535
break ;
531
536
// T __atomic_fetch_and_N(T *mem, T val, int order)
532
537
case AtomicExpr::AO__c11_atomic_fetch_and:
533
538
case AtomicExpr::AO__atomic_fetch_and:
534
539
LibCallName = " __atomic_fetch_and" ;
535
- AddDirectArgument (*this , Args, UseOptimizedLibcall, Val1, MemTy);
540
+ AddDirectArgument (*this , Args, UseOptimizedLibcall, Val1, MemTy,
541
+ E->getExprLoc ());
536
542
break ;
537
543
// T __atomic_fetch_or_N(T *mem, T val, int order)
538
544
case AtomicExpr::AO__c11_atomic_fetch_or:
539
545
case AtomicExpr::AO__atomic_fetch_or:
540
546
LibCallName = " __atomic_fetch_or" ;
541
- AddDirectArgument (*this , Args, UseOptimizedLibcall, Val1, MemTy);
547
+ AddDirectArgument (*this , Args, UseOptimizedLibcall, Val1, MemTy,
548
+ E->getExprLoc ());
542
549
break ;
543
550
// T __atomic_fetch_sub_N(T *mem, T val, int order)
544
551
case AtomicExpr::AO__c11_atomic_fetch_sub:
545
552
case AtomicExpr::AO__atomic_fetch_sub:
546
553
LibCallName = " __atomic_fetch_sub" ;
547
- AddDirectArgument (*this , Args, UseOptimizedLibcall, Val1, MemTy);
554
+ AddDirectArgument (*this , Args, UseOptimizedLibcall, Val1, MemTy,
555
+ E->getExprLoc ());
548
556
break ;
549
557
// T __atomic_fetch_xor_N(T *mem, T val, int order)
550
558
case AtomicExpr::AO__c11_atomic_fetch_xor:
551
559
case AtomicExpr::AO__atomic_fetch_xor:
552
560
LibCallName = " __atomic_fetch_xor" ;
553
- AddDirectArgument (*this , Args, UseOptimizedLibcall, Val1, MemTy);
561
+ AddDirectArgument (*this , Args, UseOptimizedLibcall, Val1, MemTy,
562
+ E->getExprLoc ());
554
563
break ;
555
564
default : return EmitUnsupportedRValue (E, " atomic library call" );
556
565
}
@@ -584,7 +593,7 @@ RValue CodeGenFunction::EmitAtomicExpr(AtomicExpr *E, llvm::Value *Dest) {
584
593
return Res;
585
594
if (E->getType ()->isVoidType ())
586
595
return RValue::get (0 );
587
- return convertTempToRValue (Dest, E->getType ());
596
+ return convertTempToRValue (Dest, E->getType (), E-> getExprLoc () );
588
597
}
589
598
590
599
bool IsStore = E->getOp () == AtomicExpr::AO__c11_atomic_store ||
@@ -639,7 +648,7 @@ RValue CodeGenFunction::EmitAtomicExpr(AtomicExpr *E, llvm::Value *Dest) {
639
648
}
640
649
if (E->getType ()->isVoidType ())
641
650
return RValue::get (0 );
642
- return convertTempToRValue (OrigDest, E->getType ());
651
+ return convertTempToRValue (OrigDest, E->getType (), E-> getExprLoc () );
643
652
}
644
653
645
654
// Long case, when Order isn't obviously constant.
@@ -701,7 +710,7 @@ RValue CodeGenFunction::EmitAtomicExpr(AtomicExpr *E, llvm::Value *Dest) {
701
710
Builder.SetInsertPoint (ContBB);
702
711
if (E->getType ()->isVoidType ())
703
712
return RValue::get (0 );
704
- return convertTempToRValue (OrigDest, E->getType ());
713
+ return convertTempToRValue (OrigDest, E->getType (), E-> getExprLoc () );
705
714
}
706
715
707
716
llvm::Value *AtomicInfo::emitCastToAtomicIntPointer (llvm::Value *addr) const {
@@ -713,7 +722,8 @@ llvm::Value *AtomicInfo::emitCastToAtomicIntPointer(llvm::Value *addr) const {
713
722
}
714
723
715
724
RValue AtomicInfo::convertTempToRValue (llvm::Value *addr,
716
- AggValueSlot resultSlot) const {
725
+ AggValueSlot resultSlot,
726
+ SourceLocation loc) const {
717
727
if (EvaluationKind == TEK_Aggregate)
718
728
return resultSlot.asRValue ();
719
729
@@ -723,12 +733,13 @@ RValue AtomicInfo::convertTempToRValue(llvm::Value *addr,
723
733
724
734
// Otherwise, just convert the temporary to an r-value using the
725
735
// normal conversion routine.
726
- return CGF.convertTempToRValue (addr, getValueType ());
736
+ return CGF.convertTempToRValue (addr, getValueType (), loc );
727
737
}
728
738
729
739
// / Emit a load from an l-value of atomic type. Note that the r-value
730
740
// / we produce is an r-value of the atomic *value* type.
731
- RValue CodeGenFunction::EmitAtomicLoad (LValue src, AggValueSlot resultSlot) {
741
+ RValue CodeGenFunction::EmitAtomicLoad (LValue src, SourceLocation loc,
742
+ AggValueSlot resultSlot) {
732
743
AtomicInfo atomics (*this , src);
733
744
734
745
// Check whether we should use a library call.
@@ -755,7 +766,7 @@ RValue CodeGenFunction::EmitAtomicLoad(LValue src, AggValueSlot resultSlot) {
755
766
emitAtomicLibcall (*this , " __atomic_load" , getContext ().VoidTy , args);
756
767
757
768
// Produce the r-value.
758
- return atomics.convertTempToRValue (tempAddr, resultSlot);
769
+ return atomics.convertTempToRValue (tempAddr, resultSlot, loc );
759
770
}
760
771
761
772
// Okay, we're doing this natively.
@@ -813,7 +824,7 @@ RValue CodeGenFunction::EmitAtomicLoad(LValue src, AggValueSlot resultSlot) {
813
824
Builder.CreateAlignedStore (result, castTemp, tempAlignment.getQuantity ())
814
825
->setVolatile (tempIsVolatile);
815
826
816
- return atomics.convertTempToRValue (temp, resultSlot);
827
+ return atomics.convertTempToRValue (temp, resultSlot, loc );
817
828
}
818
829
819
830
0 commit comments