summaryrefslogtreecommitdiffstats
path: root/clang/lib
diff options
context:
space:
mode:
authorJohn McCall <rjmccall@apple.com>2010-03-27 00:47:27 +0000
committerJohn McCall <rjmccall@apple.com>2010-03-27 00:47:27 +0000
commit39ec71f2e91518e0e9f3afee29c6ef170714da5c (patch)
tree07c985eeb7dc07580e39e9182a8453838ad3afd6 /clang/lib
parentc5e20d9031a7585ad8263f566670c86c778a940a (diff)
downloadbcm5719-llvm-39ec71f2e91518e0e9f3afee29c6ef170714da5c.tar.gz
bcm5719-llvm-39ec71f2e91518e0e9f3afee29c6ef170714da5c.zip
When mapping restrict to noalias, look for 'restrict' on the parameter variable
instead of the canonical parameter type (which has correctly dropped all such direct qualifiers). Fixes PR6695. llvm-svn: 99688
Diffstat (limited to 'clang/lib')
-rw-r--r--clang/lib/CodeGen/CGCall.cpp8
1 files changed, 6 insertions, 2 deletions
diff --git a/clang/lib/CodeGen/CGCall.cpp b/clang/lib/CodeGen/CGCall.cpp
index 072b1f6585f..dcd0beab10f 100644
--- a/clang/lib/CodeGen/CGCall.cpp
+++ b/clang/lib/CodeGen/CGCall.cpp
@@ -623,8 +623,9 @@ void CodeGenModule::ConstructAttributeList(const CGFunctionInfo &FI,
const ABIArgInfo &AI = it->info;
unsigned Attributes = 0;
- if (ParamType.isRestrictQualified())
- Attributes |= llvm::Attribute::NoAlias;
+ // 'restrict' -> 'noalias' is done in EmitFunctionProlog when we
+ // have the corresponding parameter variable. It doesn't make
+ // sense to do it here because parameters are so fucked up.
switch (AI.getKind()) {
case ABIArgInfo::Coerce:
@@ -749,6 +750,9 @@ void CodeGenFunction::EmitFunctionProlog(const CGFunctionInfo &FI,
V = CreateMemTemp(Ty);
Builder.CreateStore(AI, V);
} else {
+ if (Arg->getType().isRestrictQualified())
+ AI->addAttr(llvm::Attribute::NoAlias);
+
if (!getContext().typesAreCompatible(Ty, Arg->getType())) {
// This must be a promotion, for something like
// "void a(x) short x; {..."
OpenPOWER on IntegriCloud