[cfe-commits] r67224 - in /cfe/trunk: lib/CodeGen/CGCall.cpp test/CodeGen/struct-passing.c

Daniel Dunbar daniel at zuster.org
Wed Mar 18 12:51:02 PDT 2009


Author: ddunbar
Date: Wed Mar 18 14:51:01 2009
New Revision: 67224

URL: http://llvm.org/viewvc/llvm-project?rev=67224&view=rev
Log:
PR3835: Interaction with ABI structure passing can inhibit
readnone/readonly attributes.

Added:
    cfe/trunk/test/CodeGen/struct-passing.c
Modified:
    cfe/trunk/lib/CodeGen/CGCall.cpp

Modified: cfe/trunk/lib/CodeGen/CGCall.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGCall.cpp?rev=67224&r1=67223&r2=67224&view=diff

==============================================================================
--- cfe/trunk/lib/CodeGen/CGCall.cpp (original)
+++ cfe/trunk/lib/CodeGen/CGCall.cpp Wed Mar 18 14:51:01 2009
@@ -1467,6 +1467,9 @@
                                                 llvm::Attribute::StructRet |
                                                 llvm::Attribute::NoAlias));
     ++Index;
+    // sret disables readnone and readonly
+    FuncAttrs &= ~(llvm::Attribute::ReadOnly |
+                   llvm::Attribute::ReadNone);
     break;
 
   case ABIArgInfo::Ignore:
@@ -1493,6 +1496,9 @@
       Attributes |= llvm::Attribute::ByVal;
       Attributes |= 
         llvm::Attribute::constructAlignmentFromInt(AI.getIndirectAlign());
+      // byval disables readnone and readonly.
+      FuncAttrs &= ~(llvm::Attribute::ReadOnly |
+                     llvm::Attribute::ReadNone);
       break;
       
     case ABIArgInfo::Direct:

Added: cfe/trunk/test/CodeGen/struct-passing.c
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/struct-passing.c?rev=67224&view=auto

==============================================================================
--- cfe/trunk/test/CodeGen/struct-passing.c (added)
+++ cfe/trunk/test/CodeGen/struct-passing.c Wed Mar 18 14:51:01 2009
@@ -0,0 +1,21 @@
+// RUN: clang -triple i386-pc-linux-gnu -emit-llvm -o %t %s &&
+// RUN: grep 'declare i32 @f0() readnone$' %t &&
+// RUN: grep 'declare i32 @f1() readonly$' %t &&
+// RUN: grep 'declare void @f2(.* noalias sret)$' %t &&
+// RUN: grep 'declare void @f3(.* noalias sret)$' %t &&
+// RUN: grep 'declare void @f4(.* byval)$' %t &&
+// RUN: grep 'declare void @f5(.* byval)$' %t &&
+// RUN: true
+// PR3835
+
+typedef int T0;
+typedef struct { int a[16]; } T1;
+
+T0 __attribute__((const)) f0(void);
+T0 __attribute__((pure)) f1(void);
+T1 __attribute__((const)) f2(void);
+T1 __attribute__((pure)) f3(void);
+void __attribute__((const)) f4(T1 a);
+void __attribute__((pure)) f5(T1 a);
+
+void *ps[] = { f0, f1, f2, f3, f4, f5 };





More information about the cfe-commits mailing list