From owner-svn-src-vendor@FreeBSD.ORG Sat Mar 6 09:23:03 2010 Return-Path: Delivered-To: svn-src-vendor@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 843201065698; Sat, 6 Mar 2010 09:23:03 +0000 (UTC) (envelope-from rdivacky@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 7076D8FC16; Sat, 6 Mar 2010 09:23:03 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id o269N3MZ079494; Sat, 6 Mar 2010 09:23:03 GMT (envelope-from rdivacky@svn.freebsd.org) Received: (from rdivacky@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id o269N2oQ079458; Sat, 6 Mar 2010 09:23:02 GMT (envelope-from rdivacky@svn.freebsd.org) Message-Id: <201003060923.o269N2oQ079458@svn.freebsd.org> From: Roman Divacky Date: Sat, 6 Mar 2010 09:23:02 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-vendor@freebsd.org X-SVN-Group: vendor MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r204793 - in vendor/clang/dist: docs docs/tools include/clang/AST include/clang/Basic include/clang/Checker/PathSensitive include/clang/Driver include/clang/Frontend lib/AST lib/Basic l... X-BeenThere: svn-src-vendor@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for the vendor work area tree List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 06 Mar 2010 09:23:03 -0000 Author: rdivacky Date: Sat Mar 6 09:23:02 2010 New Revision: 204793 URL: http://svn.freebsd.org/changeset/base/204793 Log: Update clang to r97873. Added: vendor/clang/dist/include/clang/Basic/BuiltinsARM.def vendor/clang/dist/lib/Headers/smmintrin.h vendor/clang/dist/test/Analysis/inline3.c vendor/clang/dist/test/CXX/class.derived/class.member.lookup/p8.cpp vendor/clang/dist/test/CXX/except/except.handle/p16.cpp vendor/clang/dist/test/CodeGen/attr-weakref.c vendor/clang/dist/test/CodeGen/attr-weakref2.c vendor/clang/dist/test/CodeGen/blockstret.c vendor/clang/dist/test/CodeGen/builtins-arm.c vendor/clang/dist/test/CodeGenCXX/mangle-local-class-names.cpp vendor/clang/dist/test/Rewriter/rewrite-static-block.mm Deleted: vendor/clang/dist/test/CodeGen/asm-2.c vendor/clang/dist/test/CodeGen/asm-inout.c Modified: vendor/clang/dist/docs/Makefile vendor/clang/dist/docs/tools/Makefile vendor/clang/dist/include/clang/AST/ASTContext.h vendor/clang/dist/include/clang/AST/DeclBase.h vendor/clang/dist/include/clang/Basic/Builtins.def vendor/clang/dist/include/clang/Basic/BuiltinsX86.def vendor/clang/dist/include/clang/Basic/DiagnosticSemaKinds.td vendor/clang/dist/include/clang/Basic/TargetBuiltins.h vendor/clang/dist/include/clang/Basic/TokenKinds.def vendor/clang/dist/include/clang/Checker/PathSensitive/Environment.h vendor/clang/dist/include/clang/Checker/PathSensitive/GRState.h vendor/clang/dist/include/clang/Checker/PathSensitive/SymbolManager.h vendor/clang/dist/include/clang/Driver/HostInfo.h vendor/clang/dist/include/clang/Driver/Options.td vendor/clang/dist/include/clang/Frontend/ASTUnit.h vendor/clang/dist/lib/AST/ASTContext.cpp vendor/clang/dist/lib/AST/DeclBase.cpp vendor/clang/dist/lib/Basic/Targets.cpp vendor/clang/dist/lib/Basic/Version.cpp vendor/clang/dist/lib/Checker/Environment.cpp vendor/clang/dist/lib/Checker/GRExprEngine.cpp vendor/clang/dist/lib/Checker/GRState.cpp vendor/clang/dist/lib/Checker/SymbolManager.cpp vendor/clang/dist/lib/CodeGen/CGBlocks.cpp vendor/clang/dist/lib/CodeGen/CGBlocks.h vendor/clang/dist/lib/CodeGen/CGBuiltin.cpp vendor/clang/dist/lib/CodeGen/CGCXX.cpp vendor/clang/dist/lib/CodeGen/CGExpr.cpp vendor/clang/dist/lib/CodeGen/CGExprConstant.cpp vendor/clang/dist/lib/CodeGen/CGExprScalar.cpp vendor/clang/dist/lib/CodeGen/CGStmt.cpp vendor/clang/dist/lib/CodeGen/CodeGenFunction.h vendor/clang/dist/lib/CodeGen/CodeGenModule.cpp vendor/clang/dist/lib/CodeGen/CodeGenModule.h vendor/clang/dist/lib/CodeGen/Mangle.cpp vendor/clang/dist/lib/CodeGen/Mangle.h vendor/clang/dist/lib/CodeGen/TargetInfo.cpp vendor/clang/dist/lib/CodeGen/TargetInfo.h vendor/clang/dist/lib/Driver/Driver.cpp vendor/clang/dist/lib/Driver/HostInfo.cpp vendor/clang/dist/lib/Driver/ToolChains.cpp vendor/clang/dist/lib/Driver/ToolChains.h vendor/clang/dist/lib/Frontend/ASTUnit.cpp vendor/clang/dist/lib/Frontend/CacheTokens.cpp vendor/clang/dist/lib/Frontend/InitHeaderSearch.cpp vendor/clang/dist/lib/Frontend/RewriteObjC.cpp vendor/clang/dist/lib/Lex/PPMacroExpansion.cpp vendor/clang/dist/lib/Sema/Sema.h vendor/clang/dist/lib/Sema/SemaDeclCXX.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/SemaOverload.cpp vendor/clang/dist/lib/Sema/SemaType.cpp vendor/clang/dist/lib/Sema/TreeTransform.h vendor/clang/dist/test/CodeGen/asm.c vendor/clang/dist/test/CodeGen/attributes.c vendor/clang/dist/test/CodeGen/builtins-x86.c vendor/clang/dist/test/CodeGen/builtins.c vendor/clang/dist/test/CodeGenObjC/id-isa-codegen.m vendor/clang/dist/test/Index/linkage.c vendor/clang/dist/test/Rewriter/rewrite-byref-vars.mm vendor/clang/dist/test/Rewriter/rewrite-nested-ivar.mm vendor/clang/dist/test/Rewriter/rewrite-protocol-qualified.mm vendor/clang/dist/test/Sema/block-byref-args.c vendor/clang/dist/test/Sema/scope-check.c vendor/clang/dist/test/SemaObjC/check-dup-objc-decls-1.m vendor/clang/dist/test/SemaObjC/unused.m vendor/clang/dist/test/lit.cfg vendor/clang/dist/tools/CIndex/CIndex.cpp vendor/clang/dist/tools/c-index-test/c-index-test.c Modified: vendor/clang/dist/docs/Makefile ============================================================================== --- vendor/clang/dist/docs/Makefile Sat Mar 6 09:22:29 2010 (r204792) +++ vendor/clang/dist/docs/Makefile Sat Mar 6 09:23:02 2010 (r204793) @@ -48,11 +48,11 @@ generated:: doxygen install-html: $(PROJ_OBJ_DIR)/html.tar.gz $(Echo) Installing HTML documentation - $(Verb) $(MKDIR) $(PROJ_docsdir)/html - $(Verb) $(MKDIR) $(PROJ_docsdir)/html/img - $(Verb) $(DataInstall) $(HTML) $(PROJ_docsdir)/html -# $(Verb) $(DataInstall) $(IMAGES) $(PROJ_docsdir)/html/img - $(Verb) $(DataInstall) $(PROJ_OBJ_DIR)/html.tar.gz $(PROJ_docsdir) + $(Verb) $(MKDIR) $(DESTDIR)$(PROJ_docsdir)/html + $(Verb) $(MKDIR) $(DESTDIR)$(PROJ_docsdir)/html/img + $(Verb) $(DataInstall) $(HTML) $(DESTDIR)$(PROJ_docsdir)/html +# $(Verb) $(DataInstall) $(IMAGES) $(DESTDIR)$(PROJ_docsdir)/html/img + $(Verb) $(DataInstall) $(PROJ_OBJ_DIR)/html.tar.gz $(DESTDIR)$(PROJ_docsdir) $(PROJ_OBJ_DIR)/html.tar.gz: $(HTML) $(Echo) Packaging HTML documentation @@ -63,11 +63,11 @@ $(PROJ_OBJ_DIR)/html.tar.gz: $(HTML) install-doxygen: doxygen $(Echo) Installing doxygen documentation - $(Verb) $(MKDIR) $(PROJ_docsdir)/html/doxygen - $(Verb) $(DataInstall) $(PROJ_OBJ_DIR)/doxygen.tar.gz $(PROJ_docsdir) + $(Verb) $(MKDIR) $(DESTDIR)$(PROJ_docsdir)/html/doxygen + $(Verb) $(DataInstall) $(PROJ_OBJ_DIR)/doxygen.tar.gz $(DESTDIR)$(PROJ_docsdir) $(Verb) cd $(PROJ_OBJ_DIR)/doxygen && \ $(FIND) . -type f -exec \ - $(DataInstall) {} $(PROJ_docsdir)/html/doxygen \; + $(DataInstall) {} $(DESTDIR)$(PROJ_docsdir)/html/doxygen \; doxygen: regendoc $(PROJ_OBJ_DIR)/doxygen.tar.gz @@ -94,4 +94,4 @@ $(LLVM_SRC_ROOT)/docs/userloc.html: uninstall-local:: $(Echo) Uninstalling Documentation - $(Verb) $(RM) -rf $(PROJ_docsdir) + $(Verb) $(RM) -rf $(DESTDIR)$(PROJ_docsdir) Modified: vendor/clang/dist/docs/tools/Makefile ============================================================================== --- vendor/clang/dist/docs/tools/Makefile Sat Mar 6 09:22:29 2010 (r204792) +++ vendor/clang/dist/docs/tools/Makefile Sat Mar 6 09:23:02 2010 (r204793) @@ -84,9 +84,9 @@ EXTRA_DIST := $(POD) clean-local:: $(Verb) $(RM) -f pod2htm*.*~~ $(HTML) $(MAN) $(PS) -HTML_DIR := $(PROJ_docsdir)/html/clang -MAN_DIR := $(PROJ_mandir)/man1 -PS_DIR := $(PROJ_docsdir)/ps +HTML_DIR := $(DESTDIR)$(PROJ_docsdir)/html/clang +MAN_DIR := $(DESTDIR)$(PROJ_mandir)/man1 +PS_DIR := $(DESTDIR)$(PROJ_docsdir)/ps install-html:: $(HTML) $(Echo) Installing HTML Clang Tools Documentation Modified: vendor/clang/dist/include/clang/AST/ASTContext.h ============================================================================== --- vendor/clang/dist/include/clang/AST/ASTContext.h Sat Mar 6 09:22:29 2010 (r204792) +++ vendor/clang/dist/include/clang/AST/ASTContext.h Sat Mar 6 09:23:02 2010 (r204793) @@ -621,7 +621,8 @@ public: /// given interface decl and the conforming protocol list. QualType getObjCObjectPointerType(QualType OIT, ObjCProtocolDecl **ProtocolList = 0, - unsigned NumProtocols = 0); + unsigned NumProtocols = 0, + unsigned Quals = 0); /// getTypeOfType - GCC extension. QualType getTypeOfExprType(Expr *e); Modified: vendor/clang/dist/include/clang/AST/DeclBase.h ============================================================================== --- vendor/clang/dist/include/clang/AST/DeclBase.h Sat Mar 6 09:22:29 2010 (r204792) +++ vendor/clang/dist/include/clang/AST/DeclBase.h Sat Mar 6 09:23:02 2010 (r204793) @@ -268,7 +268,7 @@ public: /// setInvalidDecl - Indicates the Decl had a semantic error. This /// allows for graceful error recovery. - void setInvalidDecl(bool Invalid = true) { InvalidDecl = Invalid; } + void setInvalidDecl(bool Invalid = true); bool isInvalidDecl() const { return (bool) InvalidDecl; } /// isImplicit - Indicates whether the declaration was implicitly Modified: vendor/clang/dist/include/clang/Basic/Builtins.def ============================================================================== --- vendor/clang/dist/include/clang/Basic/Builtins.def Sat Mar 6 09:22:29 2010 (r204792) +++ vendor/clang/dist/include/clang/Basic/Builtins.def Sat Mar 6 09:23:02 2010 (r204793) @@ -240,6 +240,11 @@ BUILTIN(__builtin_isinf_sign, "i.", "nc" BUILTIN(__builtin_isnan, "i.", "nc") BUILTIN(__builtin_isnormal, "i.", "nc") +// FP signbit builtins +BUILTIN(__builtin_signbit, "id", "nc") +BUILTIN(__builtin_signbitf, "if", "nc") +BUILTIN(__builtin_signbitl, "iLd", "nc") + // Builtins for arithmetic. BUILTIN(__builtin_clz , "iUi" , "nc") BUILTIN(__builtin_clzl , "iULi" , "nc") Added: vendor/clang/dist/include/clang/Basic/BuiltinsARM.def ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ vendor/clang/dist/include/clang/Basic/BuiltinsARM.def Sat Mar 6 09:23:02 2010 (r204793) @@ -0,0 +1,20 @@ +//===--- BuiltinsARM.def - ARM Builtin function database ----*- 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 ARM-specific builtin function database. Users of +// this file must define the BUILTIN macro to make use of this information. +// +//===----------------------------------------------------------------------===// + +// The format of this database matches clang/Basic/Builtins.def. + +// FIXME: This is just a placeholder. NEON intrinsics should be listed here. +BUILTIN(__builtin_thread_pointer, "v*", "") + +#undef BUILTIN Modified: vendor/clang/dist/include/clang/Basic/BuiltinsX86.def ============================================================================== --- vendor/clang/dist/include/clang/Basic/BuiltinsX86.def Sat Mar 6 09:22:29 2010 (r204792) +++ vendor/clang/dist/include/clang/Basic/BuiltinsX86.def Sat Mar 6 09:23:02 2010 (r204793) @@ -281,8 +281,8 @@ BUILTIN(__builtin_ia32_pmovzxwq128, "V2L BUILTIN(__builtin_ia32_pmuldq128, "V2LLiV4iV4i", "") BUILTIN(__builtin_ia32_pmulld128, "V4iV4iV4i", "") BUILTIN(__builtin_ia32_roundps, "V4fV4fi", "") -BUILTIN(__builtin_ia32_roundss, "V4fV4fi", "") -BUILTIN(__builtin_ia32_roundsd, "V2dV2di", "") +BUILTIN(__builtin_ia32_roundss, "V4fV4fV4fi", "") +BUILTIN(__builtin_ia32_roundsd, "V2dV2dV2di", "") BUILTIN(__builtin_ia32_roundpd, "V2dV2di", "") Modified: vendor/clang/dist/include/clang/Basic/DiagnosticSemaKinds.td ============================================================================== --- vendor/clang/dist/include/clang/Basic/DiagnosticSemaKinds.td Sat Mar 6 09:22:29 2010 (r204792) +++ vendor/clang/dist/include/clang/Basic/DiagnosticSemaKinds.td Sat Mar 6 09:23:02 2010 (r204793) @@ -1587,11 +1587,12 @@ def err_undeclared_label_use : Error<"us def err_goto_into_protected_scope : Error<"illegal goto into protected scope">; def err_switch_into_protected_scope : Error< "illegal switch case into protected scope">; -def err_indirect_goto_in_protected_scope : Error< - "illegal indirect goto in protected scope, unknown effect on scopes">; -def err_addr_of_label_in_protected_scope : Error< +def err_indirect_goto_in_protected_scope : Warning< + "illegal indirect goto in protected scope, unknown effect on scopes">, + InGroup>; +def err_addr_of_label_in_protected_scope : Warning< "address taken of label in protected scope, jump to it would have " - "unknown effect on scope">; + "unknown effect on scope">, InGroup>; def note_protected_by_variable_init : Note< "jump bypasses variable initialization">; def note_protected_by_vla_typedef : Note< Modified: vendor/clang/dist/include/clang/Basic/TargetBuiltins.h ============================================================================== --- vendor/clang/dist/include/clang/Basic/TargetBuiltins.h Sat Mar 6 09:22:29 2010 (r204792) +++ vendor/clang/dist/include/clang/Basic/TargetBuiltins.h Sat Mar 6 09:23:02 2010 (r204793) @@ -14,12 +14,13 @@ #undef PPC namespace clang { - /// X86 builtins - namespace X86 { + + /// ARM builtins + namespace ARM { enum { LastTIBuiltin = clang::Builtin::FirstTSBuiltin-1, #define BUILTIN(ID, TYPE, ATTRS) BI##ID, -#include "clang/Basic/BuiltinsX86.def" +#include "clang/Basic/BuiltinsARM.def" LastTSBuiltin }; } @@ -33,6 +34,17 @@ namespace clang { LastTSBuiltin }; } + + /// X86 builtins + namespace X86 { + enum { + LastTIBuiltin = clang::Builtin::FirstTSBuiltin-1, +#define BUILTIN(ID, TYPE, ATTRS) BI##ID, +#include "clang/Basic/BuiltinsX86.def" + LastTSBuiltin + }; + } + } // end namespace clang. #endif Modified: vendor/clang/dist/include/clang/Basic/TokenKinds.def ============================================================================== --- vendor/clang/dist/include/clang/Basic/TokenKinds.def Sat Mar 6 09:22:29 2010 (r204792) +++ vendor/clang/dist/include/clang/Basic/TokenKinds.def Sat Mar 6 09:23:02 2010 (r204793) @@ -336,8 +336,6 @@ KEYWORD(__declspec , KE KEYWORD(__cdecl , KEYALL) KEYWORD(__stdcall , KEYALL) KEYWORD(__fastcall , KEYALL) -KEYWORD(__ptr64 , KEYALL) -KEYWORD(__w64 , KEYALL) KEYWORD(__forceinline , KEYALL) // Altivec Extension. @@ -368,6 +366,8 @@ ALIAS("__volatile" , volatile , KEYA ALIAS("__volatile__" , volatile , KEYALL) // Microsoft extensions which should be disabled in strict conformance mode +KEYWORD(__ptr64 , KEYMS) +KEYWORD(__w64 , KEYMS) ALIAS("_asm" , asm , KEYMS) ALIAS("_cdecl" , __cdecl , KEYMS) ALIAS("_fastcall" , __fastcall , KEYMS) Modified: vendor/clang/dist/include/clang/Checker/PathSensitive/Environment.h ============================================================================== --- vendor/clang/dist/include/clang/Checker/PathSensitive/Environment.h Sat Mar 6 09:22:29 2010 (r204792) +++ vendor/clang/dist/include/clang/Checker/PathSensitive/Environment.h Sat Mar 6 09:23:02 2010 (r204793) @@ -26,7 +26,6 @@ namespace clang { -class AnalysisContext; class EnvironmentManager; class ValueManager; class LiveVariables; @@ -41,10 +40,9 @@ private: // Data. BindingsTy ExprBindings; - AnalysisContext *ACtx; - Environment(BindingsTy eb, AnalysisContext *aCtx) - : ExprBindings(eb), ACtx(aCtx) {} + Environment(BindingsTy eb) + : ExprBindings(eb) {} public: typedef BindingsTy::iterator iterator; @@ -58,8 +56,6 @@ public: SVal GetSVal(const Stmt* Ex, ValueManager& ValMgr) const; - AnalysisContext &getAnalysisContext() const { return *ACtx; } - /// Profile - Profile the contents of an Environment object for use /// in a FoldingSet. static void Profile(llvm::FoldingSetNodeID& ID, const Environment* E) { @@ -86,8 +82,8 @@ public: EnvironmentManager(llvm::BumpPtrAllocator& Allocator) : F(Allocator) {} ~EnvironmentManager() {} - Environment getInitialEnvironment(AnalysisContext *ACtx) { - return Environment(F.GetEmptyMap(), ACtx); + Environment getInitialEnvironment() { + return Environment(F.GetEmptyMap()); } Environment BindExpr(Environment Env, const Stmt *S, SVal V, Modified: vendor/clang/dist/include/clang/Checker/PathSensitive/GRState.h ============================================================================== --- vendor/clang/dist/include/clang/Checker/PathSensitive/GRState.h Sat Mar 6 09:22:29 2010 (r204792) +++ vendor/clang/dist/include/clang/Checker/PathSensitive/GRState.h Sat Mar 6 09:23:02 2010 (r204793) @@ -109,12 +109,6 @@ public: return *StateMgr; } - /// getAnalysisContext - Return the AnalysisContext associated with this - /// state. - AnalysisContext &getAnalysisContext() const { - return Env.getAnalysisContext(); - } - /// getEnvironment - Return the environment associated with this state. /// The environment is the mapping from expressions to values. const Environment& getEnvironment() const { return Env; } @@ -133,7 +127,6 @@ public: /// Profile - Profile the contents of a GRState object for use /// in a FoldingSet. static void Profile(llvm::FoldingSetNodeID& ID, const GRState* V) { - // FIXME: Do we need to include the AnalysisContext in the profile? V->Env.Profile(ID); ID.AddPointer(V->St); V->GDM.Profile(ID); @@ -337,12 +330,12 @@ public: }; // Pretty-printing. - void print(llvm::raw_ostream& Out, const char *nl = "\n", + void print(llvm::raw_ostream& Out, CFG &C, const char *nl = "\n", const char *sep = "") const; - void printStdErr() const; + void printStdErr(CFG &C) const; - void printDOT(llvm::raw_ostream& Out) const; + void printDOT(llvm::raw_ostream& Out, CFG &C) const; }; class GRStateSet { Modified: vendor/clang/dist/include/clang/Checker/PathSensitive/SymbolManager.h ============================================================================== --- vendor/clang/dist/include/clang/Checker/PathSensitive/SymbolManager.h Sat Mar 6 09:22:29 2010 (r204792) +++ vendor/clang/dist/include/clang/Checker/PathSensitive/SymbolManager.h Sat Mar 6 09:23:02 2010 (r204793) @@ -331,23 +331,20 @@ class SymbolReaper { SetTy TheLiving; SetTy TheDead; - LiveVariables& Liveness; + const LocationContext *LCtx; SymbolManager& SymMgr; - const StackFrameContext *CurrentStackFrame; public: - SymbolReaper(LiveVariables& liveness, SymbolManager& symmgr, - const StackFrameContext *currentStackFrame) - : Liveness(liveness), SymMgr(symmgr), CurrentStackFrame(currentStackFrame) - {} + SymbolReaper(const LocationContext *ctx, SymbolManager& symmgr) + : LCtx(ctx), SymMgr(symmgr) {} ~SymbolReaper() {} + const LocationContext *getLocationContext() const { return LCtx; } + bool isLive(SymbolRef sym); - bool isLive(const Stmt* Loc, const Stmt* ExprVal) const { - return Liveness.isLive(Loc, ExprVal); - } + bool isLive(const Stmt* Loc, const Stmt* ExprVal) const; bool isLive(const Stmt* Loc, const VarRegion *VR) const; Modified: vendor/clang/dist/include/clang/Driver/HostInfo.h ============================================================================== --- vendor/clang/dist/include/clang/Driver/HostInfo.h Sat Mar 6 09:22:29 2010 (r204792) +++ vendor/clang/dist/include/clang/Driver/HostInfo.h Sat Mar 6 09:23:02 2010 (r204793) @@ -80,6 +80,8 @@ const HostInfo *createDragonFlyHostInfo( const llvm::Triple& Triple); const HostInfo *createLinuxHostInfo(const Driver &D, const llvm::Triple& Triple); +const HostInfo *createTCEHostInfo(const Driver &D, + const llvm::Triple& Triple); const HostInfo *createUnknownHostInfo(const Driver &D, const llvm::Triple& Triple); Modified: vendor/clang/dist/include/clang/Driver/Options.td ============================================================================== --- vendor/clang/dist/include/clang/Driver/Options.td Sat Mar 6 09:22:29 2010 (r204792) +++ vendor/clang/dist/include/clang/Driver/Options.td Sat Mar 6 09:23:02 2010 (r204793) @@ -64,6 +64,7 @@ def clang_ignored_m_Group : OptionGroup< // , => _COMMA // = => _EQ // C++ => CXX +// . => _ // Developer Driver Options @@ -420,6 +421,8 @@ def mno_sse2 : Flag<"-mno-sse2">, Group< def mno_sse3 : Flag<"-mno-sse3">, Group; def mno_sse4a : Flag<"-mno-sse4a">, Group; def mno_sse4 : Flag<"-mno-sse4">, Group; +def mno_sse4_1 : Flag<"-mno-sse4.1">, Group; +def mno_sse4_2 : Flag<"-mno-sse4.2">, Group; def mno_sse : Flag<"-mno-sse">, Group; def mno_ssse3 : Flag<"-mno-ssse3">, Group; @@ -434,6 +437,8 @@ def msse2 : Flag<"-msse2">, Group, Group; def msse4a : Flag<"-msse4a">, Group; def msse4 : Flag<"-msse4">, Group; +def msse4_1 : Flag<"-msse4.1">, Group; +def msse4_2 : Flag<"-msse4.2">, Group; def msse : Flag<"-msse">, Group; def mssse3 : Flag<"-mssse3">, Group; def mthumb : Flag<"-mthumb">, Group; Modified: vendor/clang/dist/include/clang/Frontend/ASTUnit.h ============================================================================== --- vendor/clang/dist/include/clang/Frontend/ASTUnit.h Sat Mar 6 09:22:29 2010 (r204792) +++ vendor/clang/dist/include/clang/Frontend/ASTUnit.h Sat Mar 6 09:23:02 2010 (r204793) @@ -88,11 +88,39 @@ class ASTUnit { /// \brief Temporary files that should be removed when the ASTUnit is /// destroyed. llvm::SmallVector TemporaryFiles; + + /// \brief Simple hack to allow us to assert that ASTUnit is not being + /// used concurrently, which is not supported. + /// + /// Clients should create instances of the ConcurrencyCheck class whenever + /// using the ASTUnit in a way that isn't intended to be concurrent, which is + /// just about any usage. + unsigned int ConcurrencyCheckValue; + static const unsigned int CheckLocked = 28573289; + static const unsigned int CheckUnlocked = 9803453; ASTUnit(const ASTUnit&); // DO NOT IMPLEMENT ASTUnit &operator=(const ASTUnit &); // DO NOT IMPLEMENT - + public: + class ConcurrencyCheck { + volatile ASTUnit &Self; + + public: + explicit ConcurrencyCheck(ASTUnit &Self) + : Self(Self) + { + assert(Self.ConcurrencyCheckValue == CheckUnlocked && + "Concurrent access to ASTUnit!"); + Self.ConcurrencyCheckValue = CheckLocked; + } + + ~ConcurrencyCheck() { + Self.ConcurrencyCheckValue = CheckUnlocked; + } + }; + friend class ConcurrencyCheck; + ASTUnit(bool MainFileIsAST); ~ASTUnit(); Modified: vendor/clang/dist/lib/AST/ASTContext.cpp ============================================================================== --- vendor/clang/dist/lib/AST/ASTContext.cpp Sat Mar 6 09:22:29 2010 (r204792) +++ vendor/clang/dist/lib/AST/ASTContext.cpp Sat Mar 6 09:23:02 2010 (r204793) @@ -2240,14 +2240,16 @@ static void SortAndUniqueProtocols(ObjCP /// the given interface decl and the conforming protocol list. QualType ASTContext::getObjCObjectPointerType(QualType InterfaceT, ObjCProtocolDecl **Protocols, - unsigned NumProtocols) { + unsigned NumProtocols, + unsigned Quals) { llvm::FoldingSetNodeID ID; ObjCObjectPointerType::Profile(ID, InterfaceT, Protocols, NumProtocols); + Qualifiers Qs = Qualifiers::fromCVRMask(Quals); void *InsertPos = 0; if (ObjCObjectPointerType *QT = ObjCObjectPointerTypes.FindNodeOrInsertPos(ID, InsertPos)) - return QualType(QT, 0); + return getQualifiedType(QualType(QT, 0), Qs); // Sort the protocol list alphabetically to canonicalize it. QualType Canonical; @@ -2282,7 +2284,7 @@ QualType ASTContext::getObjCObjectPointe Types.push_back(QType); ObjCObjectPointerTypes.InsertNode(QType, InsertPos); - return QualType(QType, 0); + return getQualifiedType(QualType(QType, 0), Qs); } /// getObjCInterfaceType - Return the unique reference to the type for the Modified: vendor/clang/dist/lib/AST/DeclBase.cpp ============================================================================== --- vendor/clang/dist/lib/AST/DeclBase.cpp Sat Mar 6 09:22:29 2010 (r204792) +++ vendor/clang/dist/lib/AST/DeclBase.cpp Sat Mar 6 09:23:02 2010 (r204793) @@ -46,6 +46,16 @@ const char *Decl::getDeclKindName() cons } } +void Decl::setInvalidDecl(bool Invalid) { + InvalidDecl = Invalid; + if (Invalid) { + // Defensive maneuver for ill-formed code: we're likely not to make it to + // a point where we set the access specifier, so default it to "public" + // to avoid triggering asserts elsewhere in the front end. + setAccess(AS_public); + } +} + const char *DeclContext::getDeclKindName() const { switch (DeclKind) { default: assert(0 && "Declaration context not in DeclNodes.def!"); Modified: vendor/clang/dist/lib/Basic/Targets.cpp ============================================================================== --- vendor/clang/dist/lib/Basic/Targets.cpp Sat Mar 6 09:22:29 2010 (r204792) +++ vendor/clang/dist/lib/Basic/Targets.cpp Sat Mar 6 09:23:02 2010 (r204793) @@ -734,8 +734,10 @@ void X86TargetInfo::getDefaultFeatures(c bool X86TargetInfo::setFeatureEnabled(llvm::StringMap &Features, const std::string &Name, bool Enabled) const { - // FIXME: This *really* should not be here. - if (!Features.count(Name) && Name != "sse4") + // FIXME: This *really* should not be here. We need some way of translating + // options into llvm subtarget features. + if (!Features.count(Name) && + (Name != "sse4" && Name != "sse4.2" && Name != "sse4.1")) return false; if (Enabled) { @@ -751,9 +753,12 @@ bool X86TargetInfo::setFeatureEnabled(ll else if (Name == "ssse3") Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] = Features["ssse3"] = true; - else if (Name == "sse4") + else if (Name == "sse4" || Name == "sse4.2") Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] = Features["ssse3"] = Features["sse41"] = Features["sse42"] = true; + else if (Name == "sse4.1") + Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] = + Features["ssse3"] = Features["sse41"] = true; else if (Name == "3dnow") Features["3dnowa"] = true; else if (Name == "3dnowa") @@ -775,6 +780,10 @@ bool X86TargetInfo::setFeatureEnabled(ll Features["ssse3"] = Features["sse41"] = Features["sse42"] = false; else if (Name == "sse4") Features["sse41"] = Features["sse42"] = false; + else if (Name == "sse4.2") + Features["sse42"] = false; + else if (Name == "sse4.1") + Features["sse41"] = Features["sse42"] = false; else if (Name == "3dnow") Features["3dnow"] = Features["3dnowa"] = false; else if (Name == "3dnowa") @@ -1207,6 +1216,8 @@ class ARMTargetInfo : public TargetInfo unsigned SoftFloat : 1; unsigned SoftFloatABI : 1; + static const Builtin::Info BuiltinInfo[]; + public: ARMTargetInfo(const std::string &TripleStr) : TargetInfo(TripleStr), ABI("aapcs-linux"), CPU("arm1136j-s") @@ -1393,9 +1404,8 @@ public: } virtual void getTargetBuiltins(const Builtin::Info *&Records, unsigned &NumRecords) const { - // FIXME: Implement. - Records = 0; - NumRecords = 0; + Records = BuiltinInfo; + NumRecords = clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin; } virtual const char *getVAListDeclaration() const { return "typedef char* __builtin_va_list;"; @@ -1460,6 +1470,12 @@ void ARMTargetInfo::getGCCRegAliases(con Aliases = GCCRegAliases; NumAliases = llvm::array_lengthof(GCCRegAliases); } + +const Builtin::Info ARMTargetInfo::BuiltinInfo[] = { +#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, false }, +#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER, false }, +#include "clang/Basic/BuiltinsARM.def" +}; } // end anonymous namespace. @@ -1892,9 +1908,10 @@ namespace { FloatFormat = &llvm::APFloat::IEEEsingle; DoubleFormat = &llvm::APFloat::IEEEsingle; LongDoubleFormat = &llvm::APFloat::IEEEsingle; - DescriptionString = "E-p:32:32:32-a0:32:32" - "-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64" - "-f32:32:32-f64:32:64-n32"; + DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:32-" + "i16:16:32-i32:32:32-i64:32:32-" + "f32:32:32-f64:64:64-v64:64:64-" + "v128:128:128-a0:0:64-n32"; } virtual void getTargetDefines(const LangOptions &Opts, Modified: vendor/clang/dist/lib/Basic/Version.cpp ============================================================================== --- vendor/clang/dist/lib/Basic/Version.cpp Sat Mar 6 09:22:29 2010 (r204792) +++ vendor/clang/dist/lib/Basic/Version.cpp Sat Mar 6 09:23:02 2010 (r204793) @@ -45,7 +45,7 @@ std::string getClangRevision() { std::string revision; llvm::raw_string_ostream OS(revision); OS << strtol(SVN_REVISION, 0, 10); - return revision; + return OS.str(); } #endif return ""; @@ -58,7 +58,7 @@ std::string getClangFullRepositoryVersio const std::string &Revision = getClangRevision(); if (!Revision.empty()) OS << ' ' << Revision; - return buf; + return OS.str(); } std::string getClangFullVersion() { @@ -69,7 +69,7 @@ std::string getClangFullVersion() { #endif OS << "clang version " CLANG_VERSION_STRING " (" << getClangFullRepositoryVersion() << ')'; - return buf; + return OS.str(); } } // end namespace clang Modified: vendor/clang/dist/lib/Checker/Environment.cpp ============================================================================== --- vendor/clang/dist/lib/Checker/Environment.cpp Sat Mar 6 09:22:29 2010 (r204792) +++ vendor/clang/dist/lib/Checker/Environment.cpp Sat Mar 6 09:23:02 2010 (r204793) @@ -78,12 +78,12 @@ Environment EnvironmentManager::BindExpr if (V.isUnknown()) { if (Invalidate) - return Environment(F.Remove(Env.ExprBindings, S), Env.ACtx); + return Environment(F.Remove(Env.ExprBindings, S)); else return Env; } - return Environment(F.Add(Env.ExprBindings, S, V), Env.ACtx); + return Environment(F.Add(Env.ExprBindings, S, V)); } namespace { @@ -109,12 +109,12 @@ EnvironmentManager::RemoveDeadBindings(E const GRState *ST, llvm::SmallVectorImpl &DRoots) { - CFG &C = *Env.getAnalysisContext().getCFG(); + CFG &C = *SymReaper.getLocationContext()->getCFG(); // We construct a new Environment object entirely, as this is cheaper than // individually removing all the subexpression bindings (which will greatly // outnumber block-level expression bindings). - Environment NewEnv = getInitialEnvironment(&Env.getAnalysisContext()); + Environment NewEnv = getInitialEnvironment(); // Iterate over the block-expr bindings. for (Environment::iterator I = Env.begin(), E = Env.end(); Modified: vendor/clang/dist/lib/Checker/GRExprEngine.cpp ============================================================================== --- vendor/clang/dist/lib/Checker/GRExprEngine.cpp Sat Mar 6 09:22:29 2010 (r204792) +++ vendor/clang/dist/lib/Checker/GRExprEngine.cpp Sat Mar 6 09:23:02 2010 (r204793) @@ -477,8 +477,9 @@ void GRExprEngine::ProcessStmt(CFGElemen // Create the cleaned state. const ExplodedNode *BasePred = Builder->getBasePredecessor(); - SymbolReaper SymReaper(BasePred->getLiveVariables(), SymMgr, - BasePred->getLocationContext()->getCurrentStackFrame()); + + SymbolReaper SymReaper(BasePred->getLocationContext(), SymMgr); + CleanedState = AMgr.shouldPurgeDead() ? StateMgr.RemoveDeadBindings(EntryNode->getState(), CurrentStmt, SymReaper) : EntryNode->getState(); @@ -3319,7 +3320,7 @@ struct DOTGraphTraits : Out << "\\|StateID: " << (void*) N->getState() << "\\|"; const GRState *state = N->getState(); - state->printDOT(Out); + state->printDOT(Out, *N->getLocationContext()->getCFG()); Out << "\\l"; return Out.str(); Modified: vendor/clang/dist/lib/Checker/GRState.cpp ============================================================================== --- vendor/clang/dist/lib/Checker/GRState.cpp Sat Mar 6 09:22:29 2010 (r204792) +++ vendor/clang/dist/lib/Checker/GRState.cpp Sat Mar 6 09:23:02 2010 (r204793) @@ -99,7 +99,7 @@ const GRState *GRState::BindExpr(const S const GRState* GRStateManager::getInitialState(const LocationContext *InitLoc) { GRState State(this, - EnvMgr.getInitialEnvironment(InitLoc->getAnalysisContext()), + EnvMgr.getInitialEnvironment(), StoreMgr->getInitialStore(InitLoc), GDMFactory.GetEmptyMap()); @@ -131,14 +131,12 @@ const GRState* GRState::makeWithStore(St // State pretty-printing. //===----------------------------------------------------------------------===// -void GRState::print(llvm::raw_ostream& Out, const char* nl, +void GRState::print(llvm::raw_ostream& Out, CFG &C, const char* nl, const char* sep) const { // Print the store. GRStateManager &Mgr = getStateManager(); Mgr.getStoreManager().print(getStore(), Out, nl, sep); - CFG &C = *getAnalysisContext().getCFG(); - // Print Subexpression bindings. bool isFirst = true; @@ -186,12 +184,12 @@ void GRState::print(llvm::raw_ostream& O } } -void GRState::printDOT(llvm::raw_ostream& Out) const { - print(Out, "\\l", "\\|"); +void GRState::printDOT(llvm::raw_ostream& Out, CFG &C) const { + print(Out, C, "\\l", "\\|"); } -void GRState::printStdErr() const { - print(llvm::errs()); +void GRState::printStdErr(CFG &C) const { + print(llvm::errs(), C); } //===----------------------------------------------------------------------===// Modified: vendor/clang/dist/lib/Checker/SymbolManager.cpp ============================================================================== --- vendor/clang/dist/lib/Checker/SymbolManager.cpp Sat Mar 6 09:22:29 2010 (r204792) +++ vendor/clang/dist/lib/Checker/SymbolManager.cpp Sat Mar 6 09:23:02 2010 (r204793) @@ -215,13 +215,17 @@ bool SymbolReaper::isLive(SymbolRef sym) return isa(sym); } +bool SymbolReaper::isLive(const Stmt* Loc, const Stmt* ExprVal) const { + return LCtx->getLiveVariables()->isLive(Loc, ExprVal); +} + bool SymbolReaper::isLive(const Stmt *Loc, const VarRegion *VR) const { const StackFrameContext *SFC = VR->getStackFrame(); - if (SFC == CurrentStackFrame) - return Liveness.isLive(Loc, VR->getDecl()); + if (SFC == LCtx->getCurrentStackFrame()) + return LCtx->getLiveVariables()->isLive(Loc, VR->getDecl()); else - return SFC->isParentOf(CurrentStackFrame); + return SFC->isParentOf(LCtx->getCurrentStackFrame()); } SymbolVisitor::~SymbolVisitor() {} Modified: vendor/clang/dist/lib/CodeGen/CGBlocks.cpp ============================================================================== --- vendor/clang/dist/lib/CodeGen/CGBlocks.cpp Sat Mar 6 09:22:29 2010 (r204792) +++ vendor/clang/dist/lib/CodeGen/CGBlocks.cpp Sat Mar 6 09:23:02 2010 (r204793) @@ -154,7 +154,7 @@ llvm::Value *CodeGenFunction::BuildBlock { // C = BuildBlockStructInitlist(); - unsigned int flags = BLOCK_HAS_OBJC_TYPE; + unsigned int flags = BLOCK_HAS_SIGNATURE; // We run this first so that we set BlockHasCopyDispose from the entire // block literal. @@ -184,6 +184,18 @@ llvm::Value *CodeGenFunction::BuildBlock Elts[0] = C; // __flags + { + QualType BPT = BE->getType(); + const FunctionType *ftype = BPT->getPointeeType()->getAs(); + QualType ResultType = ftype->getResultType(); + + CallArgList Args; + CodeGenTypes &Types = CGM.getTypes(); + const CGFunctionInfo &FnInfo = Types.getFunctionInfo(ResultType, Args, + CC_Default, false); + if (CGM.ReturnTypeUsesSret(FnInfo)) + flags |= BLOCK_USE_STRET; + } const llvm::IntegerType *IntTy = cast( CGM.getTypes().ConvertType(CGM.getContext().IntTy)); C = llvm::ConstantInt::get(IntTy, flags); @@ -200,6 +212,7 @@ llvm::Value *CodeGenFunction::BuildBlock // Optimize to being a global block. Elts[0] = CGM.getNSConcreteGlobalBlock(); + Elts[1] = llvm::ConstantInt::get(IntTy, flags|BLOCK_IS_GLOBAL); C = llvm::ConstantStruct::get(VMContext, Elts, false); @@ -604,7 +617,7 @@ BlockModule::GetAddrOfGlobalBlock(const // Flags LiteralFields[1] = - llvm::ConstantInt::get(IntTy, BLOCK_IS_GLOBAL | BLOCK_HAS_OBJC_TYPE); + llvm::ConstantInt::get(IntTy, BLOCK_IS_GLOBAL | BLOCK_HAS_SIGNATURE); // Reserved LiteralFields[2] = llvm::Constant::getNullValue(IntTy); Modified: vendor/clang/dist/lib/CodeGen/CGBlocks.h ============================================================================== --- vendor/clang/dist/lib/CodeGen/CGBlocks.h Sat Mar 6 09:22:29 2010 (r204792) +++ vendor/clang/dist/lib/CodeGen/CGBlocks.h Sat Mar 6 09:23:02 2010 (r204793) @@ -54,10 +54,12 @@ public: BLOCK_HAS_COPY_DISPOSE = (1 << 25), BLOCK_HAS_CXX_OBJ = (1 << 26), BLOCK_IS_GLOBAL = (1 << 28), - BLOCK_HAS_OBJC_TYPE = (1 << 30) + BLOCK_USE_STRET = (1 << 29), + BLOCK_HAS_SIGNATURE = (1 << 30) }; }; + class BlockModule : public BlockBase { ASTContext &Context; llvm::Module &TheModule; Modified: vendor/clang/dist/lib/CodeGen/CGBuiltin.cpp ============================================================================== --- vendor/clang/dist/lib/CodeGen/CGBuiltin.cpp Sat Mar 6 09:22:29 2010 (r204792) +++ vendor/clang/dist/lib/CodeGen/CGBuiltin.cpp Sat Mar 6 09:23:02 2010 (r204793) @@ -387,6 +387,22 @@ RValue CodeGenFunction::EmitBuiltinExpr( Value *Result = getTargetHooks().encodeReturnAddress(*this, Address); return RValue::get(Result); } + case Builtin::BI__builtin_dwarf_sp_column: { + const llvm::IntegerType *Ty + = cast(ConvertType(E->getType())); + int Column = getTargetHooks().getDwarfEHStackPointer(CGM); + if (Column == -1) { + CGM.ErrorUnsupported(E, "__builtin_dwarf_sp_column"); + return RValue::get(llvm::UndefValue::get(Ty)); + } + return RValue::get(llvm::ConstantInt::get(Ty, Column, true)); + } + case Builtin::BI__builtin_init_dwarf_reg_size_table: { + Value *Address = EmitScalarExpr(E->getArg(0)); + if (getTargetHooks().initDwarfEHRegSizeTable(*this, Address)) + CGM.ErrorUnsupported(E, "__builtin_init_dwarf_reg_size_table"); + return RValue::get(llvm::UndefValue::get(ConvertType(E->getType()))); + } case Builtin::BI__builtin_eh_return: { Value *Int = EmitScalarExpr(E->getArg(0)); Value *Ptr = EmitScalarExpr(E->getArg(1)); @@ -666,6 +682,23 @@ RValue CodeGenFunction::EmitBuiltinExpr( Value *F = CGM.getIntrinsic(Intrinsic::pow, &ArgType, 1); return RValue::get(Builder.CreateCall2(F, Base, Exponent, "tmp")); } + + case Builtin::BI__builtin_signbit: + case Builtin::BI__builtin_signbitf: + case Builtin::BI__builtin_signbitl: { + LLVMContext &C = CGM.getLLVMContext(); + + Value *Arg = EmitScalarExpr(E->getArg(0)); + const llvm::Type *ArgTy = Arg->getType(); + if (ArgTy->isPPC_FP128Ty()) + break; // FIXME: I'm not sure what the right implementation is here. + int ArgWidth = ArgTy->getPrimitiveSizeInBits(); + const llvm::Type *ArgIntTy = llvm::IntegerType::get(C, ArgWidth); + Value *BCArg = Builder.CreateBitCast(Arg, ArgIntTy); + Value *ZeroCmp = llvm::Constant::getNullValue(ArgIntTy); + Value *Result = Builder.CreateICmpSLT(BCArg, ZeroCmp); + return RValue::get(Builder.CreateZExt(Result, ConvertType(E->getType()))); + } } // If this is an alias for a libm function (e.g. __builtin_sin) turn it into @@ -735,6 +768,9 @@ RValue CodeGenFunction::EmitBuiltinExpr( Value *CodeGenFunction::EmitTargetBuiltinExpr(unsigned BuiltinID, const CallExpr *E) { switch (Target.getTriple().getArch()) { + case llvm::Triple::arm: + case llvm::Triple::thumb: + return EmitARMBuiltinExpr(BuiltinID, E); case llvm::Triple::x86: case llvm::Triple::x86_64: return EmitX86BuiltinExpr(BuiltinID, E); @@ -746,6 +782,18 @@ Value *CodeGenFunction::EmitTargetBuilti } } +Value *CodeGenFunction::EmitARMBuiltinExpr(unsigned BuiltinID, + const CallExpr *E) { + switch (BuiltinID) { + default: return 0; + + case ARM::BI__builtin_thread_pointer: { + Value *AtomF = CGM.getIntrinsic(Intrinsic::arm_thread_pointer, 0, 0); + return Builder.CreateCall(AtomF); + } + } +} + Value *CodeGenFunction::EmitX86BuiltinExpr(unsigned BuiltinID, const CallExpr *E) { Modified: vendor/clang/dist/lib/CodeGen/CGCXX.cpp ============================================================================== --- vendor/clang/dist/lib/CodeGen/CGCXX.cpp Sat Mar 6 09:22:29 2010 (r204792) +++ vendor/clang/dist/lib/CodeGen/CGCXX.cpp Sat Mar 6 09:23:02 2010 (r204793) @@ -142,6 +142,12 @@ bool CodeGenModule::TryEmitDefinitionAsA return true; } + llvm::GlobalValue::LinkageTypes TargetLinkage + = getFunctionLinkage(cast(TargetDecl.getDecl())); + + if (llvm::GlobalValue::isWeakForLinker(TargetLinkage)) + return true; + // Derive the type for the alias. const llvm::PointerType *AliasType = getTypes().GetFunctionType(AliasDecl)->getPointerTo(); Modified: vendor/clang/dist/lib/CodeGen/CGExpr.cpp ============================================================================== --- vendor/clang/dist/lib/CodeGen/CGExpr.cpp Sat Mar 6 09:22:29 2010 (r204792) +++ vendor/clang/dist/lib/CodeGen/CGExpr.cpp Sat Mar 6 09:23:02 2010 (r204793) @@ -1062,6 +1062,16 @@ static LValue EmitFunctionDeclLValue(Cod LValue CodeGenFunction::EmitDeclRefLValue(const DeclRefExpr *E) { const NamedDecl *ND = E->getDecl(); + if (ND->hasAttr()) { + const ValueDecl* VD = cast(ND); + llvm::Constant *Aliasee = CGM.GetWeakRefReference(VD); + + Qualifiers Quals = MakeQualifiers(E->getType()); + LValue LV = LValue::MakeAddr(Aliasee, Quals); + + return LV; + } + if (const VarDecl *VD = dyn_cast(ND)) { // Check if this is a global variable. Modified: vendor/clang/dist/lib/CodeGen/CGExprConstant.cpp ============================================================================== --- vendor/clang/dist/lib/CodeGen/CGExprConstant.cpp Sat Mar 6 09:22:29 2010 (r204792) +++ vendor/clang/dist/lib/CodeGen/CGExprConstant.cpp Sat Mar 6 09:23:02 2010 (r204793) @@ -761,7 +761,9 @@ public: return C; } case Expr::DeclRefExprClass: { - NamedDecl *Decl = cast(E)->getDecl(); + ValueDecl *Decl = cast(E)->getDecl(); + if (Decl->hasAttr()) + return CGM.GetWeakRefReference(Decl); if (const FunctionDecl *FD = dyn_cast(Decl)) return CGM.GetAddrOfFunction(FD); if (const VarDecl* VD = dyn_cast(Decl)) { Modified: vendor/clang/dist/lib/CodeGen/CGExprScalar.cpp ============================================================================== --- vendor/clang/dist/lib/CodeGen/CGExprScalar.cpp Sat Mar 6 09:22:29 2010 (r204792) +++ vendor/clang/dist/lib/CodeGen/CGExprScalar.cpp Sat Mar 6 09:23:02 2010 (r204793) @@ -1888,6 +1888,8 @@ LValue CodeGenFunction::EmitObjCIsaExpr( V = CreateTempAlloca(ClassPtrTy, "resval"); llvm::Value *Src = EmitScalarExpr(BaseExpr); Builder.CreateStore(Src, V); + LValue LV = LValue::MakeAddr(V, MakeQualifiers(E->getType())); + V = ScalarExprEmitter(*this).EmitLoadOfLValue(LV, E->getType()); } else { if (E->isArrow()) Modified: vendor/clang/dist/lib/CodeGen/CGStmt.cpp ============================================================================== --- vendor/clang/dist/lib/CodeGen/CGStmt.cpp Sat Mar 6 09:22:29 2010 (r204792) +++ vendor/clang/dist/lib/CodeGen/CGStmt.cpp Sat Mar 6 09:23:02 2010 (r204793) @@ -915,18 +915,17 @@ void CodeGenFunction::EmitAsmStmt(const for (unsigned i = 0, e = S.getNumOutputs(); i != e; i++) { TargetInfo::ConstraintInfo Info(S.getOutputConstraint(i), S.getOutputName(i)); - assert(Target.validateOutputConstraint(Info) && - "Failed to parse output constraint"); + bool IsValid = Target.validateOutputConstraint(Info); (void)IsValid; + assert(IsValid && "Failed to parse output constraint"); OutputConstraintInfos.push_back(Info); } for (unsigned i = 0, e = S.getNumInputs(); i != e; i++) { TargetInfo::ConstraintInfo Info(S.getInputConstraint(i), S.getInputName(i)); - assert(Target.validateInputConstraint(OutputConstraintInfos.data(), - S.getNumOutputs(), - Info) && - "Failed to parse input constraint"); + bool IsValid = Target.validateInputConstraint(OutputConstraintInfos.data(), + S.getNumOutputs(), Info); + assert(IsValid && "Failed to parse input constraint"); (void)IsValid; InputConstraintInfos.push_back(Info); } Modified: vendor/clang/dist/lib/CodeGen/CodeGenFunction.h ============================================================================== --- vendor/clang/dist/lib/CodeGen/CodeGenFunction.h Sat Mar 6 09:22:29 2010 (r204792) +++ vendor/clang/dist/lib/CodeGen/CodeGenFunction.h Sat Mar 6 09:23:02 2010 (r204793) @@ -1122,6 +1122,7 @@ public: /// is unhandled by the current target. llvm::Value *EmitTargetBuiltinExpr(unsigned BuiltinID, const CallExpr *E); + llvm::Value *EmitARMBuiltinExpr(unsigned BuiltinID, const CallExpr *E); llvm::Value *EmitX86BuiltinExpr(unsigned BuiltinID, const CallExpr *E); llvm::Value *EmitPPCBuiltinExpr(unsigned BuiltinID, const CallExpr *E); Modified: vendor/clang/dist/lib/CodeGen/CodeGenModule.cpp ============================================================================== --- vendor/clang/dist/lib/CodeGen/CodeGenModule.cpp Sat Mar 6 09:22:29 2010 (r204792) +++ vendor/clang/dist/lib/CodeGen/CodeGenModule.cpp Sat Mar 6 09:23:02 2010 (r204793) @@ -33,6 +33,7 @@ #include "llvm/Module.h" #include "llvm/Intrinsics.h" #include "llvm/LLVMContext.h" +#include "llvm/ADT/Triple.h" #include "llvm/Target/TargetData.h" #include "llvm/Support/ErrorHandling.h" using namespace clang; @@ -89,6 +90,10 @@ void CodeGenModule::Release() { EmitLLVMUsed(); } +bool CodeGenModule::isTargetDarwin() const { + return getContext().Target.getTriple().getOS() == llvm::Triple::Darwin; +} + /// ErrorUnsupported - Print out an error that codegen doesn't support the /// specified stmt yet. void CodeGenModule::ErrorUnsupported(const Stmt *S, const char *Type, @@ -619,9 +624,41 @@ bool CodeGenModule::MayDeferGeneration(c return false; } +llvm::Constant *CodeGenModule::GetWeakRefReference(const ValueDecl *VD) { + const AliasAttr *AA = VD->getAttr(); + assert(AA && "No alias?"); + + const llvm::Type *DeclTy = getTypes().ConvertTypeForMem(VD->getType()); + + // Unique the name through the identifier table. + const char *AliaseeName = + getContext().Idents.get(AA->getAliasee()).getNameStart(); + + // See if there is already something with the target's name in the module. + llvm::GlobalValue *Entry = GlobalDeclMap[AliaseeName]; + + llvm::Constant *Aliasee; + if (isa(DeclTy)) + Aliasee = GetOrCreateLLVMFunction(AliaseeName, DeclTy, GlobalDecl()); + else + Aliasee = GetOrCreateLLVMGlobal(AliaseeName, + llvm::PointerType::getUnqual(DeclTy), 0); + if (!Entry) { + llvm::GlobalValue* F = cast(Aliasee); + F->setLinkage(llvm::Function::ExternalWeakLinkage); + WeakRefReferences.insert(F); + } + + return Aliasee; +} + void CodeGenModule::EmitGlobal(GlobalDecl GD) { const ValueDecl *Global = cast(GD.getDecl()); + // Weak references don't produce any output by themselves. + if (Global->hasAttr()) + return; + // If this is an alias definition (which otherwise looks like a declaration) // emit it now. if (Global->hasAttr()) @@ -708,6 +745,14 @@ llvm::Constant *CodeGenModule::GetOrCrea // Lookup the entry, lazily creating it if necessary. llvm::GlobalValue *&Entry = GlobalDeclMap[MangledName]; if (Entry) { + if (WeakRefReferences.count(Entry)) { + const FunctionDecl *FD = cast_or_null(D.getDecl()); + if (FD && !FD->hasAttr()) + Entry->setLinkage(llvm::Function::ExternalLinkage); + + WeakRefReferences.erase(Entry); + } + if (Entry->getType()->getElementType() == Ty) return Entry; *** DIFF OUTPUT TRUNCATED AT 1000 LINES ***