[PATCH] Use dereferencable attribute in Clang for C++ references

hfinkel at anl.gov hfinkel at anl.gov
Thu Jul 10 14:15:03 PDT 2014


Updated for changes in the LLVM patch (in response to Nick's review).

There also need to be a lot of regression-test updates (not yet included here).

http://reviews.llvm.org/D4450

Files:
  lib/CodeGen/CGCall.cpp

Index: lib/CodeGen/CGCall.cpp
===================================================================
--- lib/CodeGen/CGCall.cpp
+++ lib/CodeGen/CGCall.cpp
@@ -1200,8 +1200,16 @@
     llvm_unreachable("Invalid ABI kind for return argument");
   }
 
-  if (RetTy->isReferenceType())
+  if (RetTy->isReferenceType()) {
+    QualType PTy = RetTy->getAs<ReferenceType>()->getPointeeType();
+    if (PTy->isConstantSizeType()) {
+      unsigned Bytes =
+        std::min(4095u, (unsigned) getContext().getTypeSize(PTy)/8);
+      RetAttrs.addDereferencableAttr(Bytes);
+    }
+
     RetAttrs.addAttribute(llvm::Attribute::NonNull);
+  }
 
   if (RetAttrs.hasAttributes())
     PAL.push_back(llvm::
@@ -1291,8 +1299,16 @@
     }
     }
 
-    if (ParamType->isReferenceType())
+    if (ParamType->isReferenceType()) {
+      QualType PTy = ParamType->getAs<ReferenceType>()->getPointeeType();
+      if (PTy->isConstantSizeType()) {
+        unsigned Bytes =
+          std::min(4095u, (unsigned) getContext().getTypeSize(PTy)/8);
+        Attrs.addDereferencableAttr(Bytes);
+      }
+
       Attrs.addAttribute(llvm::Attribute::NonNull);
+    }
 
     if (Attrs.hasAttributes())
       PAL.push_back(llvm::AttributeSet::get(getLLVMContext(), Index, Attrs));
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D4450.11294.patch
Type: text/x-patch
Size: 1250 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20140710/386c870f/attachment.bin>


More information about the cfe-commits mailing list