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:
commit
cf71f1c7b0
1 changed files with 9 additions and 3 deletions
|
@ -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);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue