aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAnton Korobeynikov <asl@math.spbu.ru>2006-10-18 09:12:29 +0000
committerAnton Korobeynikov <asl@math.spbu.ru>2006-10-18 09:12:29 +0000
commitb1c8802407ccbf2f2bd81abe9de26f61c9c195a4 (patch)
treeb67d9a449fc3288a4d192a13ede50cd96ba07a62
parenta6fc5016ee8e88febd940b7aba1f231f8a5d2a34 (diff)
Fixed mingw\cygwin linkonce linkage once again.
Added workaround for linker bug with linkonce sections. Changed sections prefix to allow linker merge them (PE loader doesn't like too much long-named sections :) ) All of this unbreaks libstdc++ on mingw32 allowing (small) programs to be compiled, linked and run. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@31033 91177308-0d34-0410-b5e6-96231b3b80d8
-rwxr-xr-xlib/Target/X86/X86ATTAsmPrinter.cpp20
-rw-r--r--lib/Target/X86/X86AsmPrinter.cpp16
2 files changed, 9 insertions, 27 deletions
diff --git a/lib/Target/X86/X86ATTAsmPrinter.cpp b/lib/Target/X86/X86ATTAsmPrinter.cpp
index bb6bb3dbc1..dc2ecca7cb 100755
--- a/lib/Target/X86/X86ATTAsmPrinter.cpp
+++ b/lib/Target/X86/X86ATTAsmPrinter.cpp
@@ -40,7 +40,7 @@ std::string X86ATTAsmPrinter::getSectionForFunction(const Function &F) const {
if (Subtarget->isTargetDarwin()) {
return ".section __TEXT,__textcoal_nt,coalesced,pure_instructions";
} else if (Subtarget->isTargetCygwin()) {
- return "\t.section\t.llvm.linkonce.t." + CurrentFnName + ",\"ax\"\n";
+ return "\t.section\t.text$linkonce." + CurrentFnName + ",\"ax\"\n";
} else {
return "\t.section\t.llvm.linkonce.t." + CurrentFnName +
",\"ax\",@progbits\n";
@@ -90,6 +90,7 @@ bool X86ATTAsmPrinter::runOnMachineFunction(MachineFunction &MF) {
O << "\t.globl\t" << CurrentFnName << "\n";
break;
case Function::LinkOnceLinkage:
+ case Function::WeakLinkage:
if (Subtarget->isTargetDarwin()) {
O << "\t.globl\t" << CurrentFnName << "\n";
O << "\t.weak_definition\t" << CurrentFnName << "\n";
@@ -102,20 +103,13 @@ bool X86ATTAsmPrinter::runOnMachineFunction(MachineFunction &MF) {
O << "\t.weak " << CurrentFnName << "\n";
}
break;
- case Function::WeakLinkage:
- if (Subtarget->isTargetDarwin()) {
- O << "\t.globl\t" << CurrentFnName << "\n";
- O << "\t.weak_definition\t" << CurrentFnName << "\n";
- } else if (Subtarget->isTargetCygwin()) {
- EmitAlignment(4, F); // FIXME: This should be parameterized somewhere.
- O << "\t.weak " << CurrentFnName << "\n";
- } else {
- EmitAlignment(4, F); // FIXME: This should be parameterized somewhere.
- O << "\t.weak " << CurrentFnName << "\n";
- }
- break;
}
O << CurrentFnName << ":\n";
+ // Add some workaround for linkonce linkage on Cygwin\MinGW
+ if (Subtarget->isTargetCygwin() &&
+ (F->getLinkage() == Function::LinkOnceLinkage ||
+ F->getLinkage() == Function::WeakLinkage))
+ O << "_llvm$workaround$fake$stub_" << CurrentFnName << ":\n";
if (Subtarget->isTargetDarwin()) {
// Emit pre-function debug information.
diff --git a/lib/Target/X86/X86AsmPrinter.cpp b/lib/Target/X86/X86AsmPrinter.cpp
index 2a3a2aaed4..bab80dbd44 100644
--- a/lib/Target/X86/X86AsmPrinter.cpp
+++ b/lib/Target/X86/X86AsmPrinter.cpp
@@ -174,12 +174,13 @@ bool X86SharedAsmPrinter::doFinalization(Module &M) {
} else {
switch (I->getLinkage()) {
case GlobalValue::LinkOnceLinkage:
+ case GlobalValue::WeakLinkage:
if (Subtarget->isTargetDarwin()) {
O << "\t.globl " << name << "\n"
<< "\t.weak_definition " << name << "\n";
SwitchToDataSection(".section __DATA,__const_coal,coalesced", I);
} else if (Subtarget->isTargetCygwin()) {
- O << "\t.section\t.llvm.linkonce.d." << name << ",\"aw\"\n"
+ O << "\t.section\t.data$linkonce." << name << ",\"aw\"\n"
<< "\t.globl " << name << "\n"
<< "\t.linkonce same_size\n";
} else {
@@ -187,19 +188,6 @@ bool X86SharedAsmPrinter::doFinalization(Module &M) {
<< "\t.weak " << name << "\n";
}
break;
- case GlobalValue::WeakLinkage:
- if (Subtarget->isTargetDarwin()) {
- O << "\t.globl " << name << "\n"
- << "\t.weak_definition " << name << "\n";
- SwitchToDataSection(".section __DATA,__const_coal,coalesced", I);
- } else if (Subtarget->isTargetCygwin()) {
- O << "\t.section\t.llvm.linkonce.d." << name << ",\"aw\"\n"
- << "\t.weak " << name << "\n";
- } else {
- O << "\t.section\t.llvm.linkonce.d." << name << ",\"aw\",@progbits\n"
- << "\t.weak " << name << "\n";
- }
- break;
case GlobalValue::AppendingLinkage:
// FIXME: appending linkage variables should go into a section of
// their name or something. For now, just emit them as external.