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:
Bill Wendling
2012-08-17 18:33:14 +00:00
parent 9a16735e22
commit 34bc34ecae
17 changed files with 59 additions and 62 deletions

View File

@@ -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>&nbsp;
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>&nbsp;
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

View File

@@ -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 {

View File

@@ -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); }

View File

@@ -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);

View File

@@ -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:

View File

@@ -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,

View File

@@ -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;
} }
} }

View File

@@ -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");
} }

View File

@@ -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

View File

@@ -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:

View File

@@ -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.

View File

@@ -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;

View File

@@ -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;

View File

@@ -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);
} }

View File

@@ -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

View File

@@ -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);

View File

@@ -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;