[llvm-commits] [llvm] r53158 - in /llvm/trunk: include/llvm/GlobalValue.h lib/Linker/LinkModules.cpp
Nick Lewycky
nicholas at mxc.ca
Mon Sep 1 15:06:06 PDT 2008
Anton Korobeynikov wrote:
> Author: asl
> Date: Sat Jul 5 18:48:30 2008
> New Revision: 53158
>
> URL: http://llvm.org/viewvc/llvm-project?rev=53158&view=rev
> Log:
> Add convenient helper for checking whether global is weak in linker sense
> having weak or linkonce or common or extweak LLVM linkage.
Hi Anton,
I ran across this function and have no idea what it is doing. I
understand that it's an OR of those linkage types -- but why? What do
those linkages all have in common? And why do you call it "weak for
linker"? What's the linker got to do with it, above and beyond the
'linkages' that these already are? Could you elaborate in the
documentation for this function? I'd appreciate it.
Specifically, I happened to be looking for a function to determine
whether or not this global was known to be 'absolutely final' at run
time or not, regardless of what else we get linked against, or any
LD_PRELOAD trickery to override weak symbols, etc. For all I know, this
function might be it -- I couldn't tell.
Nick
>
> Modified:
> llvm/trunk/include/llvm/GlobalValue.h
> llvm/trunk/lib/Linker/LinkModules.cpp
>
> Modified: llvm/trunk/include/llvm/GlobalValue.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/GlobalValue.h?rev=53158&r1=53157&r2=53158&view=diff
>
> ==============================================================================
> --- llvm/trunk/include/llvm/GlobalValue.h (original)
> +++ llvm/trunk/include/llvm/GlobalValue.h Sat Jul 5 18:48:30 2008
> @@ -110,6 +110,15 @@
> void setLinkage(LinkageTypes LT) { Linkage = LT; }
> LinkageTypes getLinkage() const { return Linkage; }
>
> + /// isWeakForLinker - Determines if symbol is weak for linker having weak or
> + /// linkonce or common or extweak LLVM linkage.
> + bool isWeakForLinker() const {
> + return (Linkage == WeakLinkage ||
> + Linkage == LinkOnceLinkage ||
> + Linkage == CommonLinkage ||
> + Linkage == ExternalWeakLinkage);
> + }
> +
> /// copyAttributesFrom - copy all additional attributes (those not needed to
> /// create a GlobalValue) from the GlobalValue Src to this one.
> virtual void copyAttributesFrom(const GlobalValue *Src);
>
> Modified: llvm/trunk/lib/Linker/LinkModules.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Linker/LinkModules.cpp?rev=53158&r1=53157&r2=53158&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/Linker/LinkModules.cpp (original)
> +++ llvm/trunk/lib/Linker/LinkModules.cpp Sat Jul 5 18:48:30 2008
> @@ -483,11 +483,10 @@
> "': can only link appending global with another appending global!");
> LinkFromSrc = true; // Special cased.
> LT = Src->getLinkage();
> - } else if (Src->hasWeakLinkage() || Src->hasLinkOnceLinkage() ||
> - Src->hasCommonLinkage()) {
> + } else if (Src->isWeakForLinker()) {
> // At this point we know that Dest has LinkOnce, External*, Weak, Common,
> // or DLL* linkage.
> - if ((Dest->hasLinkOnceLinkage() &&
> + if ((Dest->hasLinkOnceLinkage() &&
> (Src->hasWeakLinkage() || Src->hasCommonLinkage())) ||
> Dest->hasExternalWeakLinkage()) {
> LinkFromSrc = true;
> @@ -496,8 +495,7 @@
> LinkFromSrc = false;
> LT = Dest->getLinkage();
> }
> - } else if (Dest->hasWeakLinkage() || Dest->hasLinkOnceLinkage() ||
> - Dest->hasCommonLinkage()) {
> + } else if (Dest->isWeakForLinker()) {
> // At this point we know that Src has External* or DLL* linkage.
> if (Src->hasExternalWeakLinkage()) {
> LinkFromSrc = false;
> @@ -762,10 +760,7 @@
> } else if (GlobalVariable *DGVar = dyn_cast_or_null<GlobalVariable>(DGV)) {
> // The only allowed way is to link alias with external declaration or weak
> // symbol..
> - if (DGVar->isDeclaration() ||
> - DGVar->hasWeakLinkage() ||
> - DGVar->hasLinkOnceLinkage() ||
> - DGVar->hasCommonLinkage()) {
> + if (DGVar->isDeclaration() || DGVar->isWeakForLinker()) {
> // But only if aliasee is global too...
> if (!isa<GlobalVariable>(DAliasee))
> return Error(Err, "Global-Alias Collision on '" + SGA->getName() +
> @@ -794,10 +789,7 @@
> } else if (Function *DF = dyn_cast_or_null<Function>(DGV)) {
> // The only allowed way is to link alias with external declaration or weak
> // symbol...
> - if (DF->isDeclaration() ||
> - DF->hasWeakLinkage() ||
> - DF->hasLinkOnceLinkage() ||
> - DF->hasCommonLinkage()) {
> + if (DF->isDeclaration() || DF->isWeakForLinker()) {
> // But only if aliasee is function too...
> if (!isa<Function>(DAliasee))
> return Error(Err, "Function-Alias Collision on '" + SGA->getName() +
> @@ -874,12 +866,10 @@
> if (DGV->getInitializer() != SInit)
> return Error(Err, "Global Variable Collision on '" + SGV->getName() +
> "': global variables have different initializers");
> - } else if (DGV->hasLinkOnceLinkage() || DGV->hasWeakLinkage() ||
> - DGV->hasCommonLinkage()) {
> + } else if (DGV->isWeakForLinker()) {
> // Nothing is required, mapped values will take the new global
> // automatically.
> - } else if (SGV->hasLinkOnceLinkage() || SGV->hasWeakLinkage() ||
> - SGV->hasCommonLinkage()) {
> + } else if (SGV->isWeakForLinker()) {
> // Nothing is required, mapped values will take the new global
> // automatically.
> } else if (DGV->hasAppendingLinkage()) {
> @@ -952,10 +942,7 @@
> // The only valid mappings are:
> // - SF is external declaration, which is effectively a no-op.
> // - SF is weak, when we just need to throw SF out.
> - if (!SF->isDeclaration() &&
> - !SF->hasWeakLinkage() &&
> - !SF->hasLinkOnceLinkage() &&
> - !SF->hasCommonLinkage())
> + if (!SF->isDeclaration() && !SF->isWeakForLinker())
> return Error(Err, "Function-Alias Collision on '" + SF->getName() +
> "': symbol multiple defined");
>
> @@ -1042,21 +1029,19 @@
> }
>
> // At this point we know that DF has LinkOnce, Weak, or External* linkage.
> - if (SF->hasWeakLinkage() || SF->hasLinkOnceLinkage() ||
> - SF->hasCommonLinkage()) {
> + if (SF->isWeakForLinker()) {
> ValueMap[SF] = MappedDF;
>
> // Linkonce+Weak = Weak
> // *+External Weak = *
> - if ((DF->hasLinkOnceLinkage() &&
> + if ((DF->hasLinkOnceLinkage() &&
> (SF->hasWeakLinkage() || SF->hasCommonLinkage())) ||
> DF->hasExternalWeakLinkage())
> DF->setLinkage(SF->getLinkage());
> continue;
> }
>
> - if (DF->hasWeakLinkage() || DF->hasLinkOnceLinkage() ||
> - DF->hasCommonLinkage()) {
> + if (DF->isWeakForLinker()) {
> // At this point we know that SF has LinkOnce or External* linkage.
> ValueMap[SF] = MappedDF;
>
>
>
> _______________________________________________
> 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