Change the linker_private_weak_def_auto' linkage to linkonce_odr_auto_hide' to
make it more consistent with its intended semantics. The `linker_private_weak_def_auto' linkage type was meant to automatically hide globals which never had their addresses taken. It has nothing to do with the `linker_private' linkage type, which outputs the symbols with a `l' (ell) prefix among other things. The intended semantic is more like the `linkonce_odr' linkage type. Change the name of the linkage type to `linkonce_odr_auto_hide'. And therefore changing the semantics so that it produces the correct output for the linker. Note: The old linkage name `linker_private_weak_def_auto' will still parse but is not a synonym for `linkonce_odr_auto_hide'. This should be removed in 4.0. <rdar://problem/11754934> llvm-svn: 162114
This commit is contained in:
@@ -25,7 +25,6 @@
|
|||||||
<li><a href="#linkage_private">'<tt>private</tt>' Linkage</a></li>
|
<li><a href="#linkage_private">'<tt>private</tt>' Linkage</a></li>
|
||||||
<li><a href="#linkage_linker_private">'<tt>linker_private</tt>' Linkage</a></li>
|
<li><a href="#linkage_linker_private">'<tt>linker_private</tt>' Linkage</a></li>
|
||||||
<li><a href="#linkage_linker_private_weak">'<tt>linker_private_weak</tt>' Linkage</a></li>
|
<li><a href="#linkage_linker_private_weak">'<tt>linker_private_weak</tt>' Linkage</a></li>
|
||||||
<li><a href="#linkage_linker_private_weak_def_auto">'<tt>linker_private_weak_def_auto</tt>' Linkage</a></li>
|
|
||||||
<li><a href="#linkage_internal">'<tt>internal</tt>' Linkage</a></li>
|
<li><a href="#linkage_internal">'<tt>internal</tt>' Linkage</a></li>
|
||||||
<li><a href="#linkage_available_externally">'<tt>available_externally</tt>' Linkage</a></li>
|
<li><a href="#linkage_available_externally">'<tt>available_externally</tt>' Linkage</a></li>
|
||||||
<li><a href="#linkage_linkonce">'<tt>linkonce</tt>' Linkage</a></li>
|
<li><a href="#linkage_linkonce">'<tt>linkonce</tt>' Linkage</a></li>
|
||||||
@@ -34,6 +33,7 @@
|
|||||||
<li><a href="#linkage_appending">'<tt>appending</tt>' Linkage</a></li>
|
<li><a href="#linkage_appending">'<tt>appending</tt>' Linkage</a></li>
|
||||||
<li><a href="#linkage_externweak">'<tt>extern_weak</tt>' Linkage</a></li>
|
<li><a href="#linkage_externweak">'<tt>extern_weak</tt>' Linkage</a></li>
|
||||||
<li><a href="#linkage_linkonce_odr">'<tt>linkonce_odr</tt>' Linkage</a></li>
|
<li><a href="#linkage_linkonce_odr">'<tt>linkonce_odr</tt>' Linkage</a></li>
|
||||||
|
<li><a href="#linkage_linkonce_odr_auto_hide">'<tt>linkonce_odr_auto_hide</tt>' Linkage</a></li>
|
||||||
<li><a href="#linkage_weak">'<tt>weak_odr</tt>' Linkage</a></li>
|
<li><a href="#linkage_weak">'<tt>weak_odr</tt>' Linkage</a></li>
|
||||||
<li><a href="#linkage_external">'<tt>external</tt>' Linkage</a></li>
|
<li><a href="#linkage_external">'<tt>external</tt>' Linkage</a></li>
|
||||||
<li><a href="#linkage_dllimport">'<tt>dllimport</tt>' Linkage</a></li>
|
<li><a href="#linkage_dllimport">'<tt>dllimport</tt>' Linkage</a></li>
|
||||||
@@ -576,15 +576,6 @@ define i32 @main() { <i>; i32()* </i>
|
|||||||
linker. The symbols are removed by the linker from the final linked image
|
linker. The symbols are removed by the linker from the final linked image
|
||||||
(executable or dynamic library).</dd>
|
(executable or dynamic library).</dd>
|
||||||
|
|
||||||
<dt><tt><b><a name="linkage_linker_private_weak_def_auto">linker_private_weak_def_auto</a></b></tt></dt>
|
|
||||||
<dd>Similar to "<tt>linker_private_weak</tt>", but it's known that the address
|
|
||||||
of the object is not taken. For instance, functions that had an inline
|
|
||||||
definition, but the compiler decided not to inline it. Note,
|
|
||||||
unlike <tt>linker_private</tt> and <tt>linker_private_weak</tt>,
|
|
||||||
<tt>linker_private_weak_def_auto</tt> may have only <tt>default</tt>
|
|
||||||
visibility. The symbols are removed by the linker from the final linked
|
|
||||||
image (executable or dynamic library).</dd>
|
|
||||||
|
|
||||||
<dt><tt><b><a name="linkage_internal">internal</a></b></tt></dt>
|
<dt><tt><b><a name="linkage_internal">internal</a></b></tt></dt>
|
||||||
<dd>Similar to private, but the value shows as a local symbol
|
<dd>Similar to private, but the value shows as a local symbol
|
||||||
(<tt>STB_LOCAL</tt> in the case of ELF) in the object file. This
|
(<tt>STB_LOCAL</tt> in the case of ELF) in the object file. This
|
||||||
@@ -653,6 +644,14 @@ define i32 @main() { <i>; i32()* </i>
|
|||||||
be merged with equivalent globals. These linkage types are otherwise the
|
be merged with equivalent globals. These linkage types are otherwise the
|
||||||
same as their non-<tt>odr</tt> versions.</dd>
|
same as their non-<tt>odr</tt> versions.</dd>
|
||||||
|
|
||||||
|
<dt><tt><b><a name="linkage_linkonce_odr_auto_hide">linkonce_odr_auto_hide</a></b></tt></dt>
|
||||||
|
<dd>Similar to "<tt>linkonce_odr</tt>", but nothing in the translation unit
|
||||||
|
takes the address of this definition. For instance, functions that had an
|
||||||
|
inline definition, but the compiler decided not to inline it.
|
||||||
|
<tt>linkonce_odr_auto_hide</tt> may have only <tt>default</tt> visibility.
|
||||||
|
The symbols are removed by the linker from the final linked image
|
||||||
|
(executable or dynamic library).</dd>
|
||||||
|
|
||||||
<dt><tt><b><a name="linkage_external">external</a></b></tt></dt>
|
<dt><tt><b><a name="linkage_external">external</a></b></tt></dt>
|
||||||
<dd>If none of the above identifiers are used, the global is externally
|
<dd>If none of the above identifiers are used, the global is externally
|
||||||
visible, meaning that it participates in linkage and can be used to
|
visible, meaning that it participates in linkage and can be used to
|
||||||
|
|||||||
@@ -282,6 +282,7 @@ typedef enum {
|
|||||||
LLVMLinkOnceAnyLinkage, /**< Keep one copy of function when linking (inline)*/
|
LLVMLinkOnceAnyLinkage, /**< Keep one copy of function when linking (inline)*/
|
||||||
LLVMLinkOnceODRLinkage, /**< Same, but only replaced by something
|
LLVMLinkOnceODRLinkage, /**< Same, but only replaced by something
|
||||||
equivalent. */
|
equivalent. */
|
||||||
|
LLVMLinkOnceODRAutoHideLinkage, /**< Like LinkOnceODR, but possibly hidden. */
|
||||||
LLVMWeakAnyLinkage, /**< Keep one copy of function when linking (weak) */
|
LLVMWeakAnyLinkage, /**< Keep one copy of function when linking (weak) */
|
||||||
LLVMWeakODRLinkage, /**< Same, but only replaced by something
|
LLVMWeakODRLinkage, /**< Same, but only replaced by something
|
||||||
equivalent. */
|
equivalent. */
|
||||||
@@ -295,9 +296,7 @@ typedef enum {
|
|||||||
LLVMGhostLinkage, /**< Obsolete */
|
LLVMGhostLinkage, /**< Obsolete */
|
||||||
LLVMCommonLinkage, /**< Tentative definitions */
|
LLVMCommonLinkage, /**< Tentative definitions */
|
||||||
LLVMLinkerPrivateLinkage, /**< Like Private, but linker removes. */
|
LLVMLinkerPrivateLinkage, /**< Like Private, but linker removes. */
|
||||||
LLVMLinkerPrivateWeakLinkage, /**< Like LinkerPrivate, but is weak. */
|
LLVMLinkerPrivateWeakLinkage /**< Like LinkerPrivate, but is weak. */
|
||||||
LLVMLinkerPrivateWeakDefAutoLinkage /**< Like LinkerPrivateWeak, but possibly
|
|
||||||
hidden. */
|
|
||||||
} LLVMLinkage;
|
} LLVMLinkage;
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
|
|||||||
@@ -34,6 +34,7 @@ public:
|
|||||||
AvailableExternallyLinkage, ///< Available for inspection, not emission.
|
AvailableExternallyLinkage, ///< Available for inspection, not emission.
|
||||||
LinkOnceAnyLinkage, ///< Keep one copy of function when linking (inline)
|
LinkOnceAnyLinkage, ///< Keep one copy of function when linking (inline)
|
||||||
LinkOnceODRLinkage, ///< Same, but only replaced by something equivalent.
|
LinkOnceODRLinkage, ///< Same, but only replaced by something equivalent.
|
||||||
|
LinkOnceODRAutoHideLinkage, ///< Like LinkOnceODRLinkage but addr not taken.
|
||||||
WeakAnyLinkage, ///< Keep one copy of named function when linking (weak)
|
WeakAnyLinkage, ///< Keep one copy of named function when linking (weak)
|
||||||
WeakODRLinkage, ///< Same, but only replaced by something equivalent.
|
WeakODRLinkage, ///< Same, but only replaced by something equivalent.
|
||||||
AppendingLinkage, ///< Special purpose, only applies to global arrays
|
AppendingLinkage, ///< Special purpose, only applies to global arrays
|
||||||
@@ -41,8 +42,6 @@ public:
|
|||||||
PrivateLinkage, ///< Like Internal, but omit from symbol table.
|
PrivateLinkage, ///< Like Internal, but omit from symbol table.
|
||||||
LinkerPrivateLinkage, ///< Like Private, but linker removes.
|
LinkerPrivateLinkage, ///< Like Private, but linker removes.
|
||||||
LinkerPrivateWeakLinkage, ///< Like LinkerPrivate, but weak.
|
LinkerPrivateWeakLinkage, ///< Like LinkerPrivate, but weak.
|
||||||
LinkerPrivateWeakDefAutoLinkage, ///< Like LinkerPrivateWeak, but possibly
|
|
||||||
/// hidden.
|
|
||||||
DLLImportLinkage, ///< Function to be imported from DLL
|
DLLImportLinkage, ///< Function to be imported from DLL
|
||||||
DLLExportLinkage, ///< Function to be accessible from DLL.
|
DLLExportLinkage, ///< Function to be accessible from DLL.
|
||||||
ExternalWeakLinkage,///< ExternalWeak linkage description.
|
ExternalWeakLinkage,///< ExternalWeak linkage description.
|
||||||
@@ -123,7 +122,12 @@ public:
|
|||||||
return Linkage == AvailableExternallyLinkage;
|
return Linkage == AvailableExternallyLinkage;
|
||||||
}
|
}
|
||||||
static bool isLinkOnceLinkage(LinkageTypes Linkage) {
|
static bool isLinkOnceLinkage(LinkageTypes Linkage) {
|
||||||
return Linkage == LinkOnceAnyLinkage || Linkage == LinkOnceODRLinkage;
|
return Linkage == LinkOnceAnyLinkage ||
|
||||||
|
Linkage == LinkOnceODRLinkage ||
|
||||||
|
Linkage == LinkOnceODRAutoHideLinkage;
|
||||||
|
}
|
||||||
|
static bool isLinkOnceODRAutoHideLinkage(LinkageTypes Linkage) {
|
||||||
|
return Linkage == LinkOnceODRAutoHideLinkage;
|
||||||
}
|
}
|
||||||
static bool isWeakLinkage(LinkageTypes Linkage) {
|
static bool isWeakLinkage(LinkageTypes Linkage) {
|
||||||
return Linkage == WeakAnyLinkage || Linkage == WeakODRLinkage;
|
return Linkage == WeakAnyLinkage || Linkage == WeakODRLinkage;
|
||||||
@@ -143,13 +147,9 @@ public:
|
|||||||
static bool isLinkerPrivateWeakLinkage(LinkageTypes Linkage) {
|
static bool isLinkerPrivateWeakLinkage(LinkageTypes Linkage) {
|
||||||
return Linkage == LinkerPrivateWeakLinkage;
|
return Linkage == LinkerPrivateWeakLinkage;
|
||||||
}
|
}
|
||||||
static bool isLinkerPrivateWeakDefAutoLinkage(LinkageTypes Linkage) {
|
|
||||||
return Linkage == LinkerPrivateWeakDefAutoLinkage;
|
|
||||||
}
|
|
||||||
static bool isLocalLinkage(LinkageTypes Linkage) {
|
static bool isLocalLinkage(LinkageTypes Linkage) {
|
||||||
return isInternalLinkage(Linkage) || isPrivateLinkage(Linkage) ||
|
return isInternalLinkage(Linkage) || isPrivateLinkage(Linkage) ||
|
||||||
isLinkerPrivateLinkage(Linkage) || isLinkerPrivateWeakLinkage(Linkage) ||
|
isLinkerPrivateLinkage(Linkage) || isLinkerPrivateWeakLinkage(Linkage);
|
||||||
isLinkerPrivateWeakDefAutoLinkage(Linkage);
|
|
||||||
}
|
}
|
||||||
static bool isDLLImportLinkage(LinkageTypes Linkage) {
|
static bool isDLLImportLinkage(LinkageTypes Linkage) {
|
||||||
return Linkage == DLLImportLinkage;
|
return Linkage == DLLImportLinkage;
|
||||||
@@ -178,8 +178,7 @@ public:
|
|||||||
Linkage == LinkOnceAnyLinkage ||
|
Linkage == LinkOnceAnyLinkage ||
|
||||||
Linkage == CommonLinkage ||
|
Linkage == CommonLinkage ||
|
||||||
Linkage == ExternalWeakLinkage ||
|
Linkage == ExternalWeakLinkage ||
|
||||||
Linkage == LinkerPrivateWeakLinkage ||
|
Linkage == LinkerPrivateWeakLinkage;
|
||||||
Linkage == LinkerPrivateWeakDefAutoLinkage;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// isWeakForLinker - Whether the definition of this global may be replaced at
|
/// isWeakForLinker - Whether the definition of this global may be replaced at
|
||||||
@@ -192,10 +191,10 @@ public:
|
|||||||
Linkage == WeakODRLinkage ||
|
Linkage == WeakODRLinkage ||
|
||||||
Linkage == LinkOnceAnyLinkage ||
|
Linkage == LinkOnceAnyLinkage ||
|
||||||
Linkage == LinkOnceODRLinkage ||
|
Linkage == LinkOnceODRLinkage ||
|
||||||
|
Linkage == LinkOnceODRAutoHideLinkage ||
|
||||||
Linkage == CommonLinkage ||
|
Linkage == CommonLinkage ||
|
||||||
Linkage == ExternalWeakLinkage ||
|
Linkage == ExternalWeakLinkage ||
|
||||||
Linkage == LinkerPrivateWeakLinkage ||
|
Linkage == LinkerPrivateWeakLinkage;
|
||||||
Linkage == LinkerPrivateWeakDefAutoLinkage;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool hasExternalLinkage() const { return isExternalLinkage(Linkage); }
|
bool hasExternalLinkage() const { return isExternalLinkage(Linkage); }
|
||||||
@@ -205,6 +204,9 @@ public:
|
|||||||
bool hasLinkOnceLinkage() const {
|
bool hasLinkOnceLinkage() const {
|
||||||
return isLinkOnceLinkage(Linkage);
|
return isLinkOnceLinkage(Linkage);
|
||||||
}
|
}
|
||||||
|
bool hasLinkOnceODRAutoHideLinkage() const {
|
||||||
|
return isLinkOnceODRAutoHideLinkage(Linkage);
|
||||||
|
}
|
||||||
bool hasWeakLinkage() const {
|
bool hasWeakLinkage() const {
|
||||||
return isWeakLinkage(Linkage);
|
return isWeakLinkage(Linkage);
|
||||||
}
|
}
|
||||||
@@ -215,9 +217,6 @@ public:
|
|||||||
bool hasLinkerPrivateWeakLinkage() const {
|
bool hasLinkerPrivateWeakLinkage() const {
|
||||||
return isLinkerPrivateWeakLinkage(Linkage);
|
return isLinkerPrivateWeakLinkage(Linkage);
|
||||||
}
|
}
|
||||||
bool hasLinkerPrivateWeakDefAutoLinkage() const {
|
|
||||||
return isLinkerPrivateWeakDefAutoLinkage(Linkage);
|
|
||||||
}
|
|
||||||
bool hasLocalLinkage() const { return isLocalLinkage(Linkage); }
|
bool hasLocalLinkage() const { return isLocalLinkage(Linkage); }
|
||||||
bool hasDLLImportLinkage() const { return isDLLImportLinkage(Linkage); }
|
bool hasDLLImportLinkage() const { return isDLLImportLinkage(Linkage); }
|
||||||
bool hasDLLExportLinkage() const { return isDLLExportLinkage(Linkage); }
|
bool hasDLLExportLinkage() const { return isDLLExportLinkage(Linkage); }
|
||||||
|
|||||||
@@ -456,11 +456,12 @@ lltok::Kind LLLexer::LexIdentifier() {
|
|||||||
KEYWORD(private);
|
KEYWORD(private);
|
||||||
KEYWORD(linker_private);
|
KEYWORD(linker_private);
|
||||||
KEYWORD(linker_private_weak);
|
KEYWORD(linker_private_weak);
|
||||||
KEYWORD(linker_private_weak_def_auto);
|
KEYWORD(linker_private_weak_def_auto); // FIXME: For backwards compatibility.
|
||||||
KEYWORD(internal);
|
KEYWORD(internal);
|
||||||
KEYWORD(available_externally);
|
KEYWORD(available_externally);
|
||||||
KEYWORD(linkonce);
|
KEYWORD(linkonce);
|
||||||
KEYWORD(linkonce_odr);
|
KEYWORD(linkonce_odr);
|
||||||
|
KEYWORD(linkonce_odr_auto_hide);
|
||||||
KEYWORD(weak);
|
KEYWORD(weak);
|
||||||
KEYWORD(weak_odr);
|
KEYWORD(weak_odr);
|
||||||
KEYWORD(appending);
|
KEYWORD(appending);
|
||||||
|
|||||||
@@ -184,12 +184,13 @@ bool LLParser::ParseTopLevelEntities() {
|
|||||||
case lltok::kw_private: // OptionalLinkage
|
case lltok::kw_private: // OptionalLinkage
|
||||||
case lltok::kw_linker_private: // OptionalLinkage
|
case lltok::kw_linker_private: // OptionalLinkage
|
||||||
case lltok::kw_linker_private_weak: // OptionalLinkage
|
case lltok::kw_linker_private_weak: // OptionalLinkage
|
||||||
case lltok::kw_linker_private_weak_def_auto: // OptionalLinkage
|
case lltok::kw_linker_private_weak_def_auto: // FIXME: backwards compat.
|
||||||
case lltok::kw_internal: // OptionalLinkage
|
case lltok::kw_internal: // OptionalLinkage
|
||||||
case lltok::kw_weak: // OptionalLinkage
|
case lltok::kw_weak: // OptionalLinkage
|
||||||
case lltok::kw_weak_odr: // OptionalLinkage
|
case lltok::kw_weak_odr: // OptionalLinkage
|
||||||
case lltok::kw_linkonce: // OptionalLinkage
|
case lltok::kw_linkonce: // OptionalLinkage
|
||||||
case lltok::kw_linkonce_odr: // OptionalLinkage
|
case lltok::kw_linkonce_odr: // OptionalLinkage
|
||||||
|
case lltok::kw_linkonce_odr_auto_hide: // OptionalLinkage
|
||||||
case lltok::kw_appending: // OptionalLinkage
|
case lltok::kw_appending: // OptionalLinkage
|
||||||
case lltok::kw_dllexport: // OptionalLinkage
|
case lltok::kw_dllexport: // OptionalLinkage
|
||||||
case lltok::kw_common: // OptionalLinkage
|
case lltok::kw_common: // OptionalLinkage
|
||||||
@@ -576,8 +577,7 @@ bool LLParser::ParseAlias(const std::string &Name, LocTy NameLoc,
|
|||||||
Linkage != GlobalValue::InternalLinkage &&
|
Linkage != GlobalValue::InternalLinkage &&
|
||||||
Linkage != GlobalValue::PrivateLinkage &&
|
Linkage != GlobalValue::PrivateLinkage &&
|
||||||
Linkage != GlobalValue::LinkerPrivateLinkage &&
|
Linkage != GlobalValue::LinkerPrivateLinkage &&
|
||||||
Linkage != GlobalValue::LinkerPrivateWeakLinkage &&
|
Linkage != GlobalValue::LinkerPrivateWeakLinkage)
|
||||||
Linkage != GlobalValue::LinkerPrivateWeakDefAutoLinkage)
|
|
||||||
return Error(LinkageLoc, "invalid linkage type for alias");
|
return Error(LinkageLoc, "invalid linkage type for alias");
|
||||||
|
|
||||||
Constant *Aliasee;
|
Constant *Aliasee;
|
||||||
@@ -990,12 +990,12 @@ bool LLParser::ParseOptionalAttrs(Attributes &Attrs, unsigned AttrKind) {
|
|||||||
/// ::= 'private'
|
/// ::= 'private'
|
||||||
/// ::= 'linker_private'
|
/// ::= 'linker_private'
|
||||||
/// ::= 'linker_private_weak'
|
/// ::= 'linker_private_weak'
|
||||||
/// ::= 'linker_private_weak_def_auto'
|
|
||||||
/// ::= 'internal'
|
/// ::= 'internal'
|
||||||
/// ::= 'weak'
|
/// ::= 'weak'
|
||||||
/// ::= 'weak_odr'
|
/// ::= 'weak_odr'
|
||||||
/// ::= 'linkonce'
|
/// ::= 'linkonce'
|
||||||
/// ::= 'linkonce_odr'
|
/// ::= 'linkonce_odr'
|
||||||
|
/// ::= 'linkonce_odr_auto_hide'
|
||||||
/// ::= 'available_externally'
|
/// ::= 'available_externally'
|
||||||
/// ::= 'appending'
|
/// ::= 'appending'
|
||||||
/// ::= 'dllexport'
|
/// ::= 'dllexport'
|
||||||
@@ -1012,14 +1012,15 @@ bool LLParser::ParseOptionalLinkage(unsigned &Res, bool &HasLinkage) {
|
|||||||
case lltok::kw_linker_private_weak:
|
case lltok::kw_linker_private_weak:
|
||||||
Res = GlobalValue::LinkerPrivateWeakLinkage;
|
Res = GlobalValue::LinkerPrivateWeakLinkage;
|
||||||
break;
|
break;
|
||||||
case lltok::kw_linker_private_weak_def_auto:
|
|
||||||
Res = GlobalValue::LinkerPrivateWeakDefAutoLinkage;
|
|
||||||
break;
|
|
||||||
case lltok::kw_internal: Res = GlobalValue::InternalLinkage; break;
|
case lltok::kw_internal: Res = GlobalValue::InternalLinkage; break;
|
||||||
case lltok::kw_weak: Res = GlobalValue::WeakAnyLinkage; break;
|
case lltok::kw_weak: Res = GlobalValue::WeakAnyLinkage; break;
|
||||||
case lltok::kw_weak_odr: Res = GlobalValue::WeakODRLinkage; break;
|
case lltok::kw_weak_odr: Res = GlobalValue::WeakODRLinkage; break;
|
||||||
case lltok::kw_linkonce: Res = GlobalValue::LinkOnceAnyLinkage; break;
|
case lltok::kw_linkonce: Res = GlobalValue::LinkOnceAnyLinkage; break;
|
||||||
case lltok::kw_linkonce_odr: Res = GlobalValue::LinkOnceODRLinkage; break;
|
case lltok::kw_linkonce_odr: Res = GlobalValue::LinkOnceODRLinkage; break;
|
||||||
|
case lltok::kw_linkonce_odr_auto_hide:
|
||||||
|
case lltok::kw_linker_private_weak_def_auto: // FIXME: For backwards compat.
|
||||||
|
Res = GlobalValue::LinkOnceODRAutoHideLinkage;
|
||||||
|
break;
|
||||||
case lltok::kw_available_externally:
|
case lltok::kw_available_externally:
|
||||||
Res = GlobalValue::AvailableExternallyLinkage;
|
Res = GlobalValue::AvailableExternallyLinkage;
|
||||||
break;
|
break;
|
||||||
@@ -2653,11 +2654,11 @@ bool LLParser::ParseFunctionHeader(Function *&Fn, bool isDefine) {
|
|||||||
case GlobalValue::PrivateLinkage:
|
case GlobalValue::PrivateLinkage:
|
||||||
case GlobalValue::LinkerPrivateLinkage:
|
case GlobalValue::LinkerPrivateLinkage:
|
||||||
case GlobalValue::LinkerPrivateWeakLinkage:
|
case GlobalValue::LinkerPrivateWeakLinkage:
|
||||||
case GlobalValue::LinkerPrivateWeakDefAutoLinkage:
|
|
||||||
case GlobalValue::InternalLinkage:
|
case GlobalValue::InternalLinkage:
|
||||||
case GlobalValue::AvailableExternallyLinkage:
|
case GlobalValue::AvailableExternallyLinkage:
|
||||||
case GlobalValue::LinkOnceAnyLinkage:
|
case GlobalValue::LinkOnceAnyLinkage:
|
||||||
case GlobalValue::LinkOnceODRLinkage:
|
case GlobalValue::LinkOnceODRLinkage:
|
||||||
|
case GlobalValue::LinkOnceODRAutoHideLinkage:
|
||||||
case GlobalValue::WeakAnyLinkage:
|
case GlobalValue::WeakAnyLinkage:
|
||||||
case GlobalValue::WeakODRLinkage:
|
case GlobalValue::WeakODRLinkage:
|
||||||
case GlobalValue::DLLExportLinkage:
|
case GlobalValue::DLLExportLinkage:
|
||||||
|
|||||||
@@ -37,8 +37,10 @@ namespace lltok {
|
|||||||
kw_global, kw_constant,
|
kw_global, kw_constant,
|
||||||
|
|
||||||
kw_private, kw_linker_private, kw_linker_private_weak,
|
kw_private, kw_linker_private, kw_linker_private_weak,
|
||||||
kw_linker_private_weak_def_auto, kw_internal,
|
kw_linker_private_weak_def_auto, // FIXME: For backwards compatibility.
|
||||||
kw_linkonce, kw_linkonce_odr, kw_weak, kw_weak_odr, kw_appending,
|
kw_internal,
|
||||||
|
kw_linkonce, kw_linkonce_odr, kw_linkonce_odr_auto_hide,
|
||||||
|
kw_weak, kw_weak_odr, kw_appending,
|
||||||
kw_dllimport, kw_dllexport, kw_common, kw_available_externally,
|
kw_dllimport, kw_dllexport, kw_common, kw_available_externally,
|
||||||
kw_default, kw_hidden, kw_protected,
|
kw_default, kw_hidden, kw_protected,
|
||||||
kw_unnamed_addr,
|
kw_unnamed_addr,
|
||||||
|
|||||||
@@ -89,7 +89,7 @@ static GlobalValue::LinkageTypes GetDecodedLinkage(unsigned Val) {
|
|||||||
case 12: return GlobalValue::AvailableExternallyLinkage;
|
case 12: return GlobalValue::AvailableExternallyLinkage;
|
||||||
case 13: return GlobalValue::LinkerPrivateLinkage;
|
case 13: return GlobalValue::LinkerPrivateLinkage;
|
||||||
case 14: return GlobalValue::LinkerPrivateWeakLinkage;
|
case 14: return GlobalValue::LinkerPrivateWeakLinkage;
|
||||||
case 15: return GlobalValue::LinkerPrivateWeakDefAutoLinkage;
|
case 15: return GlobalValue::LinkOnceODRAutoHideLinkage;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -365,7 +365,7 @@ static unsigned getEncodedLinkage(const GlobalValue *GV) {
|
|||||||
case GlobalValue::AvailableExternallyLinkage: return 12;
|
case GlobalValue::AvailableExternallyLinkage: return 12;
|
||||||
case GlobalValue::LinkerPrivateLinkage: return 13;
|
case GlobalValue::LinkerPrivateLinkage: return 13;
|
||||||
case GlobalValue::LinkerPrivateWeakLinkage: return 14;
|
case GlobalValue::LinkerPrivateWeakLinkage: return 14;
|
||||||
case GlobalValue::LinkerPrivateWeakDefAutoLinkage: return 15;
|
case GlobalValue::LinkOnceODRAutoHideLinkage: return 15;
|
||||||
}
|
}
|
||||||
llvm_unreachable("Invalid linkage");
|
llvm_unreachable("Invalid linkage");
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -213,16 +213,16 @@ void AsmPrinter::EmitLinkage(unsigned Linkage, MCSymbol *GVSym) const {
|
|||||||
case GlobalValue::CommonLinkage:
|
case GlobalValue::CommonLinkage:
|
||||||
case GlobalValue::LinkOnceAnyLinkage:
|
case GlobalValue::LinkOnceAnyLinkage:
|
||||||
case GlobalValue::LinkOnceODRLinkage:
|
case GlobalValue::LinkOnceODRLinkage:
|
||||||
|
case GlobalValue::LinkOnceODRAutoHideLinkage:
|
||||||
case GlobalValue::WeakAnyLinkage:
|
case GlobalValue::WeakAnyLinkage:
|
||||||
case GlobalValue::WeakODRLinkage:
|
case GlobalValue::WeakODRLinkage:
|
||||||
case GlobalValue::LinkerPrivateWeakLinkage:
|
case GlobalValue::LinkerPrivateWeakLinkage:
|
||||||
case GlobalValue::LinkerPrivateWeakDefAutoLinkage:
|
|
||||||
if (MAI->getWeakDefDirective() != 0) {
|
if (MAI->getWeakDefDirective() != 0) {
|
||||||
// .globl _foo
|
// .globl _foo
|
||||||
OutStreamer.EmitSymbolAttribute(GVSym, MCSA_Global);
|
OutStreamer.EmitSymbolAttribute(GVSym, MCSA_Global);
|
||||||
|
|
||||||
if ((GlobalValue::LinkageTypes)Linkage !=
|
if ((GlobalValue::LinkageTypes)Linkage !=
|
||||||
GlobalValue::LinkerPrivateWeakDefAutoLinkage)
|
GlobalValue::LinkOnceODRAutoHideLinkage)
|
||||||
// .weak_definition _foo
|
// .weak_definition _foo
|
||||||
OutStreamer.EmitSymbolAttribute(GVSym, MCSA_WeakDefinition);
|
OutStreamer.EmitSymbolAttribute(GVSym, MCSA_WeakDefinition);
|
||||||
else
|
else
|
||||||
|
|||||||
@@ -285,14 +285,14 @@ void CppWriter::printLinkageType(GlobalValue::LinkageTypes LT) {
|
|||||||
Out << "GlobalValue::LinkerPrivateLinkage"; break;
|
Out << "GlobalValue::LinkerPrivateLinkage"; break;
|
||||||
case GlobalValue::LinkerPrivateWeakLinkage:
|
case GlobalValue::LinkerPrivateWeakLinkage:
|
||||||
Out << "GlobalValue::LinkerPrivateWeakLinkage"; break;
|
Out << "GlobalValue::LinkerPrivateWeakLinkage"; break;
|
||||||
case GlobalValue::LinkerPrivateWeakDefAutoLinkage:
|
|
||||||
Out << "GlobalValue::LinkerPrivateWeakDefAutoLinkage"; break;
|
|
||||||
case GlobalValue::AvailableExternallyLinkage:
|
case GlobalValue::AvailableExternallyLinkage:
|
||||||
Out << "GlobalValue::AvailableExternallyLinkage "; break;
|
Out << "GlobalValue::AvailableExternallyLinkage "; break;
|
||||||
case GlobalValue::LinkOnceAnyLinkage:
|
case GlobalValue::LinkOnceAnyLinkage:
|
||||||
Out << "GlobalValue::LinkOnceAnyLinkage "; break;
|
Out << "GlobalValue::LinkOnceAnyLinkage "; break;
|
||||||
case GlobalValue::LinkOnceODRLinkage:
|
case GlobalValue::LinkOnceODRLinkage:
|
||||||
Out << "GlobalValue::LinkOnceODRLinkage "; break;
|
Out << "GlobalValue::LinkOnceODRLinkage "; break;
|
||||||
|
case GlobalValue::LinkOnceODRAutoHideLinkage:
|
||||||
|
Out << "GlobalValue::LinkOnceODRAutoHideLinkage"; break;
|
||||||
case GlobalValue::WeakAnyLinkage:
|
case GlobalValue::WeakAnyLinkage:
|
||||||
Out << "GlobalValue::WeakAnyLinkage"; break;
|
Out << "GlobalValue::WeakAnyLinkage"; break;
|
||||||
case GlobalValue::WeakODRLinkage:
|
case GlobalValue::WeakODRLinkage:
|
||||||
|
|||||||
@@ -183,8 +183,7 @@ void Mangler::getNameWithPrefix(SmallVectorImpl<char> &OutName,
|
|||||||
ManglerPrefixTy PrefixTy = Mangler::Default;
|
ManglerPrefixTy PrefixTy = Mangler::Default;
|
||||||
if (GV->hasPrivateLinkage() || isImplicitlyPrivate)
|
if (GV->hasPrivateLinkage() || isImplicitlyPrivate)
|
||||||
PrefixTy = Mangler::Private;
|
PrefixTy = Mangler::Private;
|
||||||
else if (GV->hasLinkerPrivateLinkage() || GV->hasLinkerPrivateWeakLinkage() ||
|
else if (GV->hasLinkerPrivateLinkage() || GV->hasLinkerPrivateWeakLinkage())
|
||||||
GV->hasLinkerPrivateWeakDefAutoLinkage())
|
|
||||||
PrefixTy = Mangler::LinkerPrivate;
|
PrefixTy = Mangler::LinkerPrivate;
|
||||||
|
|
||||||
// If this global has a name, handle it simply.
|
// If this global has a name, handle it simply.
|
||||||
|
|||||||
@@ -1353,12 +1353,12 @@ static void PrintLinkage(GlobalValue::LinkageTypes LT,
|
|||||||
case GlobalValue::LinkerPrivateWeakLinkage:
|
case GlobalValue::LinkerPrivateWeakLinkage:
|
||||||
Out << "linker_private_weak ";
|
Out << "linker_private_weak ";
|
||||||
break;
|
break;
|
||||||
case GlobalValue::LinkerPrivateWeakDefAutoLinkage:
|
|
||||||
Out << "linker_private_weak_def_auto ";
|
|
||||||
break;
|
|
||||||
case GlobalValue::InternalLinkage: Out << "internal "; break;
|
case GlobalValue::InternalLinkage: Out << "internal "; break;
|
||||||
case GlobalValue::LinkOnceAnyLinkage: Out << "linkonce "; break;
|
case GlobalValue::LinkOnceAnyLinkage: Out << "linkonce "; break;
|
||||||
case GlobalValue::LinkOnceODRLinkage: Out << "linkonce_odr "; break;
|
case GlobalValue::LinkOnceODRLinkage: Out << "linkonce_odr "; break;
|
||||||
|
case GlobalValue::LinkOnceODRAutoHideLinkage:
|
||||||
|
Out << "linkonce_odr_auto_hide ";
|
||||||
|
break;
|
||||||
case GlobalValue::WeakAnyLinkage: Out << "weak "; break;
|
case GlobalValue::WeakAnyLinkage: Out << "weak "; break;
|
||||||
case GlobalValue::WeakODRLinkage: Out << "weak_odr "; break;
|
case GlobalValue::WeakODRLinkage: Out << "weak_odr "; break;
|
||||||
case GlobalValue::CommonLinkage: Out << "common "; break;
|
case GlobalValue::CommonLinkage: Out << "common "; break;
|
||||||
|
|||||||
@@ -1084,6 +1084,8 @@ LLVMLinkage LLVMGetLinkage(LLVMValueRef Global) {
|
|||||||
return LLVMLinkOnceAnyLinkage;
|
return LLVMLinkOnceAnyLinkage;
|
||||||
case GlobalValue::LinkOnceODRLinkage:
|
case GlobalValue::LinkOnceODRLinkage:
|
||||||
return LLVMLinkOnceODRLinkage;
|
return LLVMLinkOnceODRLinkage;
|
||||||
|
case GlobalValue::LinkOnceODRAutoHideLinkage:
|
||||||
|
return LLVMLinkOnceODRAutoHideLinkage;
|
||||||
case GlobalValue::WeakAnyLinkage:
|
case GlobalValue::WeakAnyLinkage:
|
||||||
return LLVMWeakAnyLinkage;
|
return LLVMWeakAnyLinkage;
|
||||||
case GlobalValue::WeakODRLinkage:
|
case GlobalValue::WeakODRLinkage:
|
||||||
@@ -1098,8 +1100,6 @@ LLVMLinkage LLVMGetLinkage(LLVMValueRef Global) {
|
|||||||
return LLVMLinkerPrivateLinkage;
|
return LLVMLinkerPrivateLinkage;
|
||||||
case GlobalValue::LinkerPrivateWeakLinkage:
|
case GlobalValue::LinkerPrivateWeakLinkage:
|
||||||
return LLVMLinkerPrivateWeakLinkage;
|
return LLVMLinkerPrivateWeakLinkage;
|
||||||
case GlobalValue::LinkerPrivateWeakDefAutoLinkage:
|
|
||||||
return LLVMLinkerPrivateWeakDefAutoLinkage;
|
|
||||||
case GlobalValue::DLLImportLinkage:
|
case GlobalValue::DLLImportLinkage:
|
||||||
return LLVMDLLImportLinkage;
|
return LLVMDLLImportLinkage;
|
||||||
case GlobalValue::DLLExportLinkage:
|
case GlobalValue::DLLExportLinkage:
|
||||||
@@ -1129,6 +1129,9 @@ void LLVMSetLinkage(LLVMValueRef Global, LLVMLinkage Linkage) {
|
|||||||
case LLVMLinkOnceODRLinkage:
|
case LLVMLinkOnceODRLinkage:
|
||||||
GV->setLinkage(GlobalValue::LinkOnceODRLinkage);
|
GV->setLinkage(GlobalValue::LinkOnceODRLinkage);
|
||||||
break;
|
break;
|
||||||
|
case LLVMLinkOnceODRAutoHideLinkage:
|
||||||
|
GV->setLinkage(GlobalValue::LinkOnceODRAutoHideLinkage);
|
||||||
|
break;
|
||||||
case LLVMWeakAnyLinkage:
|
case LLVMWeakAnyLinkage:
|
||||||
GV->setLinkage(GlobalValue::WeakAnyLinkage);
|
GV->setLinkage(GlobalValue::WeakAnyLinkage);
|
||||||
break;
|
break;
|
||||||
@@ -1150,9 +1153,6 @@ void LLVMSetLinkage(LLVMValueRef Global, LLVMLinkage Linkage) {
|
|||||||
case LLVMLinkerPrivateWeakLinkage:
|
case LLVMLinkerPrivateWeakLinkage:
|
||||||
GV->setLinkage(GlobalValue::LinkerPrivateWeakLinkage);
|
GV->setLinkage(GlobalValue::LinkerPrivateWeakLinkage);
|
||||||
break;
|
break;
|
||||||
case LLVMLinkerPrivateWeakDefAutoLinkage:
|
|
||||||
GV->setLinkage(GlobalValue::LinkerPrivateWeakDefAutoLinkage);
|
|
||||||
break;
|
|
||||||
case LLVMDLLImportLinkage:
|
case LLVMDLLImportLinkage:
|
||||||
GV->setLinkage(GlobalValue::DLLImportLinkage);
|
GV->setLinkage(GlobalValue::DLLImportLinkage);
|
||||||
break;
|
break;
|
||||||
|
|||||||
@@ -400,8 +400,8 @@ void Verifier::visitGlobalValue(GlobalValue &GV) {
|
|||||||
"Only global arrays can have appending linkage!", GVar);
|
"Only global arrays can have appending linkage!", GVar);
|
||||||
}
|
}
|
||||||
|
|
||||||
Assert1(!GV.hasLinkerPrivateWeakDefAutoLinkage() || GV.hasDefaultVisibility(),
|
Assert1(!GV.hasLinkOnceODRAutoHideLinkage() || GV.hasDefaultVisibility(),
|
||||||
"linker_private_weak_def_auto can only have default visibility!",
|
"linkonce_odr_auto_hide can only have default visibility!",
|
||||||
&GV);
|
&GV);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -4,4 +4,3 @@
|
|||||||
|
|
||||||
@foo = linker_private hidden global i32 0
|
@foo = linker_private hidden global i32 0
|
||||||
@bar = linker_private_weak hidden global i32 0
|
@bar = linker_private_weak hidden global i32 0
|
||||||
@qux = linker_private_weak_def_auto global i32 0
|
|
||||||
|
|||||||
@@ -256,7 +256,6 @@ static void DumpSymbolNameForGlobalValue(GlobalValue &GV) {
|
|||||||
if (GV.hasPrivateLinkage() ||
|
if (GV.hasPrivateLinkage() ||
|
||||||
GV.hasLinkerPrivateLinkage() ||
|
GV.hasLinkerPrivateLinkage() ||
|
||||||
GV.hasLinkerPrivateWeakLinkage() ||
|
GV.hasLinkerPrivateWeakLinkage() ||
|
||||||
GV.hasLinkerPrivateWeakDefAutoLinkage() ||
|
|
||||||
GV.hasAvailableExternallyLinkage())
|
GV.hasAvailableExternallyLinkage())
|
||||||
return;
|
return;
|
||||||
char TypeChar = TypeCharForSymbol(GV);
|
char TypeChar = TypeCharForSymbol(GV);
|
||||||
|
|||||||
@@ -487,8 +487,7 @@ void LTOModule::addDefinedSymbol(GlobalValue *def, bool isFunction) {
|
|||||||
|
|
||||||
// set definition part
|
// set definition part
|
||||||
if (def->hasWeakLinkage() || def->hasLinkOnceLinkage() ||
|
if (def->hasWeakLinkage() || def->hasLinkOnceLinkage() ||
|
||||||
def->hasLinkerPrivateWeakLinkage() ||
|
def->hasLinkerPrivateWeakLinkage())
|
||||||
def->hasLinkerPrivateWeakDefAutoLinkage())
|
|
||||||
attr |= LTO_SYMBOL_DEFINITION_WEAK;
|
attr |= LTO_SYMBOL_DEFINITION_WEAK;
|
||||||
else if (def->hasCommonLinkage())
|
else if (def->hasCommonLinkage())
|
||||||
attr |= LTO_SYMBOL_DEFINITION_TENTATIVE;
|
attr |= LTO_SYMBOL_DEFINITION_TENTATIVE;
|
||||||
@@ -504,7 +503,7 @@ void LTOModule::addDefinedSymbol(GlobalValue *def, bool isFunction) {
|
|||||||
def->hasLinkOnceLinkage() || def->hasCommonLinkage() ||
|
def->hasLinkOnceLinkage() || def->hasCommonLinkage() ||
|
||||||
def->hasLinkerPrivateWeakLinkage())
|
def->hasLinkerPrivateWeakLinkage())
|
||||||
attr |= LTO_SYMBOL_SCOPE_DEFAULT;
|
attr |= LTO_SYMBOL_SCOPE_DEFAULT;
|
||||||
else if (def->hasLinkerPrivateWeakDefAutoLinkage())
|
else if (def->hasLinkOnceODRAutoHideLinkage())
|
||||||
attr |= LTO_SYMBOL_SCOPE_DEFAULT_CAN_BE_HIDDEN;
|
attr |= LTO_SYMBOL_SCOPE_DEFAULT_CAN_BE_HIDDEN;
|
||||||
else
|
else
|
||||||
attr |= LTO_SYMBOL_SCOPE_INTERNAL;
|
attr |= LTO_SYMBOL_SCOPE_INTERNAL;
|
||||||
|
|||||||
Reference in New Issue
Block a user