r212835 - Add nonnull in CodeGen for __attribute__((nonnull))
Hal Finkel
hfinkel at anl.gov
Fri Jul 11 10:35:22 PDT 2014
Author: hfinkel
Date: Fri Jul 11 12:35:21 2014
New Revision: 212835
URL: http://llvm.org/viewvc/llvm-project?rev=212835&view=rev
Log:
Add nonnull in CodeGen for __attribute__((nonnull))
We now have an LLVM-level nonnull attribute that can be applied to function
parameters, and we emit it for reference types (as of r209723), but did not
emit it when an __attribute__((nonnull)) was provided. Now we will.
Added:
cfe/trunk/test/CodeGen/nonnull.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=212835&r1=212834&r2=212835&view=diff
==============================================================================
--- cfe/trunk/lib/CodeGen/CGCall.cpp (original)
+++ cfe/trunk/lib/CodeGen/CGCall.cpp Fri Jul 11 12:35:21 2014
@@ -1381,6 +1381,10 @@ void CodeGenFunction::EmitFunctionProlog
++AI; // Skip the sret parameter.
}
+ // Get the function-level nonnull attribute if it exists.
+ const NonNullAttr *NNAtt =
+ CurCodeDecl ? CurCodeDecl->getAttr<NonNullAttr>() : nullptr;
+
// Track if we received the parameter as a pointer (indirect, byval, or
// inalloca). If already have a pointer, EmitParmDecl doesn't need to copy it
// into a local alloca for us.
@@ -1468,6 +1472,13 @@ void CodeGenFunction::EmitFunctionProlog
assert(AI != Fn->arg_end() && "Argument mismatch!");
llvm::Value *V = AI;
+ if (const ParmVarDecl *PVD = dyn_cast<ParmVarDecl>(Arg))
+ if ((NNAtt && NNAtt->isNonNull(PVD->getFunctionScopeIndex())) ||
+ PVD->hasAttr<NonNullAttr>())
+ AI->addAttr(llvm::AttributeSet::get(getLLVMContext(),
+ AI->getArgNo() + 1,
+ llvm::Attribute::NonNull));
+
if (Arg->getType().isRestrictQualified())
AI->addAttr(llvm::AttributeSet::get(getLLVMContext(),
AI->getArgNo() + 1,
Added: cfe/trunk/test/CodeGen/nonnull.c
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/nonnull.c?rev=212835&view=auto
==============================================================================
--- cfe/trunk/test/CodeGen/nonnull.c (added)
+++ cfe/trunk/test/CodeGen/nonnull.c Fri Jul 11 12:35:21 2014
@@ -0,0 +1,17 @@
+// RUN: %clang_cc1 -triple x86_64-apple-darwin -emit-llvm < %s | FileCheck %s
+
+// CHECK: define void @foo(i32* nonnull %x)
+void foo(int * __attribute__((nonnull)) x) {
+ *x = 0;
+}
+
+// CHECK: define void @bar(i32* nonnull %x)
+void bar(int * x) __attribute__((nonnull(1))) {
+ *x = 0;
+}
+
+// CHECK: define void @bar2(i32* %x, i32* nonnull %y)
+void bar2(int * x, int * y) __attribute__((nonnull(2))) {
+ *x = 0;
+}
+
More information about the cfe-commits
mailing list