check for correct usage of the byval attribute
authorRafael Espindola <rafael.espindola@gmail.com>
Tue, 10 Jul 2007 19:28:12 +0000 (19:28 +0000)
committerRafael Espindola <rafael.espindola@gmail.com>
Tue, 10 Jul 2007 19:28:12 +0000 (19:28 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@38506 91177308-0d34-0410-b5e6-96231b3b80d8

lib/VMCore/Verifier.cpp
test/Verifier/byval-1.ll [new file with mode: 0644]
test/Verifier/byval-2.ll [new file with mode: 0644]
test/Verifier/byval-3.ll [new file with mode: 0644]
test/Verifier/byval-4.ll [new file with mode: 0644]

index 16e87f4f7a176337cd205b6430652fceec9a2c8b..4e3a16e8ee9b93f5c45bd2ae1ba6f892d0665c10 100644 (file)
@@ -361,6 +361,10 @@ void Verifier::visitFunction(Function &F) {
 
   if (const ParamAttrsList *Attrs = FT->getParamAttrs()) {
     unsigned Idx = 1;
+
+    Assert(!Attrs->paramHasAttr(0, ParamAttr::ByVal),
+           "Attribute ByVal should not apply to functions!");
+
     for (FunctionType::param_iterator I = FT->param_begin(), 
          E = FT->param_end(); I != E; ++I, ++Idx) {
       if (Attrs->paramHasAttr(Idx, ParamAttr::ZExt) ||
@@ -370,9 +374,14 @@ void Verifier::visitFunction(Function &F) {
       if (Attrs->paramHasAttr(Idx, ParamAttr::NoAlias))
         Assert1(isa<PointerType>(FT->getParamType(Idx-1)),
                 "Attribute NoAlias should only apply to Pointer type!", &F);
-      if (Attrs->paramHasAttr(Idx, ParamAttr::ByVal))
+      if (Attrs->paramHasAttr(Idx, ParamAttr::ByVal)) {
         Assert1(isa<PointerType>(FT->getParamType(Idx-1)),
-                "Attribute ByVal should only apply to Pointer type!", &F);
+                "Attribute ByVal should only apply to pointer to structs!", &F);
+        const PointerType *Ty =
+            cast<PointerType>(FT->getParamType(Idx-1));
+        Assert1(isa<StructType>(Ty->getElementType()),
+                "Attribute ByVal should only apply to pointer to structs!", &F);
+      }
     }
   }
 
diff --git a/test/Verifier/byval-1.ll b/test/Verifier/byval-1.ll
new file mode 100644 (file)
index 0000000..cbae548
--- /dev/null
@@ -0,0 +1,2 @@
+; RUN: not llvm-as < %s -o /dev/null -f
+declare void @h(i32* byval %num)
diff --git a/test/Verifier/byval-2.ll b/test/Verifier/byval-2.ll
new file mode 100644 (file)
index 0000000..56b8a27
--- /dev/null
@@ -0,0 +1,2 @@
+; RUN: not llvm-as < %s -o /dev/null -f
+declare void @h(i32* %num) byval
diff --git a/test/Verifier/byval-3.ll b/test/Verifier/byval-3.ll
new file mode 100644 (file)
index 0000000..9c2cb98
--- /dev/null
@@ -0,0 +1,2 @@
+; RUN: not llvm-as < %s -o /dev/null -f
+declare void @h(i32 byval %num)
diff --git a/test/Verifier/byval-4.ll b/test/Verifier/byval-4.ll
new file mode 100644 (file)
index 0000000..ff733a5
--- /dev/null
@@ -0,0 +1,4 @@
+; RUN: llvm-as < %s -o /dev/null -f
+%struct.foo = type { i64 }
+
+declare void @h(%struct.foo* byval %num)