Prep for future __builtin_object_size refinements. The theory is that

someone will add an llvm intrinsic for us to use, so the optimizer can
figure out the hard cases.  WIP.

For those that want to help, double check with Eric before starting.
He has a bit of code this will plug into.

llvm-svn: 85175
This commit is contained in:
Mike Stump 2009-10-26 23:39:48 +00:00
parent 5183a14bfb
commit 7a484dd6a9
1 changed files with 11 additions and 0 deletions

View File

@ -199,6 +199,16 @@ RValue CodeGenFunction::EmitBuiltinExpr(const FunctionDecl *FD,
return RValue::get(Builder.CreateCall(F, ArgValue, "tmp"));
}
case Builtin::BI__builtin_object_size: {
// FIXME: We're awaiting the llvm intrincis.
#if 0
// We pass this builtin onto the optimizer so that it can
// figure out the object size in more complex cases.
Value *F = CGM.getIntrinsic(Intrinsic::objectsize, 0, 0);
Builder.CreateCall2(F,
EmitScalarExpr(E->getArg(0)));
EmitScalarExpr(E->getArg(1)));
return RValue::get(Address);
#else
// FIXME: Implement. For now we just always fail and pretend we
// don't know the object size.
llvm::APSInt TypeArg = E->getArg(1)->EvaluateAsInt(CGM.getContext());
@ -207,6 +217,7 @@ RValue CodeGenFunction::EmitBuiltinExpr(const FunctionDecl *FD,
bool UseMinimum = TypeArg.getZExtValue() & 2;
return RValue::get(
llvm::ConstantInt::get(ResType, UseMinimum ? 0 : -1LL));
#endif
}
case Builtin::BI__builtin_prefetch: {
Value *Locality, *RW, *Address = EmitScalarExpr(E->getArg(0));