1
Fork 0

auto merge of #16525 : thestinger/rust/readonly, r=pcwalton

These are already marked as `noalias` due to the immutability guarantee
(see 4c2d4cd3de), but more information can
be bubbled up to the caller via `readonly`.
This commit is contained in:
bors 2014-08-16 11:21:11 +00:00
commit cf71f1c7b0

View file

@ -2278,7 +2278,7 @@ pub fn get_fn_llvm_attributes(ccx: &CrateContext, fn_ty: ty::t)
match ty::get(ret_ty).sty { match ty::get(ret_ty).sty {
// `~` pointer return values never alias because ownership // `~` pointer return values never alias because ownership
// is transferred // is transferred
ty::ty_uniq(it) if match ty::get(it).sty { ty::ty_uniq(it) if match ty::get(it).sty {
ty::ty_str | ty::ty_vec(..) | ty::ty_trait(..) => true, _ => false ty::ty_str | ty::ty_vec(..) | ty::ty_trait(..) => true, _ => false
} => {} } => {}
ty::ty_uniq(_) => { ty::ty_uniq(_) => {
@ -2354,8 +2354,10 @@ pub fn get_fn_llvm_attributes(ccx: &CrateContext, fn_ty: ty::t)
} }
// `&mut` pointer parameters never alias other parameters, or mutable global data // `&mut` pointer parameters never alias other parameters, or mutable global data
// `&` pointer parameters never alias either (for LLVM's purposes) as long as the //
// interior is safe // `&T` where `T` contains no `UnsafeCell<U>` is immutable, and can be marked as both
// `readonly` and `noalias`, as LLVM's definition of `noalias` is based solely on
// memory dependencies rather than pointer equality
ty::ty_rptr(b, mt) if mt.mutbl == ast::MutMutable || ty::ty_rptr(b, mt) if mt.mutbl == ast::MutMutable ||
!ty::type_contents(ccx.tcx(), mt.ty).interior_unsafe() => { !ty::type_contents(ccx.tcx(), mt.ty).interior_unsafe() => {
@ -2363,6 +2365,10 @@ pub fn get_fn_llvm_attributes(ccx: &CrateContext, fn_ty: ty::t)
attrs.arg(idx, llvm::NoAliasAttribute) attrs.arg(idx, llvm::NoAliasAttribute)
.arg(idx, llvm::DereferenceableAttribute(llsz)); .arg(idx, llvm::DereferenceableAttribute(llsz));
if mt.mutbl == ast::MutImmutable {
attrs.arg(idx, llvm::ReadOnlyAttribute);
}
match b { match b {
ReLateBound(_, BrAnon(_)) => { ReLateBound(_, BrAnon(_)) => {
attrs.arg(idx, llvm::NoCaptureAttribute); attrs.arg(idx, llvm::NoCaptureAttribute);