Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 15 Jul 2010 17:07:12 +0000 (UTC)
From:      Roman Divacky <rdivacky@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-vendor@freebsd.org
Subject:   svn commit: r210128 - in vendor/clang/dist: include/clang/AST include/clang/Basic include/clang/Driver include/clang/Frontend include/clang/Rewrite lib/AST lib/Basic lib/Checker lib/CodeGen lib/Dri...
Message-ID:  <201007151707.o6FH7CBW047818@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: rdivacky
Date: Thu Jul 15 17:07:12 2010
New Revision: 210128
URL: http://svn.freebsd.org/changeset/base/210128

Log:
  Update clang to r108428.

Added:
  vendor/clang/dist/include/clang/Frontend/PCHDeserializationListener.h
  vendor/clang/dist/runtime/
  vendor/clang/dist/runtime/Makefile
  vendor/clang/dist/test/CodeCompletion/Inputs/reserved.h
  vendor/clang/dist/test/CodeGenCXX/lvalue-bitcasts.cpp
  vendor/clang/dist/test/CodeGenCXX/member-qual-debug-info.cpp
  vendor/clang/dist/test/PCH/pchpch.c
  vendor/clang/dist/test/PCH/pchpch1.h
  vendor/clang/dist/test/PCH/pchpch2.h
  vendor/clang/dist/test/SemaCXX/cv-unqual-rvalues.cpp
  vendor/clang/dist/test/SemaTemplate/deduction-crash.cpp
Modified:
  vendor/clang/dist/include/clang/AST/DeclBase.h
  vendor/clang/dist/include/clang/AST/DeclObjC.h
  vendor/clang/dist/include/clang/AST/Expr.h
  vendor/clang/dist/include/clang/AST/Type.h
  vendor/clang/dist/include/clang/Basic/Builtins.def
  vendor/clang/dist/include/clang/Basic/DiagnosticGroups.td
  vendor/clang/dist/include/clang/Basic/DiagnosticSemaKinds.td
  vendor/clang/dist/include/clang/Basic/FileManager.h
  vendor/clang/dist/include/clang/Basic/TargetInfo.h
  vendor/clang/dist/include/clang/Driver/ArgList.h
  vendor/clang/dist/include/clang/Driver/Driver.h
  vendor/clang/dist/include/clang/Driver/Options.td
  vendor/clang/dist/include/clang/Driver/ToolChain.h
  vendor/clang/dist/include/clang/Driver/Types.def
  vendor/clang/dist/include/clang/Frontend/ASTConsumers.h
  vendor/clang/dist/include/clang/Frontend/PCHReader.h
  vendor/clang/dist/include/clang/Frontend/PCHWriter.h
  vendor/clang/dist/include/clang/Rewrite/Rewriter.h
  vendor/clang/dist/lib/AST/DeclTemplate.cpp
  vendor/clang/dist/lib/AST/Expr.cpp
  vendor/clang/dist/lib/AST/ExprConstant.cpp
  vendor/clang/dist/lib/AST/Type.cpp
  vendor/clang/dist/lib/Basic/FileManager.cpp
  vendor/clang/dist/lib/Basic/TargetInfo.cpp
  vendor/clang/dist/lib/Basic/Targets.cpp
  vendor/clang/dist/lib/Checker/GRExprEngine.cpp
  vendor/clang/dist/lib/Checker/LLVMConventionsChecker.cpp
  vendor/clang/dist/lib/CodeGen/CGBlocks.cpp
  vendor/clang/dist/lib/CodeGen/CGCall.cpp
  vendor/clang/dist/lib/CodeGen/CGClass.cpp
  vendor/clang/dist/lib/CodeGen/CGDebugInfo.cpp
  vendor/clang/dist/lib/CodeGen/CGDecl.cpp
  vendor/clang/dist/lib/CodeGen/CGException.cpp
  vendor/clang/dist/lib/CodeGen/CGException.h
  vendor/clang/dist/lib/CodeGen/CGExpr.cpp
  vendor/clang/dist/lib/CodeGen/CGExprAgg.cpp
  vendor/clang/dist/lib/CodeGen/CGExprComplex.cpp
  vendor/clang/dist/lib/CodeGen/CGExprScalar.cpp
  vendor/clang/dist/lib/CodeGen/CGObjCGNU.cpp
  vendor/clang/dist/lib/CodeGen/CGObjCMac.cpp
  vendor/clang/dist/lib/CodeGen/CodeGenFunction.cpp
  vendor/clang/dist/lib/CodeGen/CodeGenFunction.h
  vendor/clang/dist/lib/CodeGen/CodeGenModule.h
  vendor/clang/dist/lib/CodeGen/Mangle.cpp
  vendor/clang/dist/lib/CodeGen/TargetInfo.cpp
  vendor/clang/dist/lib/Driver/ArgList.cpp
  vendor/clang/dist/lib/Driver/Driver.cpp
  vendor/clang/dist/lib/Driver/ToolChain.cpp
  vendor/clang/dist/lib/Driver/ToolChains.cpp
  vendor/clang/dist/lib/Driver/Tools.cpp
  vendor/clang/dist/lib/Frontend/ASTUnit.cpp
  vendor/clang/dist/lib/Frontend/FrontendActions.cpp
  vendor/clang/dist/lib/Frontend/GeneratePCH.cpp
  vendor/clang/dist/lib/Frontend/PCHReader.cpp
  vendor/clang/dist/lib/Frontend/PCHWriter.cpp
  vendor/clang/dist/lib/Rewrite/Rewriter.cpp
  vendor/clang/dist/lib/Sema/Sema.h
  vendor/clang/dist/lib/Sema/SemaCXXCast.cpp
  vendor/clang/dist/lib/Sema/SemaCodeComplete.cpp
  vendor/clang/dist/lib/Sema/SemaDecl.cpp
  vendor/clang/dist/lib/Sema/SemaExpr.cpp
  vendor/clang/dist/lib/Sema/SemaExprCXX.cpp
  vendor/clang/dist/lib/Sema/SemaInit.cpp
  vendor/clang/dist/lib/Sema/SemaObjCProperty.cpp
  vendor/clang/dist/lib/Sema/SemaOverload.cpp
  vendor/clang/dist/lib/Sema/SemaTemplate.cpp
  vendor/clang/dist/lib/Sema/SemaTemplateInstantiate.cpp
  vendor/clang/dist/lib/Sema/TreeTransform.h
  vendor/clang/dist/test/CXX/temp/temp.fct.spec/temp.arg.explicit/p3.cpp
  vendor/clang/dist/test/CodeCompletion/ordinary-name.c
  vendor/clang/dist/test/CodeGenCXX/condition.cpp
  vendor/clang/dist/test/CodeGenCXX/eh.cpp
  vendor/clang/dist/test/CodeGenCXX/instantiate-blocks.cpp
  vendor/clang/dist/test/CodeGenCXX/mangle.cpp
  vendor/clang/dist/test/CodeGenCXX/nrvo.cpp
  vendor/clang/dist/test/CodeGenCXX/static-init-2.cpp
  vendor/clang/dist/test/CodeGenObjC/metadata_symbols.m
  vendor/clang/dist/test/CodeGenObjC/unwind-fn.m
  vendor/clang/dist/test/Driver/darwin-iphone-defaults.m
  vendor/clang/dist/test/Driver/darwin-ld.c
  vendor/clang/dist/test/Frontend/darwin-version.c
  vendor/clang/dist/test/Index/c-index-api-loadTU-test.m
  vendor/clang/dist/test/Makefile
  vendor/clang/dist/test/Sema/block-call.c
  vendor/clang/dist/test/Sema/block-return.c
  vendor/clang/dist/test/Sema/exprs.c
  vendor/clang/dist/test/Sema/i-c-e.c
  vendor/clang/dist/test/Sema/return.c
  vendor/clang/dist/test/Sema/struct-cast.c
  vendor/clang/dist/test/Sema/switch.c
  vendor/clang/dist/test/SemaCXX/ambig-user-defined-conversions.cpp
  vendor/clang/dist/test/SemaCXX/bool.cpp
  vendor/clang/dist/test/SemaCXX/conditional-expr.cpp
  vendor/clang/dist/test/SemaCXX/friend.cpp
  vendor/clang/dist/test/SemaCXX/return.cpp
  vendor/clang/dist/test/SemaCXX/switch.cpp
  vendor/clang/dist/test/SemaObjC/default-synthesize.m
  vendor/clang/dist/test/SemaObjC/method-sentinel-attr.m
  vendor/clang/dist/test/SemaObjC/property-10.m
  vendor/clang/dist/test/SemaTemplate/deduction.cpp
  vendor/clang/dist/utils/TestUtils/pch-test.pl

Modified: vendor/clang/dist/include/clang/AST/DeclBase.h
==============================================================================
--- vendor/clang/dist/include/clang/AST/DeclBase.h	Thu Jul 15 17:06:11 2010	(r210127)
+++ vendor/clang/dist/include/clang/AST/DeclBase.h	Thu Jul 15 17:07:12 2010	(r210128)
@@ -92,7 +92,7 @@ public:
   /// These are meant as bitmasks, so that searches in
   /// C++ can look into the "tag" namespace during ordinary lookup.
   ///
-  /// Decl currently provides 16 bits of IDNS bits.
+  /// Decl currently provides 15 bits of IDNS bits.
   enum IdentifierNamespace {
     /// Labels, declared with 'x:' and referenced with 'goto x'.
     IDNS_Label               = 0x0001,
@@ -225,10 +225,10 @@ protected:
   
   // PCHLevel - the "level" of precompiled header/AST file from which this
   // declaration was built.
-  unsigned PCHLevel : 2;
+  unsigned PCHLevel : 3;
   
   /// IdentifierNamespace - This specifies what IDNS_* namespace this lives in.
-  unsigned IdentifierNamespace : 16;
+  unsigned IdentifierNamespace : 15;
 
 private:
 #ifndef NDEBUG
@@ -358,14 +358,14 @@ public:
   unsigned getPCHLevel() const { return PCHLevel; }
 
   /// \brief The maximum PCH level that any declaration may have.
-  static const unsigned MaxPCHLevel = 3;
-  
+  static const unsigned MaxPCHLevel = 7;
+
   /// \brief Set the PCH level of this declaration.
   void setPCHLevel(unsigned Level) { 
-    assert(Level < MaxPCHLevel && "PCH level exceeds the maximum");
+    assert(Level <= MaxPCHLevel && "PCH level exceeds the maximum");
     PCHLevel = Level;
   }
-  
+
   unsigned getIdentifierNamespace() const {
     return IdentifierNamespace;
   }

Modified: vendor/clang/dist/include/clang/AST/DeclObjC.h
==============================================================================
--- vendor/clang/dist/include/clang/AST/DeclObjC.h	Thu Jul 15 17:06:11 2010	(r210127)
+++ vendor/clang/dist/include/clang/AST/DeclObjC.h	Thu Jul 15 17:07:12 2010	(r210128)
@@ -242,7 +242,7 @@ public:
   /// \brief Determine the type of an expression that sends a message to this 
   /// function.
   QualType getSendResultType() const {
-    return getResultType().getCallResultType(getASTContext());
+    return getResultType().getNonLValueExprType(getASTContext());
   }
   
   TypeSourceInfo *getResultTypeSourceInfo() const { return ResultTInfo; }

Modified: vendor/clang/dist/include/clang/AST/Expr.h
==============================================================================
--- vendor/clang/dist/include/clang/AST/Expr.h	Thu Jul 15 17:06:11 2010	(r210127)
+++ vendor/clang/dist/include/clang/AST/Expr.h	Thu Jul 15 17:07:12 2010	(r210128)
@@ -1854,6 +1854,10 @@ public:
     /// CK_BitCast - Used for reinterpret_cast.
     CK_BitCast,
 
+    /// CK_LValueBitCast - Used for reinterpret_cast of expressions to
+    /// a reference type.
+    CK_LValueBitCast,
+    
     /// CK_NoOp - Used for const_cast.
     CK_NoOp,
 
@@ -1957,6 +1961,7 @@ private:
     // These should not have an inheritance path.
     case CK_Unknown:
     case CK_BitCast:
+    case CK_LValueBitCast:
     case CK_NoOp:
     case CK_Dynamic:
     case CK_ToUnion:

Modified: vendor/clang/dist/include/clang/AST/Type.h
==============================================================================
--- vendor/clang/dist/include/clang/AST/Type.h	Thu Jul 15 17:06:11 2010	(r210127)
+++ vendor/clang/dist/include/clang/AST/Type.h	Thu Jul 15 17:07:12 2010	(r210128)
@@ -629,13 +629,15 @@ public:
   bool isAtLeastAsQualifiedAs(QualType Other) const;
   QualType getNonReferenceType() const;
 
-  /// \brief Determine the type of an expression that calls a function of
-  /// with the given result type.
+  /// \brief Determine the type of a (typically non-lvalue) expression with the
+  /// specified result type.
   ///                       
-  /// This routine removes a top-level reference (since there are no 
+  /// This routine should be used for expressions for which the return type is
+  /// explicitly specified (e.g., in a cast or call) and isn't necessarily
+  /// an lvalue. It removes a top-level reference (since there are no 
   /// expressions of reference type) and deletes top-level cvr-qualifiers
   /// from non-class types (in C++) or all types (in C).
-  QualType getCallResultType(ASTContext &Context) const;
+  QualType getNonLValueExprType(ASTContext &Context) const;
   
   /// getDesugaredType - Return the specified type with any "sugar" removed from
   /// the type.  This takes off typedefs, typeof's etc.  If the outer level of
@@ -784,19 +786,27 @@ private:
   
   /// \brief Linkage of this type.
   mutable unsigned CachedLinkage : 2;
-  
+
+  /// \brief FromPCH - Whether this type comes from a PCH file.
+  mutable bool FromPCH : 1;
+
+  /// \brief Set whether this type comes from a PCH file.
+  void setFromPCH(bool V = true) const { 
+    FromPCH = V;
+  }
+
 protected:
   /// \brief Compute the linkage of this type.
   virtual Linkage getLinkageImpl() const;
   
-  enum { BitsRemainingInType = 20 };
+  enum { BitsRemainingInType = 19 };
 
   // silence VC++ warning C4355: 'this' : used in base member initializer list
   Type *this_() { return this; }
   Type(TypeClass tc, QualType Canonical, bool dependent)
     : CanonicalType(Canonical.isNull() ? QualType(this_(), 0) : Canonical),
       TC(tc), Dependent(dependent), LinkageKnown(false), 
-      CachedLinkage(NoLinkage) {}
+      CachedLinkage(NoLinkage), FromPCH(false) {}
   virtual ~Type() {}
   virtual void Destroy(ASTContext& C);
   friend class ASTContext;
@@ -804,6 +814,9 @@ protected:
 public:
   TypeClass getTypeClass() const { return static_cast<TypeClass>(TC); }
 
+  /// \brief Whether this type comes from a PCH file.
+  bool isFromPCH() const { return FromPCH; }
+
   bool isCanonicalUnqualified() const {
     return CanonicalType.getTypePtr() == this;
   }
@@ -1907,7 +1920,7 @@ public:
   /// \brief Determine the type of an expression that calls a function of
   /// this type.
   QualType getCallResultType(ASTContext &Context) const { 
-    return getResultType().getCallResultType(Context);
+    return getResultType().getNonLValueExprType(Context);
   }
 
   static llvm::StringRef getNameForCallConv(CallingConv CC);

Modified: vendor/clang/dist/include/clang/Basic/Builtins.def
==============================================================================
--- vendor/clang/dist/include/clang/Basic/Builtins.def	Thu Jul 15 17:06:11 2010	(r210127)
+++ vendor/clang/dist/include/clang/Basic/Builtins.def	Thu Jul 15 17:07:12 2010	(r210128)
@@ -314,6 +314,7 @@ BUILTIN(__builtin_setjmp, "iv**", "")
 BUILTIN(__builtin_longjmp, "vv**i", "r")
 BUILTIN(__builtin_unwind_init, "v", "")
 BUILTIN(__builtin_eh_return_data_regno, "ii", "nc")
+BUILTIN(__builtin_snprintf, "ic*zcC*.", "nFp:2:")
 BUILTIN(__builtin_vsprintf, "ic*cC*a", "nFP:1:")
 BUILTIN(__builtin_vsnprintf, "ic*zcC*a", "nFP:2:")
 

Modified: vendor/clang/dist/include/clang/Basic/DiagnosticGroups.td
==============================================================================
--- vendor/clang/dist/include/clang/Basic/DiagnosticGroups.td	Thu Jul 15 17:06:11 2010	(r210127)
+++ vendor/clang/dist/include/clang/Basic/DiagnosticGroups.td	Thu Jul 15 17:07:12 2010	(r210128)
@@ -48,6 +48,7 @@ def CXXHexFloats : DiagGroup<"c++-hex-fl
 def : DiagGroup<"c++0x-compat", [CXXHexFloats]>;
 def FourByteMultiChar : DiagGroup<"four-char-constants">;
 def : DiagGroup<"idiomatic-parentheses">;
+def IgnoredQualifiers : DiagGroup<"ignored-qualifiers">;
 def : DiagGroup<"import">;
 def : DiagGroup<"init-self">;
 def : DiagGroup<"inline">;
@@ -167,6 +168,7 @@ def Format2 : DiagGroup<"format=2",
 
 def Extra : DiagGroup<"extra", [
     MissingFieldInitializers,
+    IgnoredQualifiers,
     InitializerOverrides,
     SemiBeforeMethodBody,
     SignCompare,

Modified: vendor/clang/dist/include/clang/Basic/DiagnosticSemaKinds.td
==============================================================================
--- vendor/clang/dist/include/clang/Basic/DiagnosticSemaKinds.td	Thu Jul 15 17:06:11 2010	(r210127)
+++ vendor/clang/dist/include/clang/Basic/DiagnosticSemaKinds.td	Thu Jul 15 17:07:12 2010	(r210128)
@@ -121,7 +121,8 @@ def warn_use_out_of_scope_declaration : 
 def err_inline_non_function : Error<
   "'inline' can only appear on functions">;
 def warn_qual_return_type : Warning< 
-  "'%0' type qualifier%s1 on return type %plural{1:has|:have}1 no effect">;
+  "'%0' type qualifier%s1 on return type %plural{1:has|:have}1 no effect">,
+  InGroup<IgnoredQualifiers>, DefaultIgnore;
 
 def warn_decl_shadow :
   Warning<"declaration shadows a %select{"
@@ -1986,6 +1987,10 @@ def note_precedence_bitwise_first : Note
   "place parentheses around the %0 expression to evaluate it first">;
 def note_precedence_bitwise_silence : Note<
   "place parentheses around the %0 expression to silence this warning">;
+
+def warn_logical_instead_of_bitwise : Warning<
+  "use of logical %0 with constant operand; switch to bitwise %1 or "
+  "remove constant">, InGroup<DiagGroup<"logical-bitwise-confusion">>;
   
 def err_sizeof_nonfragile_interface : Error<
   "invalid application of '%select{alignof|sizeof}1' to interface %0 in "

Modified: vendor/clang/dist/include/clang/Basic/FileManager.h
==============================================================================
--- vendor/clang/dist/include/clang/Basic/FileManager.h	Thu Jul 15 17:06:11 2010	(r210127)
+++ vendor/clang/dist/include/clang/Basic/FileManager.h	Thu Jul 15 17:07:12 2010	(r210128)
@@ -189,7 +189,7 @@ public:
   /// getDirectory - Lookup, cache, and verify the specified directory.  This
   /// returns null if the directory doesn't exist.
   ///
-  const DirectoryEntry *getDirectory(const llvm::StringRef &Filename) {
+  const DirectoryEntry *getDirectory(llvm::StringRef Filename) {
     return getDirectory(Filename.begin(), Filename.end());
   }
   const DirectoryEntry *getDirectory(const char *FileStart,const char *FileEnd);
@@ -197,7 +197,7 @@ public:
   /// getFile - Lookup, cache, and verify the specified file.  This returns null
   /// if the file doesn't exist.
   ///
-  const FileEntry *getFile(const llvm::StringRef &Filename) {
+  const FileEntry *getFile(llvm::StringRef Filename) {
     return getFile(Filename.begin(), Filename.end());
   }
   const FileEntry *getFile(const char *FilenameStart,
@@ -206,8 +206,8 @@ public:
   /// \brief Retrieve a file entry for a "virtual" file that acts as
   /// if there were a file with the given name on disk. The file
   /// itself is not accessed.
-  const FileEntry *getVirtualFile(const llvm::StringRef &Filename,
-                                  off_t Size, time_t ModificationTime);
+  const FileEntry *getVirtualFile(llvm::StringRef Filename, off_t Size,
+                                  time_t ModificationTime);
   void PrintStats() const;
 };
 

Modified: vendor/clang/dist/include/clang/Basic/TargetInfo.h
==============================================================================
--- vendor/clang/dist/include/clang/Basic/TargetInfo.h	Thu Jul 15 17:06:11 2010	(r210127)
+++ vendor/clang/dist/include/clang/Basic/TargetInfo.h	Thu Jul 15 17:07:12 2010	(r210128)
@@ -61,6 +61,7 @@ protected:
   std::string CXXABI;
 
   unsigned HasAlignMac68kSupport : 1;
+  unsigned RealTypeUsesObjCFPRet : 3;
 
   // TargetInfo Constructor.  Default initializes all fields.
   TargetInfo(const std::string &T);
@@ -87,6 +88,13 @@ public:
     SignedLongLong,
     UnsignedLongLong
   };
+
+  enum RealType {
+    Float = 0,
+    Double,
+    LongDouble
+  };
+
 protected:
   IntType SizeType, IntMaxType, UIntMaxType, PtrDiffType, IntPtrType, WCharType,
           WIntType, Char16Type, Char32Type, Int64Type, SigAtomicType;
@@ -233,6 +241,12 @@ public:
   /// integer type enum. For example, SignedLong -> "L".
   static const char *getTypeConstantSuffix(IntType T);
 
+  /// \brief Check whether the given real type should use the "fpret" flavor of
+  /// Obj-C message passing on this target.
+  bool useObjCFPRetForRealType(RealType T) const {
+    return RealTypeUsesObjCFPRet & (1 << T);
+  }
+
   ///===---- Other target property query methods --------------------------===//
 
   /// getTargetDefines - Appends the target-specific #define values for this

Modified: vendor/clang/dist/include/clang/Driver/ArgList.h
==============================================================================
--- vendor/clang/dist/include/clang/Driver/ArgList.h	Thu Jul 15 17:06:11 2010	(r210127)
+++ vendor/clang/dist/include/clang/Driver/ArgList.h	Thu Jul 15 17:07:12 2010	(r210128)
@@ -179,6 +179,8 @@ namespace driver {
     Arg *getLastArg(OptSpecifier Id) const;
     Arg *getLastArg(OptSpecifier Id0, OptSpecifier Id1) const;
     Arg *getLastArg(OptSpecifier Id0, OptSpecifier Id1, OptSpecifier Id2) const;
+    Arg *getLastArg(OptSpecifier Id0, OptSpecifier Id1, OptSpecifier Id2,
+                    OptSpecifier Id3) const;
 
     /// getArgString - Return the input argument string at \arg Index.
     virtual const char *getArgString(unsigned Index) const = 0;

Modified: vendor/clang/dist/include/clang/Driver/Driver.h
==============================================================================
--- vendor/clang/dist/include/clang/Driver/Driver.h	Thu Jul 15 17:06:11 2010	(r210127)
+++ vendor/clang/dist/include/clang/Driver/Driver.h	Thu Jul 15 17:07:12 2010	(r210128)
@@ -62,6 +62,9 @@ public:
   /// command line.
   std::string Dir;
 
+  /// The original path to the clang executable.
+  std::string ClangExecutable;
+
   /// The path to the compiler resource directory.
   std::string ResourceDir;
 
@@ -163,6 +166,11 @@ public:
   const std::string &getTitle() { return DriverTitle; }
   void setTitle(std::string Value) { DriverTitle = Value; }
 
+  /// \brief Get the path to the main clang executable.
+  std::string getClangProgramPath() const {
+    return ClangExecutable;
+  }
+
   /// @}
   /// @name Primary Functionality
   /// @{

Modified: vendor/clang/dist/include/clang/Driver/Options.td
==============================================================================
--- vendor/clang/dist/include/clang/Driver/Options.td	Thu Jul 15 17:06:11 2010	(r210127)
+++ vendor/clang/dist/include/clang/Driver/Options.td	Thu Jul 15 17:07:12 2010	(r210128)
@@ -230,6 +230,7 @@ def exported__symbols__list : Separate<"
 def e : JoinedOrSeparate<"-e">;
 def fPIC : Flag<"-fPIC">, Group<f_Group>;
 def fPIE : Flag<"-fPIE">, Group<f_Group>;
+def fno_PIE : Flag<"-fno-PIE">, Group<f_Group>;
 def faccess_control : Flag<"-faccess-control">, Group<f_Group>;
 def fapple_kext : Flag<"-fapple-kext">, Group<f_Group>;
 def fasm : Flag<"-fasm">, Group<f_Group>;
@@ -356,6 +357,7 @@ def fpascal_strings : Flag<"-fpascal-str
 def fpch_preprocess : Flag<"-fpch-preprocess">, Group<f_Group>;
 def fpic : Flag<"-fpic">, Group<f_Group>;
 def fpie : Flag<"-fpie">, Group<f_Group>;
+def fno_pie : Flag<"-fno-pie">, Group<f_Group>;
 def fprofile_arcs : Flag<"-fprofile-arcs">, Group<f_Group>;
 def fprofile_generate : Flag<"-fprofile-generate">, Group<f_Group>;
 def framework : Separate<"-framework">, Flags<[LinkerInput]>;
@@ -436,11 +438,11 @@ def mfix_and_continue : Flag<"-mfix-and-
 def mfloat_abi_EQ : Joined<"-mfloat-abi=">, Group<m_Group>;
 def mfpu_EQ : Joined<"-mfpu=">, Group<m_Group>;
 def mhard_float : Flag<"-mhard-float">, Group<m_Group>;
-def miphoneos_version_min_EQ : Joined<"-miphoneos-version-min=">, Group<m_Group>, Flags<[DriverOption]>;
+def miphoneos_version_min_EQ : Joined<"-miphoneos-version-min=">, Group<m_Group>;
 def mios_version_min_EQ : Joined<"-mios-version-min=">, Alias<miphoneos_version_min_EQ>;
 def mkernel : Flag<"-mkernel">, Group<m_Group>;
 def mllvm : Separate<"-mllvm">;
-def mmacosx_version_min_EQ : Joined<"-mmacosx-version-min=">, Group<m_Group>, Flags<[DriverOption]>;
+def mmacosx_version_min_EQ : Joined<"-mmacosx-version-min=">, Group<m_Group>;
 def mmmx : Flag<"-mmmx">, Group<m_x86_Features_Group>;
 def mno_3dnowa : Flag<"-mno-3dnowa">, Group<m_x86_Features_Group>;
 def mno_3dnow : Flag<"-mno-3dnow">, Group<m_x86_Features_Group>;

Modified: vendor/clang/dist/include/clang/Driver/ToolChain.h
==============================================================================
--- vendor/clang/dist/include/clang/Driver/ToolChain.h	Thu Jul 15 17:06:11 2010	(r210127)
+++ vendor/clang/dist/include/clang/Driver/ToolChain.h	Thu Jul 15 17:07:12 2010	(r210128)
@@ -84,9 +84,8 @@ public:
 
   // Helper methods
 
-  std::string GetFilePath(const Compilation &C, const char *Name) const;
-  std::string GetProgramPath(const Compilation &C, const char *Name,
-                             bool WantFile = false) const;
+  std::string GetFilePath(const char *Name) const;
+  std::string GetProgramPath(const char *Name, bool WantFile = false) const;
 
   // Platform defaults information
 

Modified: vendor/clang/dist/include/clang/Driver/Types.def
==============================================================================
--- vendor/clang/dist/include/clang/Driver/Types.def	Thu Jul 15 17:06:11 2010	(r210127)
+++ vendor/clang/dist/include/clang/Driver/Types.def	Thu Jul 15 17:07:12 2010	(r210128)
@@ -69,8 +69,8 @@ TYPE("java",                     Java,  
 
 // LLVM IR/LTO types. We define separate types for IR and LTO because LTO
 // outputs should use the standard suffixes.
-TYPE("ir",                       LLVM_IR,      INVALID,         "ll",    "")
-TYPE("ir",                       LLVM_BC,      INVALID,         "bc",    "")
+TYPE("ir",                       LLVM_IR,      INVALID,         "ll",    "u")
+TYPE("ir",                       LLVM_BC,      INVALID,         "bc",    "u")
 TYPE("lto-ir",                   LTO_IR,       INVALID,         "s",     "")
 TYPE("lto-bc",                   LTO_BC,       INVALID,         "o",     "")
 

Modified: vendor/clang/dist/include/clang/Frontend/ASTConsumers.h
==============================================================================
--- vendor/clang/dist/include/clang/Frontend/ASTConsumers.h	Thu Jul 15 17:06:11 2010	(r210127)
+++ vendor/clang/dist/include/clang/Frontend/ASTConsumers.h	Thu Jul 15 17:07:12 2010	(r210128)
@@ -63,7 +63,7 @@ ASTConsumer *CreateDeclContextPrinter();
 // times.
 ASTConsumer *CreatePCHGenerator(const Preprocessor &PP,
                                 llvm::raw_ostream *OS,
-                                const PCHReader *Chain,
+                                PCHReader *Chain,
                                 const char *isysroot = 0);
 
 // Inheritance viewer: for C++ code, creates a graph of the inheritance

Added: vendor/clang/dist/include/clang/Frontend/PCHDeserializationListener.h
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ vendor/clang/dist/include/clang/Frontend/PCHDeserializationListener.h	Thu Jul 15 17:07:12 2010	(r210128)
@@ -0,0 +1,36 @@
+//===- PCHDeserializationListener.h - Decl/Type PCH Read Events -*- C++ -*-===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+//  This file defines the PCHDeserializationListener class, which is notified
+//  by the PCHReader whenever a type or declaration is deserialized.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_CLANG_FRONTEND_PCH_DESERIALIZATION_LISTENER_H
+#define LLVM_CLANG_FRONTEND_PCH_DESERIALIZATION_LISTENER_H
+
+#include "clang/Frontend/PCHBitCodes.h"
+
+namespace clang {
+
+class Decl;
+class QualType;
+
+class PCHDeserializationListener {
+protected:
+  ~PCHDeserializationListener() {}
+
+public:
+  virtual void TypeRead(pch::TypeID ID, QualType T) = 0;
+  virtual void DeclRead(pch::DeclID ID, const Decl *D) = 0;
+};
+
+}
+
+#endif

Modified: vendor/clang/dist/include/clang/Frontend/PCHReader.h
==============================================================================
--- vendor/clang/dist/include/clang/Frontend/PCHReader.h	Thu Jul 15 17:06:11 2010	(r210127)
+++ vendor/clang/dist/include/clang/Frontend/PCHReader.h	Thu Jul 15 17:07:12 2010	(r210128)
@@ -59,12 +59,22 @@ class GotoStmt;
 class LabelStmt;
 class MacroDefinition;
 class NamedDecl;
+class PCHDeserializationListener;
 class Preprocessor;
 class Sema;
 class SwitchCase;
 class PCHReader;
 struct HeaderFileInfo;
 
+struct PCHPredefinesBlock {
+  /// \brief The file ID for this predefines buffer in a PCH file.
+  FileID BufferID;
+
+  /// \brief This predefines buffer in a PCH file.
+  llvm::StringRef Data;
+};
+typedef llvm::SmallVector<PCHPredefinesBlock, 2> PCHPredefinesBlocks;
+
 /// \brief Abstract interface for callback invocations by the PCHReader.
 ///
 /// While reading a PCH file, the PCHReader will call the methods of the
@@ -91,10 +101,7 @@ public:
 
   /// \brief Receives the contents of the predefines buffer.
   ///
-  /// \param PCHPredef The start of the predefines buffer in the PCH
-  /// file.
-  ///
-  /// \param PCHBufferID The FileID for the PCH predefines buffer.
+  /// \param Buffers Information about the predefines buffers.
   ///
   /// \param OriginalFileName The original file name for the PCH, which will
   /// appear as an entry in the predefines buffer.
@@ -103,8 +110,7 @@ public:
   /// here.
   ///
   /// \returns true to indicate the predefines are invalid or false otherwise.
-  virtual bool ReadPredefinesBuffer(llvm::StringRef PCHPredef,
-                                    FileID PCHBufferID,
+  virtual bool ReadPredefinesBuffer(const PCHPredefinesBlocks &Buffers,
                                     llvm::StringRef OriginalFileName,
                                     std::string &SuggestedPredefines) {
     return false;
@@ -131,8 +137,7 @@ public:
 
   virtual bool ReadLanguageOptions(const LangOptions &LangOpts);
   virtual bool ReadTargetTriple(llvm::StringRef Triple);
-  virtual bool ReadPredefinesBuffer(llvm::StringRef PCHPredef,
-                                    FileID PCHBufferID,
+  virtual bool ReadPredefinesBuffer(const PCHPredefinesBlocks &Buffers,
                                     llvm::StringRef OriginalFileName,
                                     std::string &SuggestedPredefines);
   virtual void ReadHeaderFileInfo(const HeaderFileInfo &HFI, unsigned ID);
@@ -165,9 +170,12 @@ public:
   enum PCHReadResult { Success, Failure, IgnorePCH };
   friend class PCHValidator;
 private:
-  /// \ brief The receiver of some callbacks invoked by PCHReader.
+  /// \brief The receiver of some callbacks invoked by PCHReader.
   llvm::OwningPtr<PCHReaderListener> Listener;
 
+  /// \brief The receiver of deserialization events.
+  PCHDeserializationListener *DeserializationListener;
+
   SourceManager &SourceMgr;
   FileManager &FileMgr;
   Diagnostic &Diags;
@@ -483,15 +491,9 @@ private:
     ~ReadingKindTracker() { Reader.ReadingKind = PrevKind; }
   };
 
-  /// \brief The file ID for the predefines buffer in the PCH file.
-  FileID PCHPredefinesBufferID;
-
-  /// \brief Pointer to the beginning of the predefines buffer in the
-  /// PCH file.
-  const char *PCHPredefines;
-
-  /// \brief Length of the predefines buffer in the PCH file.
-  unsigned PCHPredefinesLen;
+  /// \brief All predefines buffers in all PCH files, to be treated as if
+  /// concatenated.
+  PCHPredefinesBlocks PCHPredefinesBuffers;
 
   /// \brief Suggested contents of the predefines buffer, after this
   /// PCH file has been processed.
@@ -509,7 +511,7 @@ private:
   void MaybeAddSystemRootToFilename(std::string &Filename);
 
   PCHReadResult ReadPCHBlock();
-  bool CheckPredefinesBuffer(llvm::StringRef PCHPredef, FileID PCHBufferID);
+  bool CheckPredefinesBuffers();
   bool ParseLineTable(llvm::SmallVectorImpl<uint64_t> &Record);
   PCHReadResult ReadSourceManagerBlock();
   PCHReadResult ReadSLocEntryRecord(unsigned ID);
@@ -576,6 +578,10 @@ public:
     Listener.reset(listener);
   }
 
+  void setDeserializationListener(PCHDeserializationListener *Listener) {
+    DeserializationListener = Listener;
+  }
+
   /// \brief Set the Preprocessor to use.
   void setPreprocessor(Preprocessor &pp);
 
@@ -602,6 +608,16 @@ public:
   /// \brief Read preprocessed entities into the 
   virtual void ReadPreprocessedEntities();
 
+  /// \brief Returns the number of types found in this file.
+  unsigned getTotalNumTypes() const {
+    return static_cast<unsigned>(TypesLoaded.size());
+  }
+
+  /// \brief Returns the number of declarations found in this file.
+  unsigned getTotalNumDecls() const {
+    return static_cast<unsigned>(DeclsLoaded.size());
+  }
+
   /// \brief Reads a TemplateArgumentLocInfo appropriate for the
   /// given TemplateArgument kind.
   TemplateArgumentLocInfo

Modified: vendor/clang/dist/include/clang/Frontend/PCHWriter.h
==============================================================================
--- vendor/clang/dist/include/clang/Frontend/PCHWriter.h	Thu Jul 15 17:06:11 2010	(r210127)
+++ vendor/clang/dist/include/clang/Frontend/PCHWriter.h	Thu Jul 15 17:07:12 2010	(r210128)
@@ -19,6 +19,7 @@
 #include "clang/AST/DeclarationName.h"
 #include "clang/AST/TemplateBase.h"
 #include "clang/Frontend/PCHBitCodes.h"
+#include "clang/Frontend/PCHDeserializationListener.h"
 #include "llvm/ADT/DenseMap.h"
 #include "llvm/ADT/SmallVector.h"
 #include <map>
@@ -71,7 +72,7 @@ struct UnsafeQualTypeDenseMapInfo {
 /// representation of a given abstract syntax tree and its supporting
 /// data structures. This bitstream can be de-serialized via an
 /// instance of the PCHReader class.
-class PCHWriter {
+class PCHWriter : public PCHDeserializationListener {
 public:
   typedef llvm::SmallVector<uint64_t, 64> RecordData;
 
@@ -79,6 +80,9 @@ private:
   /// \brief The bitstream writer used to emit this precompiled header.
   llvm::BitstreamWriter &Stream;
 
+  /// \brief The reader of existing PCH files, if we're chaining.
+  PCHReader *Chain;
+
   /// \brief Stores a declaration or a type to be written to the PCH file.
   class DeclOrType {
   public:
@@ -220,7 +224,7 @@ private:
   void WriteSubStmt(Stmt *S);
 
   void WriteBlockInfoBlock();
-  void WriteMetadata(ASTContext &Context, const PCHReader *Chain, const char *isysroot);
+  void WriteMetadata(ASTContext &Context, const char *isysroot);
   void WriteLanguageOptions(const LangOptions &LangOpts);
   void WriteStatCache(MemorizeStatCalls &StatCalls);
   void WriteSourceManagerBlock(SourceManager &SourceMgr,
@@ -242,12 +246,12 @@ private:
   void WritePCHCore(Sema &SemaRef, MemorizeStatCalls *StatCalls,
                     const char* isysroot);
   void WritePCHChain(Sema &SemaRef, MemorizeStatCalls *StatCalls,
-                     const PCHReader *Chain, const char* isysroot);
+                     const char* isysroot);
   
 public:
   /// \brief Create a new precompiled header writer that outputs to
   /// the given bitstream.
-  PCHWriter(llvm::BitstreamWriter &Stream);
+  PCHWriter(llvm::BitstreamWriter &Stream, PCHReader *Chain);
 
   /// \brief Write a precompiled header for the given semantic analysis.
   ///
@@ -263,7 +267,7 @@ public:
   /// \param PPRec Record of the preprocessing actions that occurred while
   /// preprocessing this file, e.g., macro instantiations
   void WritePCH(Sema &SemaRef, MemorizeStatCalls *StatCalls,
-                const PCHReader *Chain, const char* isysroot);
+                const char* isysroot);
 
   /// \brief Emit a source location.
   void AddSourceLocation(SourceLocation Loc, RecordData &Record);
@@ -393,6 +397,10 @@ public:
   unsigned GetLabelID(LabelStmt *S);
 
   unsigned getParmVarDeclAbbrev() const { return ParmVarDeclAbbrev; }
+
+  // PCHDeserializationListener implementation
+  void TypeRead(pch::TypeID ID, QualType T);
+  void DeclRead(pch::DeclID ID, const Decl *D);
 };
 
 } // end namespace clang

Modified: vendor/clang/dist/include/clang/Rewrite/Rewriter.h
==============================================================================
--- vendor/clang/dist/include/clang/Rewrite/Rewriter.h	Thu Jul 15 17:06:11 2010	(r210127)
+++ vendor/clang/dist/include/clang/Rewrite/Rewriter.h	Thu Jul 15 17:07:12 2010	(r210128)
@@ -64,7 +64,7 @@ public:
   /// the buffer is specified relative to the original SourceBuffer.  The
   /// text is inserted after the specified location.
   ///
-  void InsertText(unsigned OrigOffset, const llvm::StringRef &Str,
+  void InsertText(unsigned OrigOffset, llvm::StringRef Str,
                   bool InsertAfter = true);
 
 
@@ -72,14 +72,14 @@ public:
   /// offset in the buffer is specified relative to the original
   /// SourceBuffer. The text is inserted before the specified location.  This is
   /// method is the same as InsertText with "InsertAfter == false".
-  void InsertTextBefore(unsigned OrigOffset, const llvm::StringRef &Str) {
+  void InsertTextBefore(unsigned OrigOffset, llvm::StringRef Str) {
     InsertText(OrigOffset, Str, false);
   }
 
   /// InsertTextAfter - Insert some text at the specified point, where the
   /// offset in the buffer is specified relative to the original SourceBuffer.
   /// The text is inserted after the specified location.
-  void InsertTextAfter(unsigned OrigOffset, const llvm::StringRef &Str) {
+  void InsertTextAfter(unsigned OrigOffset, llvm::StringRef Str) {
     InsertText(OrigOffset, Str);
   }
 
@@ -87,7 +87,7 @@ public:
   /// buffer with a new string.  This is effectively a combined "remove/insert"
   /// operation.
   void ReplaceText(unsigned OrigOffset, unsigned OrigLength,
-                   const llvm::StringRef &NewStr);
+                   llvm::StringRef NewStr);
 
 private:  // Methods only usable by Rewriter.
 
@@ -164,7 +164,7 @@ public:
   /// InsertText - Insert the specified string at the specified location in the
   /// original buffer.  This method returns true (and does nothing) if the input
   /// location was not rewritable, false otherwise.
-  bool InsertText(SourceLocation Loc, const llvm::StringRef &Str,
+  bool InsertText(SourceLocation Loc, llvm::StringRef Str,
                   bool InsertAfter = true);
 
   /// InsertTextAfter - Insert the specified string at the specified location in
@@ -172,7 +172,7 @@ public:
   ///  the input location was not rewritable, false otherwise.  Text is
   ///  inserted after any other text that has been previously inserted
   ///  at the some point (the default behavior for InsertText).
-  bool InsertTextAfter(SourceLocation Loc, const llvm::StringRef &Str) {
+  bool InsertTextAfter(SourceLocation Loc, llvm::StringRef Str) {
     return InsertText(Loc, Str);
   }
 
@@ -181,7 +181,7 @@ public:
   /// location was not rewritable, false otherwise.  Text is
   /// inserted before any other text that has been previously inserted
   /// at the some point.
-  bool InsertTextBefore(SourceLocation Loc, const llvm::StringRef &Str) {
+  bool InsertTextBefore(SourceLocation Loc, llvm::StringRef Str) {
     return InsertText(Loc, Str, false);
   }
 
@@ -192,7 +192,7 @@ public:
   /// buffer with a new string.  This is effectively a combined "remove/insert"
   /// operation.
   bool ReplaceText(SourceLocation Start, unsigned OrigLength,
-                   const llvm::StringRef &NewStr);
+                   llvm::StringRef NewStr);
 
   /// ReplaceStmt - This replaces a Stmt/Expr with another, using the pretty
   /// printer to generate the replacement code.  This returns true if the input

Modified: vendor/clang/dist/lib/AST/DeclTemplate.cpp
==============================================================================
--- vendor/clang/dist/lib/AST/DeclTemplate.cpp	Thu Jul 15 17:06:11 2010	(r210127)
+++ vendor/clang/dist/lib/AST/DeclTemplate.cpp	Thu Jul 15 17:07:12 2010	(r210128)
@@ -223,7 +223,7 @@ ClassTemplateDecl::getInjectedClassNameS
     } else if (NonTypeTemplateParmDecl *NTTP =
                  dyn_cast<NonTypeTemplateParmDecl>(*Param)) {
       Expr *E = new (Context) DeclRefExpr(NTTP,
-                                          NTTP->getType().getNonReferenceType(),
+                                  NTTP->getType().getNonLValueExprType(Context),
                                           NTTP->getLocation());
       TemplateArgs.push_back(TemplateArgument(E));
     } else {

Modified: vendor/clang/dist/lib/AST/Expr.cpp
==============================================================================
--- vendor/clang/dist/lib/AST/Expr.cpp	Thu Jul 15 17:06:11 2010	(r210127)
+++ vendor/clang/dist/lib/AST/Expr.cpp	Thu Jul 15 17:07:12 2010	(r210128)
@@ -684,6 +684,8 @@ const char *CastExpr::getCastKindName() 
     return "Unknown";
   case CastExpr::CK_BitCast:
     return "BitCast";
+  case CastExpr::CK_LValueBitCast:
+    return "LValueBitCast";
   case CastExpr::CK_NoOp:
     return "NoOp";
   case CastExpr::CK_BaseToDerived:

Modified: vendor/clang/dist/lib/AST/ExprConstant.cpp
==============================================================================
--- vendor/clang/dist/lib/AST/ExprConstant.cpp	Thu Jul 15 17:06:11 2010	(r210127)
+++ vendor/clang/dist/lib/AST/ExprConstant.cpp	Thu Jul 15 17:07:12 2010	(r210128)
@@ -563,6 +563,7 @@ bool PointerExprEvaluator::VisitCastExpr
 
   case CastExpr::CK_NoOp:
   case CastExpr::CK_BitCast:
+  case CastExpr::CK_LValueBitCast:
   case CastExpr::CK_AnyPointerToObjCPointerCast:
   case CastExpr::CK_AnyPointerToBlockPointerCast:
     return Visit(SubExpr);

Modified: vendor/clang/dist/lib/AST/Type.cpp
==============================================================================
--- vendor/clang/dist/lib/AST/Type.cpp	Thu Jul 15 17:06:11 2010	(r210127)
+++ vendor/clang/dist/lib/AST/Type.cpp	Thu Jul 15 17:07:12 2010	(r210128)
@@ -992,7 +992,7 @@ const char *BuiltinType::getName(const L
 
 void FunctionType::ANCHOR() {} // Key function for FunctionType.
 
-QualType QualType::getCallResultType(ASTContext &Context) const {
+QualType QualType::getNonLValueExprType(ASTContext &Context) const {
   if (const ReferenceType *RefType = getTypePtr()->getAs<ReferenceType>())
     return RefType->getPointeeType();
   
@@ -1002,7 +1002,7 @@ QualType QualType::getCallResultType(AST
   //
   // See also C99 6.3.2.1p2.
   if (!Context.getLangOptions().CPlusPlus ||
-      !getTypePtr()->isDependentType() && !getTypePtr()->isRecordType())
+      (!getTypePtr()->isDependentType() && !getTypePtr()->isRecordType()))
     return getUnqualifiedType();
   
   return *this;

Modified: vendor/clang/dist/lib/Basic/FileManager.cpp
==============================================================================
--- vendor/clang/dist/lib/Basic/FileManager.cpp	Thu Jul 15 17:06:11 2010	(r210127)
+++ vendor/clang/dist/lib/Basic/FileManager.cpp	Thu Jul 15 17:07:12 2010	(r210128)
@@ -331,8 +331,8 @@ const FileEntry *FileManager::getFile(co
 }
 
 const FileEntry *
-FileManager::getVirtualFile(const llvm::StringRef &Filename,
-                            off_t Size, time_t ModificationTime) {
+FileManager::getVirtualFile(llvm::StringRef Filename, off_t Size,
+                            time_t ModificationTime) {
   const char *NameStart = Filename.begin(), *NameEnd = Filename.end();
 
   ++NumFileLookups;

Modified: vendor/clang/dist/lib/Basic/TargetInfo.cpp
==============================================================================
--- vendor/clang/dist/lib/Basic/TargetInfo.cpp	Thu Jul 15 17:06:11 2010	(r210127)
+++ vendor/clang/dist/lib/Basic/TargetInfo.cpp	Thu Jul 15 17:07:12 2010	(r210128)
@@ -55,6 +55,9 @@ TargetInfo::TargetInfo(const std::string
                       "i64:64:64-f32:32:32-f64:64:64-n32";
   UserLabelPrefix = "_";
   HasAlignMac68kSupport = false;
+
+  // Default to no types using fpret.
+  RealTypeUsesObjCFPRet = 0;
 }
 
 // Out of line virtual dtor for TargetInfo.

Modified: vendor/clang/dist/lib/Basic/Targets.cpp
==============================================================================
--- vendor/clang/dist/lib/Basic/Targets.cpp	Thu Jul 15 17:06:11 2010	(r210127)
+++ vendor/clang/dist/lib/Basic/Targets.cpp	Thu Jul 15 17:07:12 2010	(r210128)
@@ -1245,6 +1245,11 @@ public:
     PtrDiffType = SignedInt;
     IntPtrType = SignedInt;
     RegParmMax = 3;
+
+    // Use fpret for all types.
+    RealTypeUsesObjCFPRet = ((1 << TargetInfo::Float) |
+                             (1 << TargetInfo::Double) |
+                             (1 << TargetInfo::LongDouble));
   }
   virtual const char *getVAListDeclaration() const {
     return "typedef char* __builtin_va_list;";
@@ -1411,6 +1416,9 @@ public:
     DescriptionString = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
                         "i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-"
                         "a0:0:64-s0:64:64-f80:128:128-n8:16:32:64";
+
+    // Use fpret only for long double.
+    RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble);
   }
   virtual const char *getVAListDeclaration() const {
     return "typedef struct __va_list_tag {"

Modified: vendor/clang/dist/lib/Checker/GRExprEngine.cpp
==============================================================================
--- vendor/clang/dist/lib/Checker/GRExprEngine.cpp	Thu Jul 15 17:06:11 2010	(r210127)
+++ vendor/clang/dist/lib/Checker/GRExprEngine.cpp	Thu Jul 15 17:07:12 2010	(r210128)
@@ -2438,6 +2438,7 @@ void GRExprEngine::VisitCast(CastExpr *C
   case CastExpr::CK_Unknown:
   case CastExpr::CK_ArrayToPointerDecay:
   case CastExpr::CK_BitCast:
+  case CastExpr::CK_LValueBitCast:
   case CastExpr::CK_IntegralCast:
   case CastExpr::CK_IntegralToPointer:
   case CastExpr::CK_PointerToIntegral:

Modified: vendor/clang/dist/lib/Checker/LLVMConventionsChecker.cpp
==============================================================================
--- vendor/clang/dist/lib/Checker/LLVMConventionsChecker.cpp	Thu Jul 15 17:06:11 2010	(r210127)
+++ vendor/clang/dist/lib/Checker/LLVMConventionsChecker.cpp	Thu Jul 15 17:07:12 2010	(r210128)
@@ -36,7 +36,7 @@ static bool IsLLVMStringRef(QualType T) 
 
 /// Check whether the declaration is semantically inside the top-level
 /// namespace named by ns.
-static bool InNamespace(const Decl *D, const llvm::StringRef &NS) {
+static bool InNamespace(const Decl *D, llvm::StringRef NS) {
   const DeclContext *DC = D->getDeclContext();
   const NamespaceDecl *ND = dyn_cast<NamespaceDecl>(D->getDeclContext());
   if (!ND)

Modified: vendor/clang/dist/lib/CodeGen/CGBlocks.cpp
==============================================================================
--- vendor/clang/dist/lib/CodeGen/CGBlocks.cpp	Thu Jul 15 17:06:11 2010	(r210127)
+++ vendor/clang/dist/lib/CodeGen/CGBlocks.cpp	Thu Jul 15 17:07:12 2010	(r210128)
@@ -253,7 +253,7 @@ llvm::Value *CodeGenFunction::BuildBlock
       CodeGenTypes &Types = CGM.getTypes();
       const CGFunctionInfo &FnInfo = Types.getFunctionInfo(ResultType, Args,
                                                        FunctionType::ExtInfo());
-      if (CGM.ReturnTypeUsesSret(FnInfo))
+      if (CGM.ReturnTypeUsesSRet(FnInfo))
         flags |= BLOCK_USE_STRET;
     }
     const llvm::IntegerType *IntTy = cast<llvm::IntegerType>(

Modified: vendor/clang/dist/lib/CodeGen/CGCall.cpp
==============================================================================
--- vendor/clang/dist/lib/CodeGen/CGCall.cpp	Thu Jul 15 17:06:11 2010	(r210127)
+++ vendor/clang/dist/lib/CodeGen/CGCall.cpp	Thu Jul 15 17:07:12 2010	(r210128)
@@ -564,10 +564,28 @@ static void CreateCoercedStore(llvm::Val
 
 /***/
 
-bool CodeGenModule::ReturnTypeUsesSret(const CGFunctionInfo &FI) {
+bool CodeGenModule::ReturnTypeUsesSRet(const CGFunctionInfo &FI) {
   return FI.getReturnInfo().isIndirect();
 }
 
+bool CodeGenModule::ReturnTypeUsesFPRet(QualType ResultType) {
+  if (const BuiltinType *BT = ResultType->getAs<BuiltinType>()) {
+    switch (BT->getKind()) {
+    default:
+      return false;
+    case BuiltinType::Float:
+      return getContext().Target.useObjCFPRetForRealType(TargetInfo::Float);
+    case BuiltinType::Double:
+      return getContext().Target.useObjCFPRetForRealType(TargetInfo::Double);
+    case BuiltinType::LongDouble:
+      return getContext().Target.useObjCFPRetForRealType(
+        TargetInfo::LongDouble);
+    }
+  }
+
+  return false;
+}
+
 const llvm::FunctionType *CodeGenTypes::GetFunctionType(GlobalDecl GD) {
   const CGFunctionInfo &FI = getFunctionInfo(GD);
   
@@ -841,7 +859,7 @@ void CodeGenFunction::EmitFunctionProlog
   llvm::Function::arg_iterator AI = Fn->arg_begin();
 
   // Name the struct return argument.
-  if (CGM.ReturnTypeUsesSret(FI)) {
+  if (CGM.ReturnTypeUsesSRet(FI)) {
     AI->setName("agg.result");
     ++AI;
   }
@@ -1116,7 +1134,7 @@ RValue CodeGenFunction::EmitCall(const C
 
   // If the call returns a temporary with struct return, create a temporary
   // alloca to hold the result, unless one is given to us.
-  if (CGM.ReturnTypeUsesSret(CallInfo)) {
+  if (CGM.ReturnTypeUsesSRet(CallInfo)) {
     llvm::Value *Value = ReturnValue.getValue();
     if (!Value)
       Value = CreateMemTemp(RetTy);

Modified: vendor/clang/dist/lib/CodeGen/CGClass.cpp
==============================================================================
--- vendor/clang/dist/lib/CodeGen/CGClass.cpp	Thu Jul 15 17:06:11 2010	(r210127)
+++ vendor/clang/dist/lib/CodeGen/CGClass.cpp	Thu Jul 15 17:07:12 2010	(r210128)
@@ -340,7 +340,7 @@ static void EmitBaseInitializer(CodeGenF
   
   if (CGF.Exceptions && !BaseClassDecl->hasTrivialDestructor()) {
     // FIXME: Is this OK for C++0x delegating constructors?
-    CodeGenFunction::CleanupBlock Cleanup(CGF, CodeGenFunction::EHCleanup);
+    CodeGenFunction::CleanupBlock Cleanup(CGF, EHCleanup);
 
     CXXDestructorDecl *DD = BaseClassDecl->getDestructor();
     CGF.EmitCXXDestructorCall(DD, Dtor_Base, isBaseVirtual, V);
@@ -534,7 +534,7 @@ static void EmitMemberInitializer(CodeGe
     CXXRecordDecl *RD = cast<CXXRecordDecl>(RT->getDecl());
     if (!RD->hasTrivialDestructor()) {
       // FIXME: Is this OK for C++0x delegating constructors?
-      CodeGenFunction::CleanupBlock Cleanup(CGF, CodeGenFunction::EHCleanup);
+      CodeGenFunction::CleanupBlock Cleanup(CGF, EHCleanup);
       
       llvm::Value *ThisPtr = CGF.LoadCXXThis();
       LValue LHS = CGF.EmitLValueForField(ThisPtr, Field, 0);

Modified: vendor/clang/dist/lib/CodeGen/CGDebugInfo.cpp
==============================================================================
--- vendor/clang/dist/lib/CodeGen/CGDebugInfo.cpp	Thu Jul 15 17:06:11 2010	(r210127)
+++ vendor/clang/dist/lib/CodeGen/CGDebugInfo.cpp	Thu Jul 15 17:07:12 2010	(r210128)
@@ -537,11 +537,17 @@ CGDebugInfo::getOrCreateMethodType(const
   llvm::DIType ThisPtrType = 
     DebugFactory.CreateArtificialType(getOrCreateType(ThisPtr, Unit));
 
-  if (Method->getTypeQualifiers() && Qualifiers::Const)
+  unsigned Quals = Method->getTypeQualifiers();
+  if (Quals & Qualifiers::Const)
     ThisPtrType = 
       DebugFactory.CreateDerivedType(llvm::dwarf::DW_TAG_const_type, 
                                      Unit, "", Unit,
                                      0, 0, 0, 0, 0, ThisPtrType);
+  if (Quals & Qualifiers::Volatile)
+    ThisPtrType = 
+      DebugFactory.CreateDerivedType(llvm::dwarf::DW_TAG_volatile_type, 
+                                     Unit, "", Unit,
+                                     0, 0, 0, 0, 0, ThisPtrType);
 
   TypeCache[ThisPtr.getAsOpaquePtr()] = ThisPtrType;  
   Elts.push_back(ThisPtrType);

Modified: vendor/clang/dist/lib/CodeGen/CGDecl.cpp
==============================================================================
--- vendor/clang/dist/lib/CodeGen/CGDecl.cpp	Thu Jul 15 17:06:11 2010	(r210127)
+++ vendor/clang/dist/lib/CodeGen/CGDecl.cpp	Thu Jul 15 17:07:12 2010	(r210128)
@@ -388,6 +388,58 @@ const llvm::Type *CodeGenFunction::Build
   return Info.first;
 }
 
+namespace {
+  struct CallArrayDtor : EHScopeStack::LazyCleanup {
+    CallArrayDtor(const CXXDestructorDecl *Dtor, 
+                  const ConstantArrayType *Type,
+                  llvm::Value *Loc)
+      : Dtor(Dtor), Type(Type), Loc(Loc) {}
+
+    const CXXDestructorDecl *Dtor;
+    const ConstantArrayType *Type;
+    llvm::Value *Loc;
+
+    void Emit(CodeGenFunction &CGF, bool IsForEH) {
+      QualType BaseElementTy = CGF.getContext().getBaseElementType(Type);
+      const llvm::Type *BasePtr = CGF.ConvertType(BaseElementTy);
+      BasePtr = llvm::PointerType::getUnqual(BasePtr);
+      llvm::Value *BaseAddrPtr = CGF.Builder.CreateBitCast(Loc, BasePtr);
+      CGF.EmitCXXAggrDestructorCall(Dtor, Type, BaseAddrPtr);
+    }
+  };
+
+  struct CallVarDtor : EHScopeStack::LazyCleanup {
+    CallVarDtor(const CXXDestructorDecl *Dtor,
+                llvm::Value *NRVOFlag,
+                llvm::Value *Loc)
+      : Dtor(Dtor), NRVOFlag(NRVOFlag), Loc(Loc) {}
+
+    const CXXDestructorDecl *Dtor;
+    llvm::Value *NRVOFlag;
+    llvm::Value *Loc;
+
+    void Emit(CodeGenFunction &CGF, bool IsForEH) {
+      // Along the exceptions path we always execute the dtor.
+      bool NRVO = !IsForEH && NRVOFlag;
+
+      llvm::BasicBlock *SkipDtorBB = 0;
+      if (NRVO) {
+        // If we exited via NRVO, we skip the destructor call.
+        llvm::BasicBlock *RunDtorBB = CGF.createBasicBlock("nrvo.unused");
+        SkipDtorBB = CGF.createBasicBlock("nrvo.skipdtor");
+        llvm::Value *DidNRVO = CGF.Builder.CreateLoad(NRVOFlag, "nrvo.val");
+        CGF.Builder.CreateCondBr(DidNRVO, SkipDtorBB, RunDtorBB);
+        CGF.EmitBlock(RunDtorBB);
+      }
+          
+      CGF.EmitCXXDestructorCall(Dtor, Dtor_Complete,
+                                /*ForVirtualBase=*/false, Loc);
+
+      if (NRVO) CGF.EmitBlock(SkipDtorBB);
+    }
+  };
+}
+
 /// EmitLocalBlockVarDecl - Emit code and set up an entry in LocalDeclMap for a
 /// variable declaration with auto, register, or no storage class specifier.
 /// These turn into simple stack objects, or GlobalValues depending on target.
@@ -686,53 +738,11 @@ void CodeGenFunction::EmitLocalBlockVarD
         
         if (const ConstantArrayType *Array = 
               getContext().getAsConstantArrayType(Ty)) {
-          CleanupBlock Scope(*this, NormalCleanup);
-
-          QualType BaseElementTy = getContext().getBaseElementType(Array);
-          const llvm::Type *BasePtr = ConvertType(BaseElementTy);
-          BasePtr = llvm::PointerType::getUnqual(BasePtr);
-          llvm::Value *BaseAddrPtr =
-            Builder.CreateBitCast(Loc, BasePtr);
-          EmitCXXAggrDestructorCall(D, Array, BaseAddrPtr);
-
-          if (Exceptions) {
-            Scope.beginEHCleanup();
-
-            QualType BaseElementTy = getContext().getBaseElementType(Array);
-            const llvm::Type *BasePtr = ConvertType(BaseElementTy);
-            BasePtr = llvm::PointerType::getUnqual(BasePtr);
-            llvm::Value *BaseAddrPtr =
-              Builder.CreateBitCast(Loc, BasePtr);
-            EmitCXXAggrDestructorCall(D, Array, BaseAddrPtr);
-          }
+          EHStack.pushLazyCleanup<CallArrayDtor>(NormalAndEHCleanup,
+                                                 D, Array, Loc);
         } else {
-          // Normal destruction. 
-          CleanupBlock Scope(*this, NormalCleanup);
-
-          llvm::BasicBlock *SkipDtor = 0;
-          if (NRVO) {
-            // If we exited via NRVO, we skip the destructor call.

*** DIFF OUTPUT TRUNCATED AT 1000 LINES ***



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201007151707.o6FH7CBW047818>