mirror of
https://github.com/RPCS3/llvm.git
synced 2024-12-04 09:54:09 +00:00
use EmitLinkage for functions as well as globals. One output
change is that we now use ".linkonce discard" for global variables instead of ".linkonce samesize". These should be the same, just less strict. If anyone is interested in mcizing MCSection for COFF targets, this should be easy to fix. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@94623 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
a3e8883d71
commit
111a3193b5
@ -169,7 +169,9 @@ void AsmPrinter::EmitLinkage(unsigned Linkage, MCSymbol *GVSym) {
|
|||||||
// FIXME: linkonce should be a section attribute, handled by COFF Section
|
// FIXME: linkonce should be a section attribute, handled by COFF Section
|
||||||
// assignment.
|
// assignment.
|
||||||
// http://sourceware.org/binutils/docs-2.20/as/Linkonce.html#Linkonce
|
// http://sourceware.org/binutils/docs-2.20/as/Linkonce.html#Linkonce
|
||||||
// .linkonce same_size
|
// .linkonce discard
|
||||||
|
// FIXME: It would be nice to use .linkonce samesize for non-common
|
||||||
|
// globals.
|
||||||
O << LinkOnce;
|
O << LinkOnce;
|
||||||
} else {
|
} else {
|
||||||
// .weak _foo
|
// .weak _foo
|
||||||
@ -300,38 +302,9 @@ void AsmPrinter::EmitFunctionHeader() {
|
|||||||
OutStreamer.SwitchSection(getObjFileLowering().SectionForGlobal(F, Mang, TM));
|
OutStreamer.SwitchSection(getObjFileLowering().SectionForGlobal(F, Mang, TM));
|
||||||
printVisibility(CurrentFnSym, F->getVisibility());
|
printVisibility(CurrentFnSym, F->getVisibility());
|
||||||
|
|
||||||
switch (F->getLinkage()) {
|
EmitLinkage(F->getLinkage(), CurrentFnSym);
|
||||||
default: llvm_unreachable("Unknown linkage type!");
|
|
||||||
case Function::InternalLinkage: // Symbols default to internal.
|
|
||||||
case Function::PrivateLinkage:
|
|
||||||
break;
|
|
||||||
case Function::DLLExportLinkage:
|
|
||||||
case Function::ExternalLinkage:
|
|
||||||
OutStreamer.EmitSymbolAttribute(CurrentFnSym, MCSA_Global);
|
|
||||||
break;
|
|
||||||
case Function::LinkerPrivateLinkage:
|
|
||||||
case Function::LinkOnceAnyLinkage:
|
|
||||||
case Function::LinkOnceODRLinkage:
|
|
||||||
case Function::WeakAnyLinkage:
|
|
||||||
case Function::WeakODRLinkage:
|
|
||||||
if (MAI->getWeakDefDirective() != 0) {
|
|
||||||
OutStreamer.EmitSymbolAttribute(CurrentFnSym, MCSA_Global);
|
|
||||||
O << MAI->getWeakDefDirective() << *CurrentFnSym << '\n';
|
|
||||||
} else if (MAI->getLinkOnceDirective() != 0) {
|
|
||||||
OutStreamer.EmitSymbolAttribute(CurrentFnSym, MCSA_Global);
|
|
||||||
// FIXME: linkonce should be a section attribute, handled by COFF Section
|
|
||||||
// assignment.
|
|
||||||
// http://sourceware.org/binutils/docs-2.20/as/Linkonce.html#Linkonce
|
|
||||||
O << "\t.linkonce discard\n";
|
|
||||||
} else {
|
|
||||||
O << "\t.weak\t" << *CurrentFnSym << '\n';
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
EmitAlignment(MF->getAlignment(), F);
|
EmitAlignment(MF->getAlignment(), F);
|
||||||
|
|
||||||
|
|
||||||
if (MAI->hasDotTypeDotSizeDirective())
|
if (MAI->hasDotTypeDotSizeDirective())
|
||||||
OutStreamer.EmitSymbolAttribute(CurrentFnSym, MCSA_ELF_TypeFunction);
|
OutStreamer.EmitSymbolAttribute(CurrentFnSym, MCSA_ELF_TypeFunction);
|
||||||
|
|
||||||
|
@ -24,7 +24,7 @@ MCAsmInfoCOFF::MCAsmInfoCOFF() {
|
|||||||
HasSingleParameterDotFile = false;
|
HasSingleParameterDotFile = false;
|
||||||
PrivateGlobalPrefix = "L"; // Prefix for private global symbols
|
PrivateGlobalPrefix = "L"; // Prefix for private global symbols
|
||||||
WeakRefDirective = "\t.weak\t";
|
WeakRefDirective = "\t.weak\t";
|
||||||
LinkOnceDirective = "\t.linkonce same_size\n";
|
LinkOnceDirective = "\t.linkonce discard\n";
|
||||||
|
|
||||||
// Doesn't support visibility:
|
// Doesn't support visibility:
|
||||||
HiddenVisibilityAttr = ProtectedVisibilityAttr = MCSA_Invalid;
|
HiddenVisibilityAttr = ProtectedVisibilityAttr = MCSA_Invalid;
|
||||||
|
Loading…
Reference in New Issue
Block a user