[cfe-commits] r71222 - in /cfe/branches/Apple/Dib: lib/Sema/SemaChecking.cpp test/CodeGen/atomic.c test/Sema/builtins.c

Mike Stump mrs at apple.com
Fri May 8 08:41:35 PDT 2009


Author: mrs
Date: Fri May  8 10:41:34 2009
New Revision: 71222

URL: http://llvm.org/viewvc/llvm-project?rev=71222&view=rev
Log:
Merge in 71218:

Fix the atomics sema code to convert operands to the argument types
of the underlying _N builtin, not the the type of the pointee of the
actual type.  This ensures that atomics involving pointers end up
using the correct integer type when they are resolved, avoiding
aborts in codegen.

Modified:
    cfe/branches/Apple/Dib/lib/Sema/SemaChecking.cpp
    cfe/branches/Apple/Dib/test/CodeGen/atomic.c
    cfe/branches/Apple/Dib/test/Sema/builtins.c

Modified: cfe/branches/Apple/Dib/lib/Sema/SemaChecking.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/branches/Apple/Dib/lib/Sema/SemaChecking.cpp?rev=71222&r1=71221&r2=71222&view=diff

==============================================================================
--- cfe/branches/Apple/Dib/lib/Sema/SemaChecking.cpp (original)
+++ cfe/branches/Apple/Dib/lib/Sema/SemaChecking.cpp Fri May  8 10:41:34 2009
@@ -293,6 +293,25 @@
     return Diag(TheCall->getLocEnd(), diag::err_typecheck_call_too_few_args)
             << 0 << TheCall->getCallee()->getSourceRange();
   
+  
+  // Get the decl for the concrete builtin from this, we can tell what the
+  // concrete integer type we should convert to is.
+  unsigned NewBuiltinID = BuiltinIndices[BuiltinIndex][SizeIndex];
+  const char *NewBuiltinName = Context.BuiltinInfo.GetName(NewBuiltinID);
+  IdentifierInfo *NewBuiltinII = PP.getIdentifierInfo(NewBuiltinName);
+  FunctionDecl *NewBuiltinDecl = 
+    cast<FunctionDecl>(LazilyCreateBuiltin(NewBuiltinII, NewBuiltinID,
+                                           TUScope, false, DRE->getLocStart()));
+  const FunctionProtoType *BuiltinFT =
+    NewBuiltinDecl->getType()->getAsFunctionProtoType();
+  ValType = BuiltinFT->getArgType(0)->getAsPointerType()->getPointeeType();
+  
+  // If the first type needs to be converted (e.g. void** -> int*), do it now.
+  if (BuiltinFT->getArgType(0) != FirstArg->getType()) {
+    ImpCastExprToType(FirstArg, BuiltinFT->getArgType(0), false);
+    TheCall->setArg(0, FirstArg);
+  }
+  
   // Next, walk the valid ones promoting to the right type.
   for (unsigned i = 0; i != NumFixed; ++i) {
     Expr *Arg = TheCall->getArg(i+1);
@@ -321,14 +340,6 @@
     TheCall->setArg(i+1, Arg);
   }
   
-  // Okay, if we get here, everything is good.  Get the decl for the concrete
-  // builtin.
-  unsigned NewBuiltinID = BuiltinIndices[BuiltinIndex][SizeIndex];
-  const char *NewBuiltinName = Context.BuiltinInfo.GetName(NewBuiltinID);
-  IdentifierInfo *NewBuiltinII = PP.getIdentifierInfo(NewBuiltinName);
-  FunctionDecl *NewBuiltinDecl = 
-    cast<FunctionDecl>(LazilyCreateBuiltin(NewBuiltinII, NewBuiltinID,
-                                           TUScope, false, DRE->getLocStart()));
   // Switch the DeclRefExpr to refer to the new decl.
   DRE->setDecl(NewBuiltinDecl);
   DRE->setType(NewBuiltinDecl->getType());

Modified: cfe/branches/Apple/Dib/test/CodeGen/atomic.c
URL: http://llvm.org/viewvc/llvm-project/cfe/branches/Apple/Dib/test/CodeGen/atomic.c?rev=71222&r1=71221&r2=71222&view=diff

==============================================================================
--- cfe/branches/Apple/Dib/test/CodeGen/atomic.c (original)
+++ cfe/branches/Apple/Dib/test/CodeGen/atomic.c Fri May  8 10:41:34 2009
@@ -6,7 +6,7 @@
 // RUN: grep @llvm.atomic.load.umin.i32 %t1 &&
 // RUN: grep @llvm.atomic.load.umax.i32 %t1 &&
 // RUN: grep @llvm.atomic.swap.i32 %t1 &&
-// RUN: grep @llvm.atomic.cmp.swap.i32 %t1 | count 3 &&
+// RUN: grep @llvm.atomic.cmp.swap.i32 %t1 | count 4 &&
 // RUN: grep @llvm.atomic.load.and.i32 %t1 | count 2 &&
 // RUN: grep @llvm.atomic.load.or.i8 %t1  &&
 // RUN: grep @llvm.atomic.load.xor.i8 %t1
@@ -40,5 +40,8 @@
   old = __sync_or_and_fetch(&valc, 4);
   old = __sync_xor_and_fetch(&valc, 5);
 
+  
+  __sync_val_compare_and_swap((void **)0, (void *)0, (void *)0);
+
   return old;
 }

Modified: cfe/branches/Apple/Dib/test/Sema/builtins.c
URL: http://llvm.org/viewvc/llvm-project/cfe/branches/Apple/Dib/test/Sema/builtins.c?rev=71222&r1=71221&r2=71222&view=diff

==============================================================================
--- cfe/branches/Apple/Dib/test/Sema/builtins.c (original)
+++ cfe/branches/Apple/Dib/test/Sema/builtins.c Fri May  8 10:41:34 2009
@@ -48,5 +48,5 @@
   
   old = __sync_fetch_and_add();  // expected-error {{too few arguments to function call}}
   old = __sync_fetch_and_add(&old);  // expected-error {{too few arguments to function call}}
-  old = __sync_fetch_and_add((int**)0, 42i); // expected-error {{operand of type '_Complex int' cannot be cast to a pointer type}} expected-warning {{imaginary constants are an extension}}
+  old = __sync_fetch_and_add((int**)0, 42i); // expected-warning {{imaginary constants are an extension}}
 }





More information about the cfe-commits mailing list