forked from OSchip/llvm-project
Create the new linker type "linker_private_weak_def_auto".
It's similar to "linker_private_weak", 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 linker_private and linker_private_weak, linker_private_weak_def_auto may have only default visibility. The symbols are removed by the linker from the final linked image (executable or dynamic library). llvm-svn: 111684
This commit is contained in:
parent
196f71006e
commit
578ee4070c
|
@ -25,6 +25,7 @@
|
||||||
<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>
|
||||||
|
@ -557,6 +558,15 @@ 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
|
||||||
|
|
|
@ -227,7 +227,9 @@ 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 {
|
||||||
|
|
|
@ -41,6 +41,8 @@ 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.
|
||||||
|
@ -137,9 +139,13 @@ 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;
|
||||||
|
@ -158,24 +164,26 @@ public:
|
||||||
/// by something non-equivalent at link time. For example, if a function has
|
/// 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.
|
/// weak linkage then the code defining it may be replaced by different code.
|
||||||
static bool mayBeOverridden(LinkageTypes Linkage) {
|
static bool mayBeOverridden(LinkageTypes Linkage) {
|
||||||
return (Linkage == WeakAnyLinkage ||
|
return Linkage == WeakAnyLinkage ||
|
||||||
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
|
||||||
/// link time.
|
/// link time.
|
||||||
static bool isWeakForLinker(LinkageTypes Linkage) {
|
static bool isWeakForLinker(LinkageTypes Linkage) {
|
||||||
return (Linkage == AvailableExternallyLinkage ||
|
return Linkage == AvailableExternallyLinkage ||
|
||||||
Linkage == WeakAnyLinkage ||
|
Linkage == WeakAnyLinkage ||
|
||||||
Linkage == WeakODRLinkage ||
|
Linkage == WeakODRLinkage ||
|
||||||
Linkage == LinkOnceAnyLinkage ||
|
Linkage == LinkOnceAnyLinkage ||
|
||||||
Linkage == LinkOnceODRLinkage ||
|
Linkage == LinkOnceODRLinkage ||
|
||||||
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); }
|
||||||
|
@ -195,6 +203,9 @@ 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); }
|
||||||
|
|
|
@ -493,6 +493,7 @@ 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(internal);
|
KEYWORD(internal);
|
||||||
KEYWORD(available_externally);
|
KEYWORD(available_externally);
|
||||||
KEYWORD(linkonce);
|
KEYWORD(linkonce);
|
||||||
|
|
|
@ -199,6 +199,7 @@ 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_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
|
||||||
|
@ -623,7 +624,8 @@ 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;
|
||||||
|
@ -1008,6 +1010,7 @@ bool LLParser::ParseOptionalAttrs(unsigned &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'
|
||||||
|
@ -1029,6 +1032,9 @@ 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;
|
||||||
|
@ -2718,6 +2724,7 @@ 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:
|
||||||
|
|
|
@ -37,7 +37,8 @@ namespace lltok {
|
||||||
kw_declare, kw_define,
|
kw_declare, kw_define,
|
||||||
kw_global, kw_constant,
|
kw_global, kw_constant,
|
||||||
|
|
||||||
kw_private, kw_linker_private, kw_linker_private_weak, kw_internal,
|
kw_private, kw_linker_private, kw_linker_private_weak,
|
||||||
|
kw_linker_private_weak_def_auto, kw_internal,
|
||||||
kw_linkonce, kw_linkonce_odr, kw_weak, kw_weak_odr, kw_appending,
|
kw_linkonce, kw_linkonce_odr, 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,
|
||||||
|
|
|
@ -77,6 +77,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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -299,21 +299,22 @@ static void WriteTypeTable(const ValueEnumerator &VE, BitstreamWriter &Stream) {
|
||||||
static unsigned getEncodedLinkage(const GlobalValue *GV) {
|
static unsigned getEncodedLinkage(const GlobalValue *GV) {
|
||||||
switch (GV->getLinkage()) {
|
switch (GV->getLinkage()) {
|
||||||
default: llvm_unreachable("Invalid linkage!");
|
default: llvm_unreachable("Invalid linkage!");
|
||||||
case GlobalValue::ExternalLinkage: return 0;
|
case GlobalValue::ExternalLinkage: return 0;
|
||||||
case GlobalValue::WeakAnyLinkage: return 1;
|
case GlobalValue::WeakAnyLinkage: return 1;
|
||||||
case GlobalValue::AppendingLinkage: return 2;
|
case GlobalValue::AppendingLinkage: return 2;
|
||||||
case GlobalValue::InternalLinkage: return 3;
|
case GlobalValue::InternalLinkage: return 3;
|
||||||
case GlobalValue::LinkOnceAnyLinkage: return 4;
|
case GlobalValue::LinkOnceAnyLinkage: return 4;
|
||||||
case GlobalValue::DLLImportLinkage: return 5;
|
case GlobalValue::DLLImportLinkage: return 5;
|
||||||
case GlobalValue::DLLExportLinkage: return 6;
|
case GlobalValue::DLLExportLinkage: return 6;
|
||||||
case GlobalValue::ExternalWeakLinkage: return 7;
|
case GlobalValue::ExternalWeakLinkage: return 7;
|
||||||
case GlobalValue::CommonLinkage: return 8;
|
case GlobalValue::CommonLinkage: return 8;
|
||||||
case GlobalValue::PrivateLinkage: return 9;
|
case GlobalValue::PrivateLinkage: return 9;
|
||||||
case GlobalValue::WeakODRLinkage: return 10;
|
case GlobalValue::WeakODRLinkage: return 10;
|
||||||
case GlobalValue::LinkOnceODRLinkage: return 11;
|
case GlobalValue::LinkOnceODRLinkage: return 11;
|
||||||
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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -200,11 +200,17 @@ void AsmPrinter::EmitLinkage(unsigned Linkage, MCSymbol *GVSym) const {
|
||||||
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);
|
||||||
// .weak_definition _foo
|
|
||||||
OutStreamer.EmitSymbolAttribute(GVSym, MCSA_WeakDefinition);
|
if ((GlobalValue::LinkageTypes)Linkage !=
|
||||||
|
GlobalValue::LinkerPrivateWeakDefAutoLinkage)
|
||||||
|
// .weak_definition _foo
|
||||||
|
OutStreamer.EmitSymbolAttribute(GVSym, MCSA_WeakDefinition);
|
||||||
|
else
|
||||||
|
OutStreamer.EmitSymbolAttribute(GVSym, MCSA_WeakDefAutoPrivate);
|
||||||
} else if (MAI->getLinkOnceDirective() != 0) {
|
} else if (MAI->getLinkOnceDirective() != 0) {
|
||||||
// .globl _foo
|
// .globl _foo
|
||||||
OutStreamer.EmitSymbolAttribute(GVSym, MCSA_Global);
|
OutStreamer.EmitSymbolAttribute(GVSym, MCSA_Global);
|
||||||
|
|
|
@ -288,6 +288,8 @@ 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:
|
||||||
|
|
|
@ -180,7 +180,8 @@ 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.
|
||||||
|
|
|
@ -1435,6 +1435,9 @@ 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;
|
||||||
|
|
|
@ -1069,6 +1069,8 @@ 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:
|
||||||
|
@ -1122,6 +1124,9 @@ 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;
|
||||||
|
|
|
@ -446,6 +446,10 @@ void Verifier::visitGlobalValue(GlobalValue &GV) {
|
||||||
Assert1(GVar && GVar->getType()->getElementType()->isArrayTy(),
|
Assert1(GVar && GVar->getType()->getElementType()->isArrayTy(),
|
||||||
"Only global arrays can have appending linkage!", GVar);
|
"Only global arrays can have appending linkage!", GVar);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Assert1(!GV.hasLinkerPrivateWeakDefAutoLinkage() || GV.hasDefaultVisibility(),
|
||||||
|
"linker_private_weak_def_auto can only have default visibility!",
|
||||||
|
&GV);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Verifier::visitGlobalVariable(GlobalVariable &GV) {
|
void Verifier::visitGlobalVariable(GlobalVariable &GV) {
|
||||||
|
|
|
@ -4,3 +4,4 @@
|
||||||
|
|
||||||
@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
|
||||||
|
|
Loading…
Reference in New Issue