[llvm-commits] [llvm] r66339 - in /llvm/trunk: docs/ include/llvm-c/ include/llvm/ lib/Analysis/ lib/AsmParser/ lib/Bitcode/Reader/ lib/Bitcode/Writer/ lib/CodeGen/ lib/CodeGen/AsmPrinter/ lib/CodeGen/SelectionDAG/ lib/ExecutionEngine/JIT/ lib/Linker/ lib/Target/ lib/Target/ARM/ lib/Target/ARM/AsmPrinter/ lib/Target/Alpha/AsmPrinter/ lib/Target/CellSPU/AsmPrinter/ lib/Target/CppBackend/ lib/Target/IA64/ lib/Target/Mips/ lib/Target/PowerPC/AsmPrinter/ lib/Target/Sparc/AsmPrinter/ lib/Target/X86/ lib/Target/X86/AsmPrinte...

Nick Lewycky nicholas at mxc.ca
Sat Mar 7 22:13:47 PST 2009


Duncan, I can't build MultiSource/Applications/hbd due to this patch:

llvm-ld: LinkModules.cpp:510: bool GetLinkageResult(llvm::GlobalValue*, 
const llvm::GlobalValue*, llvm::GlobalValue::LinkageTypes&, bool&, 
std::string*): Assertion `(Dest->hasExternalLinkage() || 
Dest->hasDLLImportLinkage() || Dest->hasDLLExportLinkage() || 
Dest->hasExternalWeakLinkage()) && (Src->hasExternalLinkage() || 
Src->hasDLLImportLinkage() || Src->hasDLLExportLinkage() || 
Src->hasExternalWeakLinkage()) && "Unexpected linkage type!"' failed.
0   llvm-ld 0x0832b886
1   llvm-ld 0x0832be2d
2           0xffffe400 __kernel_sigreturn + 0
Stack dump:
0.      Program arguments: /home/nicholas/llvm-commit/Debug/bin/llvm-ld 
-link-as-library -disable-opt Output/access.bc Output/class.bc 
Output/cp.bc Output/d1-pushc.bc Output/d2-pushl.bc Output/d3-popl.bc 
Output/d4-array.bc Output/d5-stack.bc Output/d6-arith.bc 
Output/d7-cntrl.bc Output/d8-ret.bc Output/d9-swtch.bc 
Output/da-field.bc Output/db-meth.bc Output/dc-misc.bc Output/decomp.bc 
Output/err.bc Output/exp.bc Output/hbd.bc Output/id.bc Output/op.bc 
Output/sig.bc Output/version.bc -o Output/hbd.linked.rbc

Please take a look at lib/Linker/LinkModules.cpp GetLinkageResult and 
add support for your linkage types in there.

Nick

Duncan Sands wrote:
> Author: baldrick
> Date: Sat Mar  7 09:45:40 2009
> New Revision: 66339
> 
> URL: http://llvm.org/viewvc/llvm-project?rev=66339&view=rev
> Log:
> Introduce new linkage types linkonce_odr, weak_odr, common_odr
> and extern_weak_odr.  These are the same as the non-odr versions,
> except that they indicate that the global will only be overridden
> by an *equivalent* global.  In C, a function with weak linkage can
> be overridden by a function which behaves completely differently.
> This means that IP passes have to skip weak functions, since any
> deductions made from the function definition might be wrong, since
> the definition could be replaced by something completely different
> at link time.   This is not allowed in C++, thanks to the ODR
> (One-Definition-Rule): if a function is replaced by another at
> link-time, then the new function must be the same as the original
> function.  If a language knows that a function or other global can
> only be overridden by an equivalent global, it can give it the
> weak_odr linkage type, and the optimizers will understand that it
> is alright to make deductions based on the function body.  The
> code generators on the other hand map weak and weak_odr linkage
> to the same thing.
> 
> Modified:
>     llvm/trunk/docs/LangRef.html
>     llvm/trunk/docs/ProgrammersManual.html
>     llvm/trunk/include/llvm-c/Core.h
>     llvm/trunk/include/llvm/GlobalValue.h
>     llvm/trunk/lib/Analysis/DebugInfo.cpp
>     llvm/trunk/lib/AsmParser/LLLexer.cpp
>     llvm/trunk/lib/AsmParser/LLParser.cpp
>     llvm/trunk/lib/AsmParser/LLToken.h
>     llvm/trunk/lib/Bitcode/Reader/BitcodeReader.cpp
>     llvm/trunk/lib/Bitcode/Writer/BitcodeWriter.cpp
>     llvm/trunk/lib/CodeGen/AsmPrinter/DwarfWriter.cpp
>     llvm/trunk/lib/CodeGen/ELFWriter.cpp
>     llvm/trunk/lib/CodeGen/IntrinsicLowering.cpp
>     llvm/trunk/lib/CodeGen/MachOWriter.cpp
>     llvm/trunk/lib/CodeGen/SelectionDAG/TargetLowering.cpp
>     llvm/trunk/lib/CodeGen/ShadowStackGC.cpp
>     llvm/trunk/lib/ExecutionEngine/JIT/JIT.cpp
>     llvm/trunk/lib/Linker/LinkModules.cpp
>     llvm/trunk/lib/Target/ARM/ARMISelLowering.cpp
>     llvm/trunk/lib/Target/ARM/AsmPrinter/ARMAsmPrinter.cpp
>     llvm/trunk/lib/Target/Alpha/AsmPrinter/AlphaAsmPrinter.cpp
>     llvm/trunk/lib/Target/CellSPU/AsmPrinter/SPUAsmPrinter.cpp
>     llvm/trunk/lib/Target/CppBackend/CPPBackend.cpp
>     llvm/trunk/lib/Target/DarwinTargetAsmInfo.cpp
>     llvm/trunk/lib/Target/ELFTargetAsmInfo.cpp
>     llvm/trunk/lib/Target/IA64/IA64AsmPrinter.cpp
>     llvm/trunk/lib/Target/Mips/MipsAsmPrinter.cpp
>     llvm/trunk/lib/Target/Mips/MipsTargetAsmInfo.cpp
>     llvm/trunk/lib/Target/PowerPC/AsmPrinter/PPCAsmPrinter.cpp
>     llvm/trunk/lib/Target/Sparc/AsmPrinter/SparcAsmPrinter.cpp
>     llvm/trunk/lib/Target/TargetAsmInfo.cpp
>     llvm/trunk/lib/Target/X86/AsmPrinter/X86ATTAsmPrinter.cpp
>     llvm/trunk/lib/Target/X86/AsmPrinter/X86IntelAsmPrinter.cpp
>     llvm/trunk/lib/Target/X86/X86Subtarget.cpp
>     llvm/trunk/lib/Target/XCore/XCoreAsmPrinter.cpp
>     llvm/trunk/lib/Target/XCore/XCoreTargetAsmInfo.cpp
>     llvm/trunk/lib/Transforms/IPO/IndMemRemoval.cpp
>     llvm/trunk/lib/Transforms/Utils/InlineCost.cpp
>     llvm/trunk/lib/Transforms/Utils/LowerInvoke.cpp
>     llvm/trunk/lib/VMCore/AsmWriter.cpp
>     llvm/trunk/utils/emacs/llvm-mode.el
>     llvm/trunk/utils/llvm.grm
>     llvm/trunk/utils/vim/llvm.vim
> 
> Modified: llvm/trunk/docs/LangRef.html
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/docs/LangRef.html?rev=66339&r1=66338&r2=66339&view=diff
> 
> ==============================================================================
> --- llvm/trunk/docs/LangRef.html (original)
> +++ llvm/trunk/docs/LangRef.html Sat Mar  7 09:45:40 2009
> @@ -545,11 +545,26 @@
>    </dd>
>  
>    <dt><tt><b><a name="linkage_externweak">extern_weak</a></b></tt>: </dt>
> +
>    <dd>The semantics of this linkage follow the ELF object file model: the
>      symbol is weak until linked, if not linked, the symbol becomes null instead
>      of being an undefined reference.
>    </dd>
>  
> +  <dt><tt><b><a name="linkage_linkonce">linkonce_odr</a></b></tt>: </dt>
> +  <dt><tt><b><a name="linkage_common">common_odr</a></b></tt>: </dt>
> +  <dt><tt><b><a name="linkage_weak">weak_odr</a></b></tt>: </dt>
> +  <dt><tt><b><a name="linkage_externweak">extern_weak_odr</a></b></tt>: </dt>
> +  <dd>Some languages allow inequivalent globals to be merged, such as two
> +    functions with different semantics.  Other languages, such as <tt>C++</tt>,
> +    ensure that only equivalent globals are ever merged (the "one definition
> +    rule" - <tt>odr</tt>).  Such languages can use the <tt>linkonce_odr</tt>,
> +    <tt>common_odr</tt>, <tt>weak_odr</tt> and <tt>extern_weak_odr</tt> linkage
> +    types to indicate that the global will only be merged with equivalent
> +    globals.  These linkage types are otherwise the same as their
> +    non-<tt>odr</tt> versions.
> +  </dd>
> +
>    <dt><tt><b><a name="linkage_external">externally visible</a></b></tt>:</dt>
>  
>    <dd>If none of the above identifiers are used, the global is externally
> @@ -592,9 +607,9 @@
>  outside of the current module.</p>
>  <p>It is illegal for a function <i>declaration</i>
>  to have any linkage type other than "externally visible", <tt>dllimport</tt>,
> -or <tt>extern_weak</tt>.</p>
> -<p>Aliases can have only <tt>external</tt>, <tt>internal</tt> and <tt>weak</tt>
> -linkages.</p>
> +<tt>extern_weak</tt> or <tt>extern_weak_odr</tt>.</p>
> +<p>Aliases can have only <tt>external</tt>, <tt>internal</tt>, <tt>weak</tt>
> +or <tt>weak_odr</tt> linkages.</p>
>  </div>
>  
>  <!-- ======================================================================= -->
> 
> Modified: llvm/trunk/docs/ProgrammersManual.html
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/docs/ProgrammersManual.html?rev=66339&r1=66338&r2=66339&view=diff
> 
> ==============================================================================
> --- llvm/trunk/docs/ProgrammersManual.html (original)
> +++ llvm/trunk/docs/ProgrammersManual.html Sat Mar  7 09:45:40 2009
> @@ -3322,11 +3322,12 @@
>      <p>Create a new global variable of the specified type. If
>      <tt>isConstant</tt> is true then the global variable will be marked as
>      unchanging for the program. The Linkage parameter specifies the type of
> -    linkage (internal, external, weak, linkonce, appending) for the variable. If
> -    the linkage is InternalLinkage, WeakLinkage, or LinkOnceLinkage,  then
> -    the resultant global variable will have internal linkage.  AppendingLinkage
> -    concatenates together all instances (in different translation units) of the
> -    variable into a single variable but is only applicable to arrays.   See
> +    linkage (internal, external, weak, linkonce, appending) for the variable.
> +    If the linkage is InternalLinkage, WeakAnyLinkage, WeakODRLinkage,
> +    LinkOnceAnyLinkage or LinkOnceODRLinkage,  then the resultant
> +    global variable will have internal linkage.  AppendingLinkage concatenates
> +    together all instances (in different translation units) of the variable
> +    into a single variable but is only applicable to arrays.   See
>      the <a href="LangRef.html#modulestructure">LLVM Language Reference</a> for
>      further details on linkage types. Optionally an initializer, a name, and the
>      module to put the variable into may be specified for the global variable as
> 
> Modified: llvm/trunk/include/llvm-c/Core.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm-c/Core.h?rev=66339&r1=66338&r2=66339&view=diff
> 
> ==============================================================================
> --- llvm/trunk/include/llvm-c/Core.h (original)
> +++ llvm/trunk/include/llvm-c/Core.h Sat Mar  7 09:45:40 2009
> @@ -115,16 +115,26 @@
>  
>  typedef enum {
>    LLVMExternalLinkage,    /**< Externally visible function */
> -  LLVMLinkOnceLinkage,    /**< Keep one copy of function when linking (inline)*/
> -  LLVMWeakLinkage,        /**< Keep one copy of function when linking (weak) */
> +  LLVMLinkOnceAnyLinkage, /**< Keep one copy of function when linking (inline)*/
> +  LLVMLinkOnceODRLinkage, /**< Same, but only replaced by something
> +                            equivalent. */
> +  LLVMWeakAnyLinkage,     /**< Keep one copy of function when linking (weak) */
> +  LLVMWeakODRLinkage,     /**< Same, but only replaced by something
> +                            equivalent. */
>    LLVMAppendingLinkage,   /**< Special purpose, only applies to global arrays */
>    LLVMInternalLinkage,    /**< Rename collisions when linking (static
>                                 functions) */
> +  LLVMPrivateLinkage,     /**< Like Internal, but omit from symbol table */
>    LLVMDLLImportLinkage,   /**< Function to be imported from DLL */
>    LLVMDLLExportLinkage,   /**< Function to be accessible from DLL */
> -  LLVMExternalWeakLinkage,/**< ExternalWeak linkage description */
> -  LLVMGhostLinkage        /**< Stand-in functions for streaming fns from
> +  LLVMExternalWeakAnyLinkage,/**< ExternalWeak linkage description */
> +  LLVMExternalWeakODRLinkage,/**< Same, but only replaced by something
> +                               equivalent. */
> +  LLVMGhostLinkage,       /**< Stand-in functions for streaming fns from
>                                 bitcode */
> +  LLVMCommonAnyLinkage,   /**< Tentative definitions */
> +  LLVMCommonODRLinkage    /**< Same, but only replaced by something
> +                            equivalent. */
>  } LLVMLinkage;
>  
>  typedef enum {
> 
> Modified: llvm/trunk/include/llvm/GlobalValue.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/GlobalValue.h?rev=66339&r1=66338&r2=66339&view=diff
> 
> ==============================================================================
> --- llvm/trunk/include/llvm/GlobalValue.h (original)
> +++ llvm/trunk/include/llvm/GlobalValue.h Sat Mar  7 09:45:40 2009
> @@ -31,16 +31,20 @@
>    /// @brief An enumeration for the kinds of linkage for global values.
>    enum LinkageTypes {
>      ExternalLinkage = 0,///< Externally visible function
> -    LinkOnceLinkage,    ///< Keep one copy of function when linking (inline)
> -    WeakLinkage,        ///< Keep one copy of named function when linking (weak)
> +    LinkOnceAnyLinkage, ///< Keep one copy of function when linking (inline)
> +    LinkOnceODRLinkage, ///< Same, but only replaced by something equivalent.
> +    WeakAnyLinkage,     ///< Keep one copy of named function when linking (weak)
> +    WeakODRLinkage,     ///< Same, but only replaced by something equivalent.
>      AppendingLinkage,   ///< Special purpose, only applies to global arrays
>      InternalLinkage,    ///< Rename collisions when linking (static functions)
>      PrivateLinkage,     ///< Like Internal, but omit from symbol table
>      DLLImportLinkage,   ///< Function to be imported from DLL
>      DLLExportLinkage,   ///< Function to be accessible from DLL
> -    ExternalWeakLinkage,///< ExternalWeak linkage description
> +    ExternalWeakAnyLinkage,///< ExternalWeak linkage description
> +    ExternalWeakODRLinkage,///< Same, but only replaced by something equivalent.
>      GhostLinkage,       ///< Stand-in functions for streaming fns from BC files
> -    CommonLinkage       ///< Tentative definitions
> +    CommonAnyLinkage,   ///< Tentative definitions
> +    CommonODRLinkage    ///< Same, but only replaced by something equivalent.
>    };
>  
>    /// @brief An enumeration for the kinds of visibility of global values.
> @@ -99,31 +103,67 @@
>      return reinterpret_cast<const PointerType*>(User::getType());
>    }
>  
> -  bool hasExternalLinkage()   const { return Linkage == ExternalLinkage; }
> -  bool hasLinkOnceLinkage()   const { return Linkage == LinkOnceLinkage; }
> -  bool hasWeakLinkage()       const { return Linkage == WeakLinkage; }
> -  bool hasCommonLinkage()     const { return Linkage == CommonLinkage; }
> -  bool hasAppendingLinkage()  const { return Linkage == AppendingLinkage; }
> -  bool hasInternalLinkage()   const { return Linkage == InternalLinkage; }
> -  bool hasPrivateLinkage()    const { return Linkage == PrivateLinkage; }
> -  bool hasLocalLinkage()      const {
> +  static LinkageTypes getLinkOnceLinkage(bool ODR) {
> +    return ODR ? LinkOnceODRLinkage : LinkOnceAnyLinkage;
> +  }
> +  static LinkageTypes getWeakLinkage(bool ODR) {
> +    return ODR ? WeakODRLinkage : WeakAnyLinkage;
> +  }
> +  static LinkageTypes getCommonLinkage(bool ODR) {
> +    return ODR ? CommonODRLinkage : CommonAnyLinkage;
> +  }
> +  static LinkageTypes getExternalWeakLinkage(bool ODR) {
> +    return ODR ? ExternalWeakODRLinkage : ExternalWeakAnyLinkage;
> +  }
> +
> +  bool hasExternalLinkage() const { return Linkage == ExternalLinkage; }
> +  bool hasLinkOnceLinkage() const {
> +    return Linkage == LinkOnceAnyLinkage || Linkage == LinkOnceODRLinkage;
> +  }
> +  bool hasWeakLinkage() const {
> +    return Linkage == WeakAnyLinkage || Linkage == WeakODRLinkage;
> +  }
> +  bool hasAppendingLinkage() const { return Linkage == AppendingLinkage; }
> +  bool hasInternalLinkage() const { return Linkage == InternalLinkage; }
> +  bool hasPrivateLinkage() const { return Linkage == PrivateLinkage; }
> +  bool hasLocalLinkage() const {
>      return Linkage == InternalLinkage || Linkage == PrivateLinkage;
>    }
> -  bool hasDLLImportLinkage()  const { return Linkage == DLLImportLinkage; }
> -  bool hasDLLExportLinkage()  const { return Linkage == DLLExportLinkage; }
> -  bool hasExternalWeakLinkage() const { return Linkage == ExternalWeakLinkage; }
> -  bool hasGhostLinkage()      const { return Linkage == GhostLinkage; }
> +  bool hasDLLImportLinkage() const { return Linkage == DLLImportLinkage; }
> +  bool hasDLLExportLinkage() const { return Linkage == DLLExportLinkage; }
> +  bool hasExternalWeakLinkage() const {
> +    return Linkage == ExternalWeakAnyLinkage ||
> +      Linkage == ExternalWeakODRLinkage;
> +  }
> +  bool hasGhostLinkage() const { return Linkage == GhostLinkage; }
> +  bool hasCommonLinkage() const {
> +    return Linkage == CommonAnyLinkage || Linkage == CommonODRLinkage;
> +  }
> +
>    void setLinkage(LinkageTypes LT) { Linkage = LT; }
>    LinkageTypes getLinkage() const { return Linkage; }
>  
>    /// mayBeOverridden - Whether the definition of this global may be replaced
> -  /// at link time.  For example, if a function has weak linkage then the code
> -  /// defining it may be replaced by different code.
> +  /// by something non-equivalent at link time.  For example, if a function has
> +  /// weak linkage then the code defining it may be replaced by different code.
>    bool mayBeOverridden() const {
> -    return (Linkage == WeakLinkage ||
> -            Linkage == LinkOnceLinkage ||
> -            Linkage == CommonLinkage ||
> -            Linkage == ExternalWeakLinkage);
> +    return (Linkage == WeakAnyLinkage ||
> +            Linkage == LinkOnceAnyLinkage ||
> +            Linkage == CommonAnyLinkage ||
> +            Linkage == ExternalWeakAnyLinkage);
> +  }
> +
> +  /// isWeakForLinker - Whether the definition of this global may be replaced at
> +  /// link time, whether the replacement is equivalent to the original or not.
> +  bool isWeakForLinker() const {
> +    return (Linkage == WeakAnyLinkage ||
> +            Linkage == WeakODRLinkage ||
> +            Linkage == LinkOnceAnyLinkage ||
> +            Linkage == LinkOnceODRLinkage ||
> +            Linkage == CommonAnyLinkage ||
> +            Linkage == CommonODRLinkage ||
> +            Linkage == ExternalWeakAnyLinkage ||
> +            Linkage == ExternalWeakODRLinkage);
>    }
>  
>    /// copyAttributesFrom - copy all additional attributes (those not needed to
> 
> Modified: llvm/trunk/lib/Analysis/DebugInfo.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/DebugInfo.cpp?rev=66339&r1=66338&r2=66339&view=diff
> 
> ==============================================================================
> --- llvm/trunk/lib/Analysis/DebugInfo.cpp (original)
> +++ llvm/trunk/lib/Analysis/DebugInfo.cpp Sat Mar  7 09:45:40 2009
> @@ -344,7 +344,7 @@
>    if (GV->hasInitializer()) 
>      return SubProgramAnchor = DIAnchor(GV);
>    
> -  GV->setLinkage(GlobalValue::LinkOnceLinkage);
> +  GV->setLinkage(GlobalValue::LinkOnceAnyLinkage);
>    GV->setSection("llvm.metadata");
>    GV->setConstant(true);
>    M.addTypeName("llvm.dbg.anchor.type", EltTy);
> 
> Modified: llvm/trunk/lib/AsmParser/LLLexer.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/AsmParser/LLLexer.cpp?rev=66339&r1=66338&r2=66339&view=diff
> 
> ==============================================================================
> --- llvm/trunk/lib/AsmParser/LLLexer.cpp (original)
> +++ llvm/trunk/lib/AsmParser/LLLexer.cpp Sat Mar  7 09:45:40 2009
> @@ -456,15 +456,19 @@
>    KEYWORD(private);
>    KEYWORD(internal);
>    KEYWORD(linkonce);
> +  KEYWORD(linkonce_odr);
>    KEYWORD(weak);
> +  KEYWORD(weak_odr);
>    KEYWORD(appending);
>    KEYWORD(dllimport);
>    KEYWORD(dllexport);
>    KEYWORD(common);
> +  KEYWORD(common_odr);
>    KEYWORD(default);
>    KEYWORD(hidden);
>    KEYWORD(protected);
>    KEYWORD(extern_weak);
> +  KEYWORD(extern_weak_odr);
>    KEYWORD(external);
>    KEYWORD(thread_local);
>    KEYWORD(zeroinitializer);
> 
> Modified: llvm/trunk/lib/AsmParser/LLParser.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/AsmParser/LLParser.cpp?rev=66339&r1=66338&r2=66339&view=diff
> 
> ==============================================================================
> --- llvm/trunk/lib/AsmParser/LLParser.cpp (original)
> +++ llvm/trunk/lib/AsmParser/LLParser.cpp Sat Mar  7 09:45:40 2009
> @@ -116,12 +116,16 @@
>      case lltok::kw_private:       // OptionalLinkage
>      case lltok::kw_internal:      // OptionalLinkage
>      case lltok::kw_weak:          // OptionalLinkage
> +    case lltok::kw_weak_odr:      // OptionalLinkage
>      case lltok::kw_linkonce:      // OptionalLinkage
> +    case lltok::kw_linkonce_odr:  // OptionalLinkage
>      case lltok::kw_appending:     // OptionalLinkage
>      case lltok::kw_dllexport:     // OptionalLinkage
>      case lltok::kw_common:        // OptionalLinkage
> +    case lltok::kw_common_odr:    // OptionalLinkage
>      case lltok::kw_dllimport:     // OptionalLinkage
>      case lltok::kw_extern_weak:   // OptionalLinkage
> +    case lltok::kw_extern_weak_odr: // OptionalLinkage
>      case lltok::kw_external: {    // OptionalLinkage
>        unsigned Linkage, Visibility;
>        if (ParseOptionalLinkage(Linkage) ||
> @@ -377,7 +381,8 @@
>      return true;
>  
>    if (Linkage != GlobalValue::ExternalLinkage &&
> -      Linkage != GlobalValue::WeakLinkage &&
> +      Linkage != GlobalValue::WeakAnyLinkage &&
> +      Linkage != GlobalValue::WeakODRLinkage &&
>        Linkage != GlobalValue::InternalLinkage &&
>        Linkage != GlobalValue::PrivateLinkage)
>      return Error(LinkageLoc, "invalid linkage type for alias");
> @@ -461,7 +466,8 @@
>    // present.
>    Constant *Init = 0;
>    if (!HasLinkage || (Linkage != GlobalValue::DLLImportLinkage &&
> -                      Linkage != GlobalValue::ExternalWeakLinkage &&
> +                      Linkage != GlobalValue::ExternalWeakAnyLinkage &&
> +                      Linkage != GlobalValue::ExternalWeakODRLinkage &&
>                        Linkage != GlobalValue::ExternalLinkage)) {
>      if (ParseGlobalValue(Ty, Init))
>        return true;
> @@ -576,10 +582,10 @@
>        return 0;
>      }
>      
> -    FwdVal = Function::Create(FT, GlobalValue::ExternalWeakLinkage, Name, M);
> +    FwdVal = Function::Create(FT, GlobalValue::ExternalWeakAnyLinkage, Name, M);
>    } else {
>      FwdVal = new GlobalVariable(PTy->getElementType(), false,
> -                                GlobalValue::ExternalWeakLinkage, 0, Name, M);
> +                                GlobalValue::ExternalWeakAnyLinkage, 0, Name, M);
>    }
>    
>    ForwardRefVals[Name] = std::make_pair(FwdVal, Loc);
> @@ -620,10 +626,10 @@
>        Error(Loc, "function may not return opaque type");
>        return 0;
>      }
> -    FwdVal = Function::Create(FT, GlobalValue::ExternalWeakLinkage, "", M);
> +    FwdVal = Function::Create(FT, GlobalValue::ExternalWeakAnyLinkage, "", M);
>    } else {
>      FwdVal = new GlobalVariable(PTy->getElementType(), false,
> -                                GlobalValue::ExternalWeakLinkage, 0, "", M);
> +                                GlobalValue::ExternalWeakAnyLinkage, 0, "", M);
>    }
>    
>    ForwardRefValIDs[ID] = std::make_pair(FwdVal, Loc);
> @@ -746,27 +752,36 @@
>  ///   ::= 'private'
>  ///   ::= 'internal'
>  ///   ::= 'weak'
> +///   ::= 'weak_odr'
>  ///   ::= 'linkonce'
> +///   ::= 'linkonce_odr'
>  ///   ::= 'appending'
>  ///   ::= 'dllexport'
>  ///   ::= 'common'
> +///   ::= 'common_odr'
>  ///   ::= 'dllimport'
>  ///   ::= 'extern_weak'
> +///   ::= 'extern_weak_odr'
>  ///   ::= 'external'
>  bool LLParser::ParseOptionalLinkage(unsigned &Res, bool &HasLinkage) {
>    HasLinkage = false;
>    switch (Lex.getKind()) {
> -  default:                    Res = GlobalValue::ExternalLinkage; return false;
> -  case lltok::kw_private:     Res = GlobalValue::PrivateLinkage; break;
> -  case lltok::kw_internal:    Res = GlobalValue::InternalLinkage; break;
> -  case lltok::kw_weak:        Res = GlobalValue::WeakLinkage; break;
> -  case lltok::kw_linkonce:    Res = GlobalValue::LinkOnceLinkage; break;
> -  case lltok::kw_appending:   Res = GlobalValue::AppendingLinkage; break;
> -  case lltok::kw_dllexport:   Res = GlobalValue::DLLExportLinkage; break;
> -  case lltok::kw_common:      Res = GlobalValue::CommonLinkage; break;
> -  case lltok::kw_dllimport:   Res = GlobalValue::DLLImportLinkage; break;
> -  case lltok::kw_extern_weak: Res = GlobalValue::ExternalWeakLinkage; break;
> -  case lltok::kw_external:    Res = GlobalValue::ExternalLinkage; break;
> +  default:                     Res = GlobalValue::ExternalLinkage; return false;
> +  case lltok::kw_private:      Res = GlobalValue::PrivateLinkage; break;
> +  case lltok::kw_internal:     Res = GlobalValue::InternalLinkage; break;
> +  case lltok::kw_weak:         Res = GlobalValue::WeakAnyLinkage; break;
> +  case lltok::kw_weak_odr:     Res = GlobalValue::WeakODRLinkage; break;
> +  case lltok::kw_linkonce:     Res = GlobalValue::LinkOnceAnyLinkage; break;
> +  case lltok::kw_linkonce_odr: Res = GlobalValue::LinkOnceODRLinkage; break;
> +  case lltok::kw_appending:    Res = GlobalValue::AppendingLinkage; break;
> +  case lltok::kw_dllexport:    Res = GlobalValue::DLLExportLinkage; break;
> +  case lltok::kw_common:       Res = GlobalValue::CommonAnyLinkage; break;
> +  case lltok::kw_common_odr:   Res = GlobalValue::CommonODRLinkage; break;
> +  case lltok::kw_dllimport:    Res = GlobalValue::DLLImportLinkage; break;
> +  case lltok::kw_extern_weak:  Res = GlobalValue::ExternalWeakAnyLinkage; break;
> +  case lltok::kw_extern_weak_odr:
> +                               Res = GlobalValue::ExternalWeakODRLinkage; break;
> +  case lltok::kw_external:     Res = GlobalValue::ExternalLinkage; break;
>    }
>    Lex.Lex();
>    HasLinkage = true;
> @@ -2074,21 +2089,25 @@
>    case GlobalValue::ExternalLinkage:
>      break; // always ok.
>    case GlobalValue::DLLImportLinkage:
> -  case GlobalValue::ExternalWeakLinkage:
> +  case GlobalValue::ExternalWeakAnyLinkage:
> +  case GlobalValue::ExternalWeakODRLinkage:
>      if (isDefine)
>        return Error(LinkageLoc, "invalid linkage for function definition");
>      break;
>    case GlobalValue::PrivateLinkage:
>    case GlobalValue::InternalLinkage:
> -  case GlobalValue::LinkOnceLinkage:
> -  case GlobalValue::WeakLinkage:
> +  case GlobalValue::LinkOnceAnyLinkage:
> +  case GlobalValue::LinkOnceODRLinkage:
> +  case GlobalValue::WeakAnyLinkage:
> +  case GlobalValue::WeakODRLinkage:
>    case GlobalValue::DLLExportLinkage:
>      if (!isDefine)
>        return Error(LinkageLoc, "invalid linkage for function declaration");
>      break;
>    case GlobalValue::AppendingLinkage:
>    case GlobalValue::GhostLinkage:
> -  case GlobalValue::CommonLinkage:
> +  case GlobalValue::CommonAnyLinkage:
> +  case GlobalValue::CommonODRLinkage:
>      return Error(LinkageLoc, "invalid function linkage type");
>    }
>    
> 
> Modified: llvm/trunk/lib/AsmParser/LLToken.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/AsmParser/LLToken.h?rev=66339&r1=66338&r2=66339&view=diff
> 
> ==============================================================================
> --- llvm/trunk/lib/AsmParser/LLToken.h (original)
> +++ llvm/trunk/lib/AsmParser/LLToken.h Sat Mar  7 09:45:40 2009
> @@ -36,9 +36,10 @@
>      kw_declare, kw_define,
>      kw_global,  kw_constant,
>  
> -    kw_private, kw_internal, kw_linkonce, kw_weak, kw_appending, kw_dllimport,
> -    kw_dllexport, kw_common, kw_default, kw_hidden, kw_protected,
> -    kw_extern_weak,
> +    kw_private, kw_internal, kw_linkonce, kw_linkonce_odr, kw_weak, kw_weak_odr,
> +    kw_appending, kw_dllimport, kw_dllexport, kw_common, kw_common_odr,
> +    kw_default, kw_hidden, kw_protected,
> +    kw_extern_weak, kw_extern_weak_odr,
>      kw_external, kw_thread_local,
>      kw_zeroinitializer,
>      kw_undef, kw_null,
> 
> Modified: llvm/trunk/lib/Bitcode/Reader/BitcodeReader.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Bitcode/Reader/BitcodeReader.cpp?rev=66339&r1=66338&r2=66339&view=diff
> 
> ==============================================================================
> --- llvm/trunk/lib/Bitcode/Reader/BitcodeReader.cpp (original)
> +++ llvm/trunk/lib/Bitcode/Reader/BitcodeReader.cpp Sat Mar  7 09:45:40 2009
> @@ -59,15 +59,19 @@
>    switch (Val) {
>    default: // Map unknown/new linkages to external
>    case 0: return GlobalValue::ExternalLinkage;
> -  case 1: return GlobalValue::WeakLinkage;
> +  case 1: return GlobalValue::WeakAnyLinkage;
>    case 2: return GlobalValue::AppendingLinkage;
>    case 3: return GlobalValue::InternalLinkage;
> -  case 4: return GlobalValue::LinkOnceLinkage;
> +  case 4: return GlobalValue::LinkOnceAnyLinkage;
>    case 5: return GlobalValue::DLLImportLinkage;
>    case 6: return GlobalValue::DLLExportLinkage;
> -  case 7: return GlobalValue::ExternalWeakLinkage;
> -  case 8: return GlobalValue::CommonLinkage;
> +  case 7: return GlobalValue::ExternalWeakAnyLinkage;
> +  case 8: return GlobalValue::CommonAnyLinkage;
>    case 9: return GlobalValue::PrivateLinkage;
> +  case 10: return GlobalValue::WeakODRLinkage;
> +  case 11: return GlobalValue::LinkOnceODRLinkage;
> +  case 12: return GlobalValue::ExternalWeakODRLinkage;
> +  case 13: return GlobalValue::CommonODRLinkage;
>    }
>  }
>  
> 
> Modified: llvm/trunk/lib/Bitcode/Writer/BitcodeWriter.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Bitcode/Writer/BitcodeWriter.cpp?rev=66339&r1=66338&r2=66339&view=diff
> 
> ==============================================================================
> --- llvm/trunk/lib/Bitcode/Writer/BitcodeWriter.cpp (original)
> +++ llvm/trunk/lib/Bitcode/Writer/BitcodeWriter.cpp Sat Mar  7 09:45:40 2009
> @@ -276,15 +276,19 @@
>    default: assert(0 && "Invalid linkage!");
>    case GlobalValue::GhostLinkage:  // Map ghost linkage onto external.
>    case GlobalValue::ExternalLinkage:     return 0;
> -  case GlobalValue::WeakLinkage:         return 1;
> +  case GlobalValue::WeakAnyLinkage:      return 1;
>    case GlobalValue::AppendingLinkage:    return 2;
>    case GlobalValue::InternalLinkage:     return 3;
> -  case GlobalValue::LinkOnceLinkage:     return 4;
> +  case GlobalValue::LinkOnceAnyLinkage:  return 4;
>    case GlobalValue::DLLImportLinkage:    return 5;
>    case GlobalValue::DLLExportLinkage:    return 6;
> -  case GlobalValue::ExternalWeakLinkage: return 7;
> -  case GlobalValue::CommonLinkage:       return 8;
> +  case GlobalValue::ExternalWeakAnyLinkage: return 7;
> +  case GlobalValue::CommonAnyLinkage:    return 8;
>    case GlobalValue::PrivateLinkage:      return 9;
> +  case GlobalValue::WeakODRLinkage:      return 10;
> +  case GlobalValue::LinkOnceODRLinkage:  return 11;
> +  case GlobalValue::ExternalWeakODRLinkage: return 12;
> +  case GlobalValue::CommonODRLinkage:    return 13;
>    }
>  }
>  
> 
> Modified: llvm/trunk/lib/CodeGen/AsmPrinter/DwarfWriter.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DwarfWriter.cpp?rev=66339&r1=66338&r2=66339&view=diff
> 
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/AsmPrinter/DwarfWriter.cpp (original)
> +++ llvm/trunk/lib/CodeGen/AsmPrinter/DwarfWriter.cpp Sat Mar  7 09:45:40 2009
> @@ -3135,9 +3135,8 @@
>      GlobalVariable *GV = getGlobalVariable(V);
>      if (!GV)
>        return false;
> -    
> -    if (GV->getLinkage() != GlobalValue::InternalLinkage
> -        && GV->getLinkage() != GlobalValue::LinkOnceLinkage)
> +
> +    if (!GV->hasInternalLinkage () && !GV->hasLinkOnceLinkage())
>        return false;
>  
>      DIDescriptor DI(GV);
> @@ -3449,8 +3448,10 @@
>      }
>  
>      // If corresponding function is weak definition, this should be too.
> -    if ((linkage == Function::WeakLinkage ||
> -         linkage == Function::LinkOnceLinkage) &&
> +    if ((linkage == Function::WeakAnyLinkage ||
> +         linkage == Function::WeakODRLinkage ||
> +         linkage == Function::LinkOnceAnyLinkage ||
> +         linkage == Function::LinkOnceODRLinkage) &&
>          TAI->getWeakDefDirective())
>        O << TAI->getWeakDefDirective() << EHFrameInfo.FnName << "\n";
>  
> @@ -3461,8 +3462,10 @@
>      // unwind info is to be available for non-EH uses.
>      if (!EHFrameInfo.hasCalls &&
>          !UnwindTablesMandatory &&
> -        ((linkage != Function::WeakLinkage &&
> -          linkage != Function::LinkOnceLinkage) ||
> +        ((linkage != Function::WeakAnyLinkage &&
> +          linkage != Function::WeakODRLinkage &&
> +          linkage != Function::LinkOnceAnyLinkage &&
> +          linkage != Function::LinkOnceODRLinkage) ||
>           !TAI->getWeakDefDirective() ||
>           TAI->getSupportsWeakOmittedEHFrame()))
>      {
> 
> Modified: llvm/trunk/lib/CodeGen/ELFWriter.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/ELFWriter.cpp?rev=66339&r1=66338&r2=66339&view=diff
> 
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/ELFWriter.cpp (original)
> +++ llvm/trunk/lib/CodeGen/ELFWriter.cpp Sat Mar  7 09:45:40 2009
> @@ -174,8 +174,10 @@
>    case GlobalValue::ExternalLinkage:
>      FnSym.SetBind(ELFWriter::ELFSym::STB_GLOBAL);
>      break;
> -  case GlobalValue::LinkOnceLinkage:
> -  case GlobalValue::WeakLinkage:
> +  case GlobalValue::LinkOnceAnyLinkage:
> +  case GlobalValue::LinkOnceODRLinkage:
> +  case GlobalValue::WeakAnyLinkage:
> +  case GlobalValue::WeakODRLinkage:
>      FnSym.SetBind(ELFWriter::ELFSym::STB_WEAK);
>      break;
>    case GlobalValue::PrivateLinkage:
> 
> Modified: llvm/trunk/lib/CodeGen/IntrinsicLowering.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/IntrinsicLowering.cpp?rev=66339&r1=66338&r2=66339&view=diff
> 
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/IntrinsicLowering.cpp (original)
> +++ llvm/trunk/lib/CodeGen/IntrinsicLowering.cpp Sat Mar  7 09:45:40 2009
> @@ -316,7 +316,7 @@
>        Name[i] = '_';
>    Module* M = F->getParent();
>    F = cast<Function>(M->getOrInsertFunction(Name, FT));
> -  F->setLinkage(GlobalValue::WeakLinkage);
> +  F->setLinkage(GlobalValue::WeakAnyLinkage);
>  
>    // If we haven't defined the impl function yet, do so now
>    if (F->isDeclaration()) {
> @@ -490,7 +490,7 @@
>        Name[i] = '_';
>    Module* M = F->getParent();
>    F = cast<Function>(M->getOrInsertFunction(Name, FT));
> -  F->setLinkage(GlobalValue::WeakLinkage);
> +  F->setLinkage(GlobalValue::WeakAnyLinkage);
>  
>    // If we haven't defined the impl function yet, do so now
>    if (F->isDeclaration()) {
> 
> Modified: llvm/trunk/lib/CodeGen/MachOWriter.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/MachOWriter.cpp?rev=66339&r1=66338&r2=66339&view=diff
> 
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/MachOWriter.cpp (original)
> +++ llvm/trunk/lib/CodeGen/MachOWriter.cpp Sat Mar  7 09:45:40 2009
> @@ -956,9 +956,12 @@
>    default:
>      assert(0 && "Unexpected linkage type!");
>      break;
> -  case GlobalValue::WeakLinkage:
> -  case GlobalValue::LinkOnceLinkage:
> -  case GlobalValue::CommonLinkage:
> +  case GlobalValue::WeakAnyLinkage:
> +  case GlobalValue::WeakODRLinkage:
> +  case GlobalValue::LinkOnceAnyLinkage:
> +  case GlobalValue::LinkOnceODRLinkage:
> +  case GlobalValue::CommonAnyLinkage:
> +  case GlobalValue::CommonODRLinkage:
>      assert(!isa<Function>(gv) && "Unexpected linkage type for Function!");
>    case GlobalValue::ExternalLinkage:
>      GVName = TAI->getGlobalPrefix() + name;
> 
> Modified: llvm/trunk/lib/CodeGen/SelectionDAG/TargetLowering.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/TargetLowering.cpp?rev=66339&r1=66338&r2=66339&view=diff
> 
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/SelectionDAG/TargetLowering.cpp (original)
> +++ llvm/trunk/lib/CodeGen/SelectionDAG/TargetLowering.cpp Sat Mar  7 09:45:40 2009
> @@ -728,7 +728,7 @@
>    if (getTargetMachine().getRelocationModel() == Reloc::DynamicNoPIC &&
>        GA &&
>        !GA->getGlobal()->isDeclaration() &&
> -      !GA->getGlobal()->mayBeOverridden())
> +      !GA->getGlobal()->isWeakForLinker())
>      return true;
>  
>    // Otherwise assume nothing is safe.
> 
> Modified: llvm/trunk/lib/CodeGen/ShadowStackGC.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/ShadowStackGC.cpp?rev=66339&r1=66338&r2=66339&view=diff
> 
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/ShadowStackGC.cpp (original)
> +++ llvm/trunk/lib/CodeGen/ShadowStackGC.cpp Sat Mar  7 09:45:40 2009
> @@ -293,12 +293,12 @@
>      // If the root chain does not exist, insert a new one with linkonce
>      // linkage!
>      Head = new GlobalVariable(StackEntryPtrTy, false,
> -                              GlobalValue::LinkOnceLinkage,
> +                              GlobalValue::LinkOnceAnyLinkage,
>                                Constant::getNullValue(StackEntryPtrTy),
>                                "llvm_gc_root_chain", &M);
>    } else if (Head->hasExternalLinkage() && Head->isDeclaration()) {
>      Head->setInitializer(Constant::getNullValue(StackEntryPtrTy));
> -    Head->setLinkage(GlobalValue::LinkOnceLinkage);
> +    Head->setLinkage(GlobalValue::LinkOnceAnyLinkage);
>    }
>  
>    return true;
> 
> Modified: llvm/trunk/lib/ExecutionEngine/JIT/JIT.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ExecutionEngine/JIT/JIT.cpp?rev=66339&r1=66338&r2=66339&view=diff
> 
> ==============================================================================
> --- llvm/trunk/lib/ExecutionEngine/JIT/JIT.cpp (original)
> +++ llvm/trunk/lib/ExecutionEngine/JIT/JIT.cpp Sat Mar  7 09:45:40 2009
> @@ -580,8 +580,8 @@
>    }
>  
>    if (F->isDeclaration()) {
> -    bool AbortOnFailure = !areDlsymStubsEnabled() &&
> -                          F->getLinkage() != GlobalValue::ExternalWeakLinkage;
> +    bool AbortOnFailure =
> +      !areDlsymStubsEnabled() && !F->hasExternalWeakLinkage();
>      void *Addr = getPointerToNamedFunction(F->getName(), AbortOnFailure);
>      addGlobalMapping(F, Addr);
>      return Addr;
> 
> Modified: llvm/trunk/lib/Linker/LinkModules.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Linker/LinkModules.cpp?rev=66339&r1=66338&r2=66339&view=diff
> 
> ==============================================================================
> --- llvm/trunk/lib/Linker/LinkModules.cpp (original)
> +++ llvm/trunk/lib/Linker/LinkModules.cpp Sat Mar  7 09:45:40 2009
> @@ -460,7 +460,7 @@
>          LT = Src->getLinkage();
>        }
>      } else if (Dest->hasExternalWeakLinkage()) {
> -      //If the Dest is weak, use the source linkage
> +      // If the Dest is weak, use the source linkage.
>        LinkFromSrc = true;
>        LT = Src->getLinkage();
>      } else {
> @@ -683,15 +683,22 @@
>  
>  static GlobalValue::LinkageTypes
>  CalculateAliasLinkage(const GlobalValue *SGV, const GlobalValue *DGV) {
> -  if (SGV->hasExternalLinkage() || DGV->hasExternalLinkage())
> +  GlobalValue::LinkageTypes SL = SGV->getLinkage();
> +  GlobalValue::LinkageTypes DL = DGV->getLinkage();
> +  if (SL == GlobalValue::ExternalLinkage || DL == GlobalValue::ExternalLinkage)
>      return GlobalValue::ExternalLinkage;
> -  else if (SGV->hasWeakLinkage() || DGV->hasWeakLinkage())
> -    return GlobalValue::WeakLinkage;
> -  else if (SGV->hasInternalLinkage() && DGV->hasInternalLinkage())
> +  else if (SL == GlobalValue::WeakAnyLinkage ||
> +           DL == GlobalValue::WeakAnyLinkage)
> +    return GlobalValue::WeakAnyLinkage;
> +  else if (SL == GlobalValue::WeakODRLinkage ||
> +           DL == GlobalValue::WeakODRLinkage)
> +    return GlobalValue::WeakODRLinkage;
> +  else if (SL == GlobalValue::InternalLinkage &&
> +           DL == GlobalValue::InternalLinkage)
>      return GlobalValue::InternalLinkage;
>    else {
> -    assert (SGV->hasPrivateLinkage() && DGV->hasPrivateLinkage() &&
> -	    "Unexpected linkage type");
> +    assert (SL == GlobalValue::PrivateLinkage &&
> +            DL == GlobalValue::PrivateLinkage && "Unexpected linkage type");
>      return GlobalValue::PrivateLinkage;
>    }
>  }
> 
> Modified: llvm/trunk/lib/Target/ARM/ARMISelLowering.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMISelLowering.cpp?rev=66339&r1=66338&r2=66339&view=diff
> 
> ==============================================================================
> --- llvm/trunk/lib/Target/ARM/ARMISelLowering.cpp (original)
> +++ llvm/trunk/lib/Target/ARM/ARMISelLowering.cpp Sat Mar  7 09:45:40 2009
> @@ -854,7 +854,7 @@
>    bool isDecl = GV->isDeclaration() && !GV->hasNotBeenReadFromBitcode();
>    if (GV->hasHiddenVisibility() && (!isDecl && !GV->hasCommonLinkage()))
>      return false;
> -  return RelocM != Reloc::Static && (isDecl || GV->mayBeOverridden());
> +  return RelocM != Reloc::Static && (isDecl || GV->isWeakForLinker());
>  }
>  
>  SDValue ARMTargetLowering::LowerGlobalAddressDarwin(SDValue Op,
> 
> Modified: llvm/trunk/lib/Target/ARM/AsmPrinter/ARMAsmPrinter.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/AsmPrinter/ARMAsmPrinter.cpp?rev=66339&r1=66338&r2=66339&view=diff
> 
> ==============================================================================
> --- llvm/trunk/lib/Target/ARM/AsmPrinter/ARMAsmPrinter.cpp (original)
> +++ llvm/trunk/lib/Target/ARM/AsmPrinter/ARMAsmPrinter.cpp Sat Mar  7 09:45:40 2009
> @@ -208,8 +208,10 @@
>      SwitchToTextSection("\t.text", F);
>      O << "\t.globl\t" << CurrentFnName << "\n";
>      break;
> -  case Function::WeakLinkage:
> -  case Function::LinkOnceLinkage:
> +  case Function::WeakAnyLinkage:
> +  case Function::WeakODRLinkage:
> +  case Function::LinkOnceAnyLinkage:
> +  case Function::LinkOnceODRLinkage:
>      if (Subtarget->isTargetDarwin()) {
>        SwitchToTextSection(
>                  ".section __TEXT,__textcoal_nt,coalesced,pure_instructions", F);
> @@ -853,7 +855,7 @@
>        }
>      }
>  
> -    if (GVar->hasLocalLinkage() || GVar->mayBeOverridden()) {
> +    if (GVar->hasLocalLinkage() || GVar->isWeakForLinker()) {
>        if (Size == 0) Size = 1;   // .comm Foo, 0 is undefined, avoid it.
>  
>        if (isDarwin) {
> @@ -899,9 +901,12 @@
>  
>    SwitchToSection(TAI->SectionForGlobal(GVar));
>    switch (GVar->getLinkage()) {
> -   case GlobalValue::CommonLinkage:
> -   case GlobalValue::LinkOnceLinkage:
> -   case GlobalValue::WeakLinkage:
> +   case GlobalValue::CommonAnyLinkage:
> +   case GlobalValue::CommonODRLinkage:
> +   case GlobalValue::LinkOnceAnyLinkage:
> +   case GlobalValue::LinkOnceODRLinkage:
> +   case GlobalValue::WeakAnyLinkage:
> +   case GlobalValue::WeakODRLinkage:
>      if (isDarwin) {
>        O << "\t.globl " << name << "\n"
>          << "\t.weak_definition " << name << "\n";
> 
> Modified: llvm/trunk/lib/Target/Alpha/AsmPrinter/AlphaAsmPrinter.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/Alpha/AsmPrinter/AlphaAsmPrinter.cpp?rev=66339&r1=66338&r2=66339&view=diff
> 
> ==============================================================================
> --- llvm/trunk/lib/Target/Alpha/AsmPrinter/AlphaAsmPrinter.cpp (original)
> +++ llvm/trunk/lib/Target/Alpha/AsmPrinter/AlphaAsmPrinter.cpp Sat Mar  7 09:45:40 2009
> @@ -163,8 +163,10 @@
>     case Function::ExternalLinkage:
>       O << "\t.globl " << CurrentFnName << "\n";
>       break;
> -  case Function::WeakLinkage:
> -  case Function::LinkOnceLinkage:
> +  case Function::WeakAnyLinkage:
> +  case Function::WeakODRLinkage:
> +  case Function::LinkOnceAnyLinkage:
> +  case Function::LinkOnceODRLinkage:
>      O << TAI->getWeakRefDirective() << CurrentFnName << "\n";
>      break;
>    }
> @@ -231,9 +233,12 @@
>  
>    // 2: Kind
>    switch (GVar->getLinkage()) {
> -   case GlobalValue::LinkOnceLinkage:
> -   case GlobalValue::WeakLinkage:
> -   case GlobalValue::CommonLinkage:
> +   case GlobalValue::LinkOnceAnyLinkage:
> +   case GlobalValue::LinkOnceODRLinkage:
> +   case GlobalValue::WeakAnyLinkage:
> +   case GlobalValue::WeakODRLinkage:
> +   case GlobalValue::CommonAnyLinkage:
> +   case GlobalValue::CommonODRLinkage:
>      O << TAI->getWeakRefDirective() << name << '\n';
>      break;
>     case GlobalValue::AppendingLinkage:
> 
> Modified: llvm/trunk/lib/Target/CellSPU/AsmPrinter/SPUAsmPrinter.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/CellSPU/AsmPrinter/SPUAsmPrinter.cpp?rev=66339&r1=66338&r2=66339&view=diff
> 
> ==============================================================================
> --- llvm/trunk/lib/Target/CellSPU/AsmPrinter/SPUAsmPrinter.cpp (original)
> +++ llvm/trunk/lib/Target/CellSPU/AsmPrinter/SPUAsmPrinter.cpp Sat Mar  7 09:45:40 2009
> @@ -445,8 +445,10 @@
>      O << "\t.global\t" << CurrentFnName << "\n"
>        << "\t.type\t" << CurrentFnName << ", @function\n";
>      break;
> -  case Function::WeakLinkage:
> -  case Function::LinkOnceLinkage:
> +  case Function::WeakAnyLinkage:
> +  case Function::WeakODRLinkage:
> +  case Function::LinkOnceAnyLinkage:
> +  case Function::LinkOnceODRLinkage:
>      O << "\t.global\t" << CurrentFnName << "\n";
>      O << "\t.weak_definition\t" << CurrentFnName << "\n";
>      break;
> @@ -534,7 +536,7 @@
>    if (C->isNullValue() && /* FIXME: Verify correct */
>        !GVar->hasSection() &&
>        (GVar->hasLocalLinkage() || GVar->hasExternalLinkage() ||
> -       GVar->mayBeOverridden())) {
> +       GVar->isWeakForLinker())) {
>        if (Size == 0) Size = 1;   // .comm Foo, 0 is undefined, avoid it.
>  
>        if (GVar->hasExternalLinkage()) {
> @@ -555,9 +557,12 @@
>  
>    switch (GVar->getLinkage()) {
>      // Should never be seen for the CellSPU platform...
> -   case GlobalValue::LinkOnceLinkage:
> -   case GlobalValue::WeakLinkage:
> -   case GlobalValue::CommonLinkage:
> +   case GlobalValue::LinkOnceAnyLinkage:
> +   case GlobalValue::LinkOnceODRLinkage:
> +   case GlobalValue::WeakAnyLinkage:
> +   case GlobalValue::WeakODRLinkage:
> +   case GlobalValue::CommonAnyLinkage:
> +   case GlobalValue::CommonODRLinkage:
>      O << "\t.global " << name << '\n'
>        << "\t.type " << name << ", @object\n"
>        << "\t.weak " << name << '\n';
> 
> Modified: llvm/trunk/lib/Target/CppBackend/CPPBackend.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/CppBackend/CPPBackend.cpp?rev=66339&r1=66338&r2=66339&view=diff
> 
> ==============================================================================
> --- llvm/trunk/lib/Target/CppBackend/CPPBackend.cpp (original)
> +++ llvm/trunk/lib/Target/CppBackend/CPPBackend.cpp Sat Mar  7 09:45:40 2009
> @@ -294,10 +294,14 @@
>        Out << "GlobalValue::InternalLinkage"; break;
>      case GlobalValue::PrivateLinkage:
>        Out << "GlobalValue::PrivateLinkage"; break;
> -    case GlobalValue::LinkOnceLinkage:
> -      Out << "GlobalValue::LinkOnceLinkage "; break;
> -    case GlobalValue::WeakLinkage:
> -      Out << "GlobalValue::WeakLinkage"; break;
> +    case GlobalValue::LinkOnceAnyLinkage:
> +      Out << "GlobalValue::LinkOnceAnyLinkage "; break;
> +    case GlobalValue::LinkOnceODRLinkage:
> +      Out << "GlobalValue::LinkOnceODRLinkage "; break;
> +    case GlobalValue::WeakAnyLinkage:
> +      Out << "GlobalValue::WeakAnyLinkage"; break;
> +    case GlobalValue::WeakODRLinkage:
> +      Out << "GlobalValue::WeakODRLinkage"; break;
>      case GlobalValue::AppendingLinkage:
>        Out << "GlobalValue::AppendingLinkage"; break;
>      case GlobalValue::ExternalLinkage:
> @@ -306,12 +310,16 @@
>        Out << "GlobalValue::DLLImportLinkage"; break;
>      case GlobalValue::DLLExportLinkage:
>        Out << "GlobalValue::DLLExportLinkage"; break;
> -    case GlobalValue::ExternalWeakLinkage:
> -      Out << "GlobalValue::ExternalWeakLinkage"; break;
> +    case GlobalValue::ExternalWeakAnyLinkage:
> +      Out << "GlobalValue::ExternalWeakAnyLinkage"; break;
> +    case GlobalValue::ExternalWeakODRLinkage:
> +      Out << "GlobalValue::ExternalWeakODRLinkage"; break;
>      case GlobalValue::GhostLinkage:
>        Out << "GlobalValue::GhostLinkage"; break;
> -    case GlobalValue::CommonLinkage:
> -      Out << "GlobalValue::CommonLinkage"; break;
> +    case GlobalValue::CommonAnyLinkage:
> +      Out << "GlobalValue::CommonAnyLinkage"; break;
> +    case GlobalValue::CommonODRLinkage:
> +      Out << "GlobalValue::CommonODRLinkage"; break;
>      }
>    }
>  
> 
> Modified: llvm/trunk/lib/Target/DarwinTargetAsmInfo.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/DarwinTargetAsmInfo.cpp?rev=66339&r1=66338&r2=66339&view=diff
> 
> ==============================================================================
> --- llvm/trunk/lib/Target/DarwinTargetAsmInfo.cpp (original)
> +++ llvm/trunk/lib/Target/DarwinTargetAsmInfo.cpp Sat Mar  7 09:45:40 2009
> @@ -75,7 +75,7 @@
>  const Section*
>  DarwinTargetAsmInfo::SelectSectionForGlobal(const GlobalValue *GV) const {
>    SectionKind::Kind Kind = SectionKindForGlobal(GV);
> -  bool isWeak = GV->mayBeOverridden();
> +  bool isWeak = GV->isWeakForLinker();
>    bool isNonStatic = TM.getRelocationModel() != Reloc::Static;
>  
>    switch (Kind) {
> 
> Modified: llvm/trunk/lib/Target/ELFTargetAsmInfo.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ELFTargetAsmInfo.cpp?rev=66339&r1=66338&r2=66339&view=diff
> 
> ==============================================================================
> --- llvm/trunk/lib/Target/ELFTargetAsmInfo.cpp (original)
> +++ llvm/trunk/lib/Target/ELFTargetAsmInfo.cpp Sat Mar  7 09:45:40 2009
> @@ -49,14 +49,16 @@
>       case Function::DLLExportLinkage:
>       case Function::ExternalLinkage:
>        return TextSection;
> -     case Function::WeakLinkage:
> -     case Function::LinkOnceLinkage:
> +     case Function::WeakAnyLinkage:
> +     case Function::WeakODRLinkage:
> +     case Function::LinkOnceAnyLinkage:
> +     case Function::LinkOnceODRLinkage:
>        std::string Name = UniqueSectionForGlobal(GV, Kind);
>        unsigned Flags = SectionFlagsForGlobal(GV, Name.c_str());
>        return getNamedSection(Name.c_str(), Flags);
>      }
>    } else if (const GlobalVariable *GVar = dyn_cast<GlobalVariable>(GV)) {
> -    if (GVar->mayBeOverridden()) {
> +    if (GVar->isWeakForLinker()) {
>        std::string Name = UniqueSectionForGlobal(GVar, Kind);
>        unsigned Flags = SectionFlagsForGlobal(GVar, Name.c_str());
>        return getNamedSection(Name.c_str(), Flags);
> 
> Modified: llvm/trunk/lib/Target/IA64/IA64AsmPrinter.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/IA64/IA64AsmPrinter.cpp?rev=66339&r1=66338&r2=66339&view=diff
> 
> ==============================================================================
> --- llvm/trunk/lib/Target/IA64/IA64AsmPrinter.cpp (original)
> +++ llvm/trunk/lib/Target/IA64/IA64AsmPrinter.cpp Sat Mar  7 09:45:40 2009
> @@ -278,7 +278,7 @@
>  
>    if (C->isNullValue() && !GVar->hasSection()) {
>      if (!GVar->isThreadLocal() &&
> -        (GVar->hasLocalLinkage() || GVar->mayBeOverridden())) {
> +        (GVar->hasLocalLinkage() || GVar->isWeakForLinker())) {
>        if (Size == 0) Size = 1;   // .comm Foo, 0 is undefined, avoid it.
>  
>        if (GVar->hasLocalLinkage()) {
> @@ -296,9 +296,12 @@
>    }
>  
>    switch (GVar->getLinkage()) {
> -   case GlobalValue::LinkOnceLinkage:
> -   case GlobalValue::CommonLinkage:
> -   case GlobalValue::WeakLinkage:
> +   case GlobalValue::LinkOnceAnyLinkage:
> +   case GlobalValue::LinkOnceODRLinkage:
> +   case GlobalValue::CommonAnyLinkage:
> +   case GlobalValue::CommonODRLinkage:
> +   case GlobalValue::WeakAnyLinkage:
> +   case GlobalValue::WeakODRLinkage:
>      // Nonnull linkonce -> weak
>      O << "\t.weak " << name << '\n';
>      break;
> 
> Modified: llvm/trunk/lib/Target/Mips/MipsAsmPrinter.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/Mips/MipsAsmPrinter.cpp?rev=66339&r1=66338&r2=66339&view=diff
> 
> ==============================================================================
> --- llvm/trunk/lib/Target/Mips/MipsAsmPrinter.cpp (original)
> +++ llvm/trunk/lib/Target/Mips/MipsAsmPrinter.cpp Sat Mar  7 09:45:40 2009
> @@ -504,7 +504,7 @@
>  
>    if (C->isNullValue() && !GVar->hasSection()) {
>      if (!GVar->isThreadLocal() &&
> -        (GVar->hasLocalLinkage() || GVar->mayBeOverridden())) {
> +        (GVar->hasLocalLinkage() || GVar->isWeakForLinker())) {
>        if (Size == 0) Size = 1;   // .comm Foo, 0 is undefined, avoid it.
>  
>        if (GVar->hasLocalLinkage())
> @@ -519,9 +519,12 @@
>      }
>    }
>    switch (GVar->getLinkage()) {
> -   case GlobalValue::LinkOnceLinkage:
> -   case GlobalValue::CommonLinkage:
> -   case GlobalValue::WeakLinkage:
> +   case GlobalValue::LinkOnceAnyLinkage:
> +   case GlobalValue::LinkOnceODRLinkage:
> +   case GlobalValue::CommonAnyLinkage:
> +   case GlobalValue::CommonODRLinkage:
> +   case GlobalValue::WeakAnyLinkage:
> +   case GlobalValue::WeakODRLinkage:
>      // FIXME: Verify correct for weak.
>      // Nonnull linkonce -> weak
>      O << "\t.weak " << name << '\n';
> 
> Modified: llvm/trunk/lib/Target/Mips/MipsTargetAsmInfo.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/Mips/MipsTargetAsmInfo.cpp?rev=66339&r1=66338&r2=66339&view=diff
> 
> ==============================================================================
> --- llvm/trunk/lib/Target/Mips/MipsTargetAsmInfo.cpp (original)
> +++ llvm/trunk/lib/Target/Mips/MipsTargetAsmInfo.cpp Sat Mar  7 09:45:40 2009
> @@ -85,7 +85,7 @@
>    SectionKind::Kind K = SectionKindForGlobal(GV);
>    const GlobalVariable *GVA = dyn_cast<GlobalVariable>(GV);
>  
> -  if (GVA && (!GVA->mayBeOverridden()))
> +  if (GVA && (!GVA->isWeakForLinker()))
>      switch (K) {
>        case SectionKind::SmallData:
>          return getSmallDataSection();
> 
> Modified: llvm/trunk/lib/Target/PowerPC/AsmPrinter/PPCAsmPrinter.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/PowerPC/AsmPrinter/PPCAsmPrinter.cpp?rev=66339&r1=66338&r2=66339&view=diff
> 
> ==============================================================================
> --- llvm/trunk/lib/Target/PowerPC/AsmPrinter/PPCAsmPrinter.cpp (original)
> +++ llvm/trunk/lib/Target/PowerPC/AsmPrinter/PPCAsmPrinter.cpp Sat Mar  7 09:45:40 2009
> @@ -388,7 +388,7 @@
>  
>      // External or weakly linked global variables need non-lazily-resolved stubs
>      if (TM.getRelocationModel() != Reloc::Static) {
> -      if (GV->isDeclaration() || GV->mayBeOverridden()) {
> +      if (GV->isDeclaration() || GV->isWeakForLinker()) {
>          if (GV->hasHiddenVisibility()) {
>            if (!GV->isDeclaration() && !GV->hasCommonLinkage())
>              O << Name;
> @@ -592,8 +592,10 @@
>      O << "\t.global\t" << CurrentFnName << '\n'
>        << "\t.type\t" << CurrentFnName << ", @function\n";
>      break;
> -  case Function::WeakLinkage:
> -  case Function::LinkOnceLinkage:
> +  case Function::WeakAnyLinkage:
> +  case Function::WeakODRLinkage:
> +  case Function::LinkOnceAnyLinkage:
> +  case Function::LinkOnceODRLinkage:
>      O << "\t.global\t" << CurrentFnName << '\n';
>      O << "\t.weak\t" << CurrentFnName << '\n';
>      break;
> @@ -689,7 +691,7 @@
>    if (C->isNullValue() && /* FIXME: Verify correct */
>        !GVar->hasSection() &&
>        (GVar->hasLocalLinkage() || GVar->hasExternalLinkage() ||
> -       GVar->mayBeOverridden())) {
> +       GVar->isWeakForLinker())) {
>        if (Size == 0) Size = 1;   // .comm Foo, 0 is undefined, avoid it.
>  
>        if (GVar->hasExternalLinkage()) {
> @@ -709,9 +711,12 @@
>    }
>  
>    switch (GVar->getLinkage()) {
> -   case GlobalValue::LinkOnceLinkage:
> -   case GlobalValue::WeakLinkage:
> -   case GlobalValue::CommonLinkage:
> +   case GlobalValue::LinkOnceAnyLinkage:
> +   case GlobalValue::LinkOnceODRLinkage:
> +   case GlobalValue::WeakAnyLinkage:
> +   case GlobalValue::WeakODRLinkage:
> +   case GlobalValue::CommonAnyLinkage:
> +   case GlobalValue::CommonODRLinkage:
>      O << "\t.global " << name << '\n'
>        << "\t.type " << name << ", @object\n"
>        << "\t.weak " << name << '\n';
> @@ -785,8 +790,10 @@
>    case Function::ExternalLinkage:
>      O << "\t.globl\t" << CurrentFnName << '\n';
>      break;
> -  case Function::WeakLinkage:
> -  case Function::LinkOnceLinkage:
> +  case Function::WeakAnyLinkage:
> +  case Function::WeakODRLinkage:
> +  case Function::LinkOnceAnyLinkage:
> +  case Function::LinkOnceODRLinkage:
>      O << "\t.globl\t" << CurrentFnName << '\n';
>      O << "\t.weak_definition\t" << CurrentFnName << '\n';
>      break;
> @@ -918,7 +925,7 @@
>    if (C->isNullValue() && /* FIXME: Verify correct */
>        !GVar->hasSection() &&
>        (GVar->hasLocalLinkage() || GVar->hasExternalLinkage() ||
> -       GVar->mayBeOverridden()) &&
> +       GVar->isWeakForLinker()) &&
>        TAI->SectionKindForGlobal(GVar) != SectionKind::RODataMergeStr) {
>      if (Size == 0) Size = 1;   // .comm Foo, 0 is undefined, avoid it.
>  
> @@ -950,9 +957,12 @@
>    }
>  
>    switch (GVar->getLinkage()) {
> -   case GlobalValue::LinkOnceLinkage:
> -   case GlobalValue::WeakLinkage:
> -   case GlobalValue::CommonLinkage:
> +   case GlobalValue::LinkOnceAnyLinkage:
> +   case GlobalValue::LinkOnceODRLinkage:
> +   case GlobalValue::WeakAnyLinkage:
> +   case GlobalValue::WeakODRLinkage:
> +   case GlobalValue::CommonAnyLinkage:
> +   case GlobalValue::CommonODRLinkage:
>      O << "\t.globl " << name << '\n'
>        << "\t.weak_definition " << name << '\n';
>      break;
> 
> Modified: llvm/trunk/lib/Target/Sparc/AsmPrinter/SparcAsmPrinter.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/Sparc/AsmPrinter/SparcAsmPrinter.cpp?rev=66339&r1=66338&r2=66339&view=diff
> 
> ==============================================================================
> --- llvm/trunk/lib/Target/Sparc/AsmPrinter/SparcAsmPrinter.cpp (original)
> +++ llvm/trunk/lib/Target/Sparc/AsmPrinter/SparcAsmPrinter.cpp Sat Mar  7 09:45:40 2009
> @@ -260,7 +260,7 @@
>  
>    if (C->isNullValue() && !GVar->hasSection()) {
>      if (!GVar->isThreadLocal() &&
> -        (GVar->hasLocalLinkage() || GVar->mayBeOverridden())) {
> +        (GVar->hasLocalLinkage() || GVar->isWeakForLinker())) {
>        if (Size == 0) Size = 1;   // .comm Foo, 0 is undefined, avoid it.
>  
>        if (GVar->hasLocalLinkage())
> @@ -276,9 +276,12 @@
>    }
>  
>    switch (GVar->getLinkage()) {
> -   case GlobalValue::CommonLinkage:
> -   case GlobalValue::LinkOnceLinkage:
> -   case GlobalValue::WeakLinkage:   // FIXME: Verify correct for weak.
> +   case GlobalValue::CommonAnyLinkage:
> +   case GlobalValue::CommonODRLinkage:
> +   case GlobalValue::LinkOnceAnyLinkage:
> +   case GlobalValue::LinkOnceODRLinkage:
> +   case GlobalValue::WeakAnyLinkage: // FIXME: Verify correct for weak.
> +   case GlobalValue::WeakODRLinkage: // FIXME: Verify correct for weak.
>      // Nonnull linkonce -> weak
>      O << "\t.weak " << name << '\n';
>      break;
> 
> Modified: llvm/trunk/lib/Target/TargetAsmInfo.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/TargetAsmInfo.cpp?rev=66339&r1=66338&r2=66339&view=diff
> 
> ==============================================================================
> --- llvm/trunk/lib/Target/TargetAsmInfo.cpp (original)
> +++ llvm/trunk/lib/Target/TargetAsmInfo.cpp Sat Mar  7 09:45:40 2009
> @@ -259,7 +259,7 @@
>        assert(0 && "Unexpected section kind!");
>      }
>  
> -    if (GV->mayBeOverridden())
> +    if (GV->isWeakForLinker())
>        Flags |= SectionFlags::Linkonce;
>    }
>  
> @@ -310,7 +310,7 @@
>  TargetAsmInfo::SelectSectionForGlobal(const GlobalValue *GV) const {
>    SectionKind::Kind Kind = SectionKindForGlobal(GV);
>  
> -  if (GV->mayBeOverridden()) {
> +  if (GV->isWeakForLinker()) {
>      std::string Name = UniqueSectionForGlobal(GV, Kind);
>      unsigned Flags = SectionFlagsForGlobal(GV, Name.c_str());
>      return getNamedSection(Name.c_str(), Flags);
> 
> Modified: llvm/trunk/lib/Target/X86/AsmPrinter/X86ATTAsmPrinter.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/AsmPrinter/X86ATTAsmPrinter.cpp?rev=66339&r1=66338&r2=66339&view=diff
> 
> ==============================================================================
> --- llvm/trunk/lib/Target/X86/AsmPrinter/X86ATTAsmPrinter.cpp (original)
> +++ llvm/trunk/lib/Target/X86/AsmPrinter/X86ATTAsmPrinter.cpp Sat Mar  7 09:45:40 2009
> @@ -168,8 +168,10 @@
>      EmitAlignment(FnAlign, F);
>      O << "\t.globl\t" << CurrentFnName << '\n';
>      break;
> -  case Function::LinkOnceLinkage:
> -  case Function::WeakLinkage:
> +  case Function::LinkOnceAnyLinkage:
> +  case Function::LinkOnceODRLinkage:
> +  case Function::WeakAnyLinkage:
> +  case Function::WeakODRLinkage:
>      EmitAlignment(FnAlign, F);
>      if (Subtarget->isTargetDarwin()) {
>        O << "\t.globl\t" << CurrentFnName << '\n';
> @@ -198,8 +200,7 @@
>    O << CurrentFnName << ":\n";
>    // Add some workaround for linkonce linkage on Cygwin\MinGW
>    if (Subtarget->isTargetCygMing() &&
> -      (F->getLinkage() == Function::LinkOnceLinkage ||
> -       F->getLinkage() == Function::WeakLinkage))
> +      (F->hasLinkOnceLinkage() || F->hasWeakLinkage()))
>      O << "Lllvm$workaround$fake$stub$" << CurrentFnName << ":\n";
>  }
>  
> @@ -386,7 +387,7 @@
>      if (shouldPrintStub(TM, Subtarget)) {
>        // Link-once, declaration, or Weakly-linked global variables need
>        // non-lazily-resolved stubs
> -      if (GV->isDeclaration() || GV->mayBeOverridden()) {
> +      if (GV->isDeclaration() || GV->isWeakForLinker()) {
>          // Dynamically-resolved functions need a stub for the function.
>          if (isCallOp && isa<Function>(GV)) {
>            // Function stubs are no longer needed for Mac OS X 10.5 and up.
> @@ -816,7 +817,7 @@
>      }
>  
>      if (!GVar->isThreadLocal() &&
> -        (GVar->hasLocalLinkage() || GVar->mayBeOverridden())) {
> +        (GVar->hasLocalLinkage() || GVar->isWeakForLinker())) {
>        if (Size == 0) Size = 1;   // .comm Foo, 0 is undefined, avoid it.
>  
>        if (TAI->getLCOMMDirective() != NULL) {
> @@ -855,9 +856,12 @@
>    }
>  
>    switch (GVar->getLinkage()) {
> -  case GlobalValue::CommonLinkage:
> -  case GlobalValue::LinkOnceLinkage:
> -  case GlobalValue::WeakLinkage:
> +  case GlobalValue::CommonAnyLinkage:
> +  case GlobalValue::CommonODRLinkage:
> +  case GlobalValue::LinkOnceAnyLinkage:
> +  case GlobalValue::LinkOnceODRLinkage:
> +  case GlobalValue::WeakAnyLinkage:
> +  case GlobalValue::WeakODRLinkage:
>      if (Subtarget->isTargetDarwin()) {
>        O << "\t.globl " << name << '\n'
>          << TAI->getWeakDefDirective() << name << '\n';
> 
> Modified: llvm/trunk/lib/Target/X86/AsmPrinter/X86IntelAsmPrinter.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/AsmPrinter/X86IntelAsmPrinter.cpp?rev=66339&r1=66338&r2=66339&view=diff
> 
> ==============================================================================
> --- llvm/trunk/lib/Target/X86/AsmPrinter/X86IntelAsmPrinter.cpp (original)
> +++ llvm/trunk/lib/Target/X86/AsmPrinter/X86IntelAsmPrinter.cpp Sat Mar  7 09:45:40 2009
> @@ -455,9 +455,12 @@
>      bool bCustomSegment = false;
>  
>      switch (I->getLinkage()) {
> -    case GlobalValue::CommonLinkage:
> -    case GlobalValue::LinkOnceLinkage:
> -    case GlobalValue::WeakLinkage:
> +    case GlobalValue::CommonAnyLinkage:
> +    case GlobalValue::CommonODRLinkage:
> +    case GlobalValue::LinkOnceAnyLinkage:
> +    case GlobalValue::LinkOnceODRLinkage:
> +    case GlobalValue::WeakAnyLinkage:
> +    case GlobalValue::WeakODRLinkage:
>        SwitchToDataSection("");
>        O << name << "?\tsegment common 'COMMON'\n";
>        bCustomSegment = true;
> 
> Modified: llvm/trunk/lib/Target/X86/X86Subtarget.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86Subtarget.cpp?rev=66339&r1=66338&r2=66339&view=diff
> 
> ==============================================================================
> --- llvm/trunk/lib/Target/X86/X86Subtarget.cpp (original)
> +++ llvm/trunk/lib/Target/X86/X86Subtarget.cpp Sat Mar  7 09:45:40 2009
> @@ -51,7 +51,7 @@
>          // target is x86-64 or the symbol is definitely defined in the current
>          // translation unit.
>          return false;
> -      return !isDirectCall && (isDecl || GV->mayBeOverridden());
> +      return !isDirectCall && (isDecl || GV->isWeakForLinker());
>      } else if (isTargetELF()) {
>        // Extra load is needed for all externally visible.
>        if (isDirectCall)
> 
> Modified: llvm/trunk/lib/Target/XCore/XCoreAsmPrinter.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/XCore/XCoreAsmPrinter.cpp?rev=66339&r1=66338&r2=66339&view=diff
> 
> ==============================================================================
> --- llvm/trunk/lib/Target/XCore/XCoreAsmPrinter.cpp (original)
> +++ llvm/trunk/lib/Target/XCore/XCoreAsmPrinter.cpp Sat Mar  7 09:45:40 2009
> @@ -188,8 +188,10 @@
>      case GlobalValue::AppendingLinkage:
>        cerr << "AppendingLinkage is not supported by this target!\n";
>        abort();
> -    case GlobalValue::LinkOnceLinkage:
> -    case GlobalValue::WeakLinkage:
> +    case GlobalValue::LinkOnceAnyLinkage:
> +    case GlobalValue::LinkOnceODRLinkage:
> +    case GlobalValue::WeakAnyLinkage:
> +    case GlobalValue::WeakODRLinkage:
>      case GlobalValue::ExternalLinkage:
>        emitArrayBound(name, GV);
>        emitGlobalDirective(name);
> @@ -266,8 +268,10 @@
>    case Function::ExternalLinkage:
>      emitGlobalDirective(CurrentFnName);
>      break;
> -  case Function::LinkOnceLinkage:
> -  case Function::WeakLinkage:
> +  case Function::LinkOnceAnyLinkage:
> +  case Function::LinkOnceODRLinkage:
> +  case Function::WeakAnyLinkage:
> +  case Function::WeakODRLinkage:
>      // TODO Use COMDAT groups for LinkOnceLinkage
>      O << TAI->getGlobalDirective() << CurrentFnName << "\n";
>      O << TAI->getWeakDefDirective() << CurrentFnName << "\n";
> @@ -434,7 +438,8 @@
>        switch (I->getLinkage()) {
>        default:
>          assert(0 && "Unexpected linkage");
> -      case Function::ExternalWeakLinkage:
> +      case Function::ExternalWeakAnyLinkage:
> +      case Function::ExternalWeakODRLinkage:
>          ExtWeakSymbols.insert(I);
>          // fallthrough
>        case Function::ExternalLinkage:
> 
> Modified: llvm/trunk/lib/Target/XCore/XCoreTargetAsmInfo.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/XCore/XCoreTargetAsmInfo.cpp?rev=66339&r1=66338&r2=66339&view=diff
> 
> ==============================================================================
> --- llvm/trunk/lib/Target/XCore/XCoreTargetAsmInfo.cpp (original)
> +++ llvm/trunk/lib/Target/XCore/XCoreTargetAsmInfo.cpp Sat Mar  7 09:45:40 2009
> @@ -73,7 +73,7 @@
>  
>    if (const GlobalVariable *GVar = dyn_cast<GlobalVariable>(GV))
>    {
> -    if (!GVar->mayBeOverridden()) {
> +    if (!GVar->isWeakForLinker()) {
>        switch (Kind) {
>        case SectionKind::RODataMergeStr:
>          return MergeableStringSection(GVar);
> 
> Modified: llvm/trunk/lib/Transforms/IPO/IndMemRemoval.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/IPO/IndMemRemoval.cpp?rev=66339&r1=66338&r2=66339&view=diff
> 
> ==============================================================================
> --- llvm/trunk/lib/Transforms/IPO/IndMemRemoval.cpp (original)
> +++ llvm/trunk/lib/Transforms/IPO/IndMemRemoval.cpp Sat Mar  7 09:45:40 2009
> @@ -53,7 +53,7 @@
>    if (Function* F = M.getFunction("free")) {
>      if (F->isDeclaration() && F->arg_size() == 1 && !F->use_empty()) {
>        Function* FN = Function::Create(F->getFunctionType(),
> -                                      GlobalValue::LinkOnceLinkage,
> +                                      GlobalValue::LinkOnceAnyLinkage,
>                                        "free_llvm_bounce", &M);
>        BasicBlock* bb = BasicBlock::Create("entry",FN);
>        Instruction* R = ReturnInst::Create(bb);
> @@ -67,7 +67,7 @@
>    if (Function* F = M.getFunction("malloc")) {
>      if (F->isDeclaration() && F->arg_size() == 1 && !F->use_empty()) {
>        Function* FN = Function::Create(F->getFunctionType(), 
> -                                      GlobalValue::LinkOnceLinkage, 
> +                                      GlobalValue::LinkOnceAnyLinkage,
>                                        "malloc_llvm_bounce", &M);
>        FN->setDoesNotAlias(0);
>        BasicBlock* bb = BasicBlock::Create("entry",FN);
> 
> Modified: llvm/trunk/lib/Transforms/Utils/InlineCost.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Utils/InlineCost.cpp?rev=66339&r1=66338&r2=66339&view=diff
> 
> ==============================================================================
> --- llvm/trunk/lib/Transforms/Utils/InlineCost.cpp (original)
> +++ llvm/trunk/lib/Transforms/Utils/InlineCost.cpp Sat Mar  7 09:45:40 2009
> @@ -182,12 +182,9 @@
>  
>        // Don't inline functions which can be redefined at link-time to mean
>        // something else.
> -      // FIXME: We allow link-once linkage since in practice all versions of
> -      // the function have the same body (C++ ODR) - but the LLVM definition
> -      // of LinkOnceLinkage doesn't require this.
> -   if ((Callee->mayBeOverridden() && !Callee->hasLinkOnceLinkage()) ||
> -      // Don't inline functions marked noinline.
> -      Callee->hasFnAttr(Attribute::NoInline) || NeverInline.count(Callee))
> +   if (Callee->mayBeOverridden() ||
> +       // Don't inline functions marked noinline.
> +       Callee->hasFnAttr(Attribute::NoInline) || NeverInline.count(Callee))
>      return llvm::InlineCost::getNever();
>  
>    // InlineCost - This value measures how good of an inline candidate this call
> 
> Modified: llvm/trunk/lib/Transforms/Utils/LowerInvoke.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Utils/LowerInvoke.cpp?rev=66339&r1=66338&r2=66339&view=diff
> 
> ==============================================================================
> --- llvm/trunk/lib/Transforms/Utils/LowerInvoke.cpp (original)
> +++ llvm/trunk/lib/Transforms/Utils/LowerInvoke.cpp Sat Mar  7 09:45:40 2009
> @@ -139,7 +139,7 @@
>      // already exists.
>      if (!(JBListHead = M.getGlobalVariable("llvm.sjljeh.jblist", PtrJBList))) {
>        JBListHead = new GlobalVariable(PtrJBList, false,
> -                                      GlobalValue::LinkOnceLinkage,
> +                                      GlobalValue::LinkOnceAnyLinkage,
>                                        Constant::getNullValue(PtrJBList),
>                                        "llvm.sjljeh.jblist", &M);
>      }
> 
> Modified: llvm/trunk/lib/VMCore/AsmWriter.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/VMCore/AsmWriter.cpp?rev=66339&r1=66338&r2=66339&view=diff
> 
> ==============================================================================
> --- llvm/trunk/lib/VMCore/AsmWriter.cpp (original)
> +++ llvm/trunk/lib/VMCore/AsmWriter.cpp Sat Mar  7 09:45:40 2009
> @@ -1183,22 +1183,26 @@
>  
>  static void PrintLinkage(GlobalValue::LinkageTypes LT, raw_ostream &Out) {
>    switch (LT) {
> -  case GlobalValue::PrivateLinkage:      Out << "private "; break;
> -  case GlobalValue::InternalLinkage:     Out << "internal "; break;
> -  case GlobalValue::LinkOnceLinkage:     Out << "linkonce "; break;
> -  case GlobalValue::WeakLinkage:         Out << "weak "; break;
> -  case GlobalValue::CommonLinkage:       Out << "common "; break;
> -  case GlobalValue::AppendingLinkage:    Out << "appending "; break;
> -  case GlobalValue::DLLImportLinkage:    Out << "dllimport "; break;
> -  case GlobalValue::DLLExportLinkage:    Out << "dllexport "; break;
> -  case GlobalValue::ExternalWeakLinkage: Out << "extern_weak "; break;      
> +  case GlobalValue::PrivateLinkage:     Out << "private "; break;
> +  case GlobalValue::InternalLinkage:    Out << "internal "; break;
> +  case GlobalValue::LinkOnceAnyLinkage: Out << "linkonce "; break;
> +  case GlobalValue::LinkOnceODRLinkage: Out << "linkonce_odr "; break;
> +  case GlobalValue::WeakAnyLinkage:     Out << "weak "; break;
> +  case GlobalValue::WeakODRLinkage:     Out << "weak_odr "; break;
> +  case GlobalValue::CommonAnyLinkage:   Out << "common "; break;
> +  case GlobalValue::CommonODRLinkage:   Out << "common_odr "; break;
> +  case GlobalValue::AppendingLinkage:   Out << "appending "; break;
> +  case GlobalValue::DLLImportLinkage:   Out << "dllimport "; break;
> +  case GlobalValue::DLLExportLinkage:   Out << "dllexport "; break;
> +  case GlobalValue::ExternalWeakAnyLinkage: Out << "extern_weak "; break;
> +  case GlobalValue::ExternalWeakODRLinkage: Out << "extern_weak_odr "; break;
>    case GlobalValue::ExternalLinkage: break;
>    case GlobalValue::GhostLinkage:
>      Out << "GhostLinkage not allowed in AsmWriter!\n";
>      abort();
>    }
>  }
> -      
> +
>  
>  static void PrintVisibility(GlobalValue::VisibilityTypes Vis,
>                              raw_ostream &Out) {
> 
> Modified: llvm/trunk/utils/emacs/llvm-mode.el
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/emacs/llvm-mode.el?rev=66339&r1=66338&r2=66339&view=diff
> 
> ==============================================================================
> --- llvm/trunk/utils/emacs/llvm-mode.el (original)
> +++ llvm/trunk/utils/emacs/llvm-mode.el Sat Mar  7 09:45:40 2009
> @@ -27,7 +27,7 @@
>     ;; Hex constants
>     '("\\b0x[0-9A-Fa-f]+\\b" . font-lock-preprocessor-face)
>     ;; Keywords
> -   '("\\bbegin\\b\\|\\bend\\b\\|\\btrue\\b\\|\\bfalse\\b\\|\\bzeroinitializer\\b\\|\\bdeclare\\b\\|\\bdefine\\b\\|\\bglobal\\b\\|\\bconstant\\b\\|\\bconst\\b\\|\\binternal\\b\\|\\blinkonce\\b\\|\\bweak\\b\\|\\bappending\\b\\|\\buninitialized\\b\\|\\bimplementation\\b\\|\\b\\.\\.\\.\\b\\|\\bnull\\b\\|\\bundef\\b\\|\\bto\\b\\|\\bexcept\\b\\|\\bnot\\b\\|\\btarget\\b\\|\\bendian\\b\\|\\blittle\\b\\|\\bbig\\b\\|\\bpointersize\\b\\|\\bdeplibs\\b\\|\\bvolatile\\b\\|\\bfastcc\\b\\|\\bcoldcc\\b\\|\\bcc\\b" . font-lock-keyword-face)
> +   '("\\bbegin\\b\\|\\bend\\b\\|\\btrue\\b\\|\\bfalse\\b\\|\\bzeroinitializer\\b\\|\\bdeclare\\b\\|\\bdefine\\b\\|\\bglobal\\b\\|\\bconstant\\b\\|\\bconst\\b\\|\\binternal\\b\\|\\blinkonce\\b\\|\\blinkonce_odr\\b\\|\\bweak\\b\\|\\bweak_odr\\b\\|\\bappending\\b\\|\\buninitialized\\b\\|\\bimplementation\\b\\|\\b\\.\\.\\.\\b\\|\\bnull\\b\\|\\bundef\\b\\|\\bto\\b\\|\\bexcept\\b\\|\\bnot\\b\\|\\btarget\\b\\|\\bendian\\b\\|\\blittle\\b\\|\\bbig\\b\\|\\bpointersize\\b\\|\\bdeplibs\\b\\|\\bvolatile\\b\\|\\bfastcc\\b\\|\\bcoldcc\\b\\|\\bcc\\b" . font-lock-keyword-face)
>     ;; Arithmetic and Logical Operators
>     '("\\badd\\b\\|\\bsub\\b\\|\\bmul\\b\\|\\bdiv\\b\\|\\brem\\b\\|\\band\\b\\|\\bor\\b\\|\\bxor\\b\\|\\bset\\(ne\\b\\|\\beq\\b\\|\\blt\\b\\|\\bgt\\b\\|\\ble\\b\\|\\bge\\b\\)" . font-lock-keyword-face)
>     ;; Special instructions
> 
> Modified: llvm/trunk/utils/llvm.grm
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/llvm.grm?rev=66339&r1=66338&r2=66339&view=diff
> 
> ==============================================================================
> --- llvm/trunk/utils/llvm.grm (original)
> +++ llvm/trunk/utils/llvm.grm Sat Mar  7 09:45:40 2009
> @@ -82,15 +82,19 @@
>  GVInternalLinkage
>    ::= + internal
>   | weak
> + | "weak_odr"
>   | linkonce
> + | "linkonce_odr"
>   | appending
>   | dllexport
>   | common
> + | "common_odr"
>   ;
>  
>  GVExternalLinkage
>    ::= dllimport
>   | "extern_weak"
> + | "extern_weak_odr"
>   | + external
>   ;
>  
> @@ -105,17 +109,20 @@
>    ::= + _
>   | dllimport
>   | "extern_weak"
> + | "extern_weak_odr"
>   ;
>  
>  FunctionDefineLinkage
>    ::= + _
>   | internal
>   | linkonce
> + | "linkonce_odr"
>   | weak
> + | "weak_odr"
>   | dllexport
>   ;
>  
> -AliasLinkage ::= + _ | weak | internal ;
> +AliasLinkage ::= + _ | weak | "weak_odr" | internal ;
>  
>  OptCallingConv ::= + _ |
>                   ccc |
> 
> Modified: llvm/trunk/utils/vim/llvm.vim
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/vim/llvm.vim?rev=66339&r1=66338&r2=66339&view=diff
> 
> ==============================================================================
> --- llvm/trunk/utils/vim/llvm.vim (original)
> +++ llvm/trunk/utils/vim/llvm.vim Sat Mar  7 09:45:40 2009
> @@ -40,7 +40,8 @@
>  " Keywords.
>  syn keyword llvmKeyword define declare global constant
>  syn keyword llvmKeyword internal external
> -syn keyword llvmKeyword linkonce weak appending common extern_weak
> +syn keyword llvmKeyword linkonce linkonce_odr weak weak_odr appending
> +syn keyword llvmKeyword common common_odr extern_weak extern_weak_odr
>  syn keyword llvmKeyword thread_local dllimport dllexport
>  syn keyword llvmKeyword hidden protected default
>  syn keyword llvmKeyword except deplibs
> 
> 
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
> 




More information about the llvm-commits mailing list