Commit 896c94f2 authored by Hans Wennborg's avatar Hans Wennborg
Browse files

Merging r243206:

------------------------------------------------------------------------
r243206 | majnemer | 2015-07-24 22:57:24 -0700 (Fri, 24 Jul 2015) | 10 lines

[CodeGen] Don't UBSan-ize the argument to __builtin_frame_address

__builtin_frame_address requires its argument to be a constant
expression which already implies that it cannot have undefined behavior.
However, we used EmitScalarExpr to emit the argument causing UBSan to
try to check for overflow.

Instead, use the constant expression emission system.

This fixes PR24256.
------------------------------------------------------------------------

llvm-svn: 243653
parent db9a51ac
Loading
Loading
Loading
Loading
+4 −4
Original line number Diff line number Diff line
@@ -866,14 +866,14 @@ RValue CodeGenFunction::EmitBuiltinExpr(const FunctionDecl *FD,
                                      llvm::ConstantInt::get(Int32Ty, Offset)));
  }
  case Builtin::BI__builtin_return_address: {
    Value *Depth = EmitScalarExpr(E->getArg(0));
    Depth = Builder.CreateIntCast(Depth, Int32Ty, false);
    Value *Depth =
        CGM.EmitConstantExpr(E->getArg(0), getContext().UnsignedIntTy, this);
    Value *F = CGM.getIntrinsic(Intrinsic::returnaddress);
    return RValue::get(Builder.CreateCall(F, Depth));
  }
  case Builtin::BI__builtin_frame_address: {
    Value *Depth = EmitScalarExpr(E->getArg(0));
    Depth = Builder.CreateIntCast(Depth, Int32Ty, false);
    Value *Depth =
        CGM.EmitConstantExpr(E->getArg(0), getContext().UnsignedIntTy, this);
    Value *F = CGM.getIntrinsic(Intrinsic::frameaddress);
    return RValue::get(Builder.CreateCall(F, Depth));
  }
+7 −0
Original line number Diff line number Diff line
@@ -72,4 +72,11 @@ void test1() {
  // TRAPV: add i8 {{.*}}, 1
  // CATCH_UB: add i8 {{.*}}, 1
  ++PR9350;

  // PR24256: don't instrument __builtin_frame_address.
  __builtin_frame_address(0 + 0);
  // DEFAULT:  call i8* @llvm.frameaddress(i32 0)
  // WRAPV:    call i8* @llvm.frameaddress(i32 0)
  // TRAPV:    call i8* @llvm.frameaddress(i32 0)
  // CATCH_UB: call i8* @llvm.frameaddress(i32 0)
}