mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-15 20:29:48 +00:00
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
This commit is contained in:
parent
a6fc5016ee
commit
b1c8802407
@ -40,7 +40,7 @@ std::string X86ATTAsmPrinter::getSectionForFunction(const Function &F) const {
|
|||||||
if (Subtarget->isTargetDarwin()) {
|
if (Subtarget->isTargetDarwin()) {
|
||||||
return ".section __TEXT,__textcoal_nt,coalesced,pure_instructions";
|
return ".section __TEXT,__textcoal_nt,coalesced,pure_instructions";
|
||||||
} else if (Subtarget->isTargetCygwin()) {
|
} else if (Subtarget->isTargetCygwin()) {
|
||||||
return "\t.section\t.llvm.linkonce.t." + CurrentFnName + ",\"ax\"\n";
|
return "\t.section\t.text$linkonce." + CurrentFnName + ",\"ax\"\n";
|
||||||
} else {
|
} else {
|
||||||
return "\t.section\t.llvm.linkonce.t." + CurrentFnName +
|
return "\t.section\t.llvm.linkonce.t." + CurrentFnName +
|
||||||
",\"ax\",@progbits\n";
|
",\"ax\",@progbits\n";
|
||||||
@ -90,6 +90,7 @@ bool X86ATTAsmPrinter::runOnMachineFunction(MachineFunction &MF) {
|
|||||||
O << "\t.globl\t" << CurrentFnName << "\n";
|
O << "\t.globl\t" << CurrentFnName << "\n";
|
||||||
break;
|
break;
|
||||||
case Function::LinkOnceLinkage:
|
case Function::LinkOnceLinkage:
|
||||||
|
case Function::WeakLinkage:
|
||||||
if (Subtarget->isTargetDarwin()) {
|
if (Subtarget->isTargetDarwin()) {
|
||||||
O << "\t.globl\t" << CurrentFnName << "\n";
|
O << "\t.globl\t" << CurrentFnName << "\n";
|
||||||
O << "\t.weak_definition\t" << CurrentFnName << "\n";
|
O << "\t.weak_definition\t" << CurrentFnName << "\n";
|
||||||
@ -102,20 +103,13 @@ bool X86ATTAsmPrinter::runOnMachineFunction(MachineFunction &MF) {
|
|||||||
O << "\t.weak " << CurrentFnName << "\n";
|
O << "\t.weak " << CurrentFnName << "\n";
|
||||||
}
|
}
|
||||||
break;
|
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";
|
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()) {
|
if (Subtarget->isTargetDarwin()) {
|
||||||
// Emit pre-function debug information.
|
// Emit pre-function debug information.
|
||||||
|
@ -174,27 +174,15 @@ bool X86SharedAsmPrinter::doFinalization(Module &M) {
|
|||||||
} else {
|
} else {
|
||||||
switch (I->getLinkage()) {
|
switch (I->getLinkage()) {
|
||||||
case GlobalValue::LinkOnceLinkage:
|
case GlobalValue::LinkOnceLinkage:
|
||||||
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.globl " << name << "\n"
|
|
||||||
<< "\t.linkonce same_size\n";
|
|
||||||
} else {
|
|
||||||
O << "\t.section\t.llvm.linkonce.d." << name << ",\"aw\",@progbits\n"
|
|
||||||
<< "\t.weak " << name << "\n";
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case GlobalValue::WeakLinkage:
|
case GlobalValue::WeakLinkage:
|
||||||
if (Subtarget->isTargetDarwin()) {
|
if (Subtarget->isTargetDarwin()) {
|
||||||
O << "\t.globl " << name << "\n"
|
O << "\t.globl " << name << "\n"
|
||||||
<< "\t.weak_definition " << name << "\n";
|
<< "\t.weak_definition " << name << "\n";
|
||||||
SwitchToDataSection(".section __DATA,__const_coal,coalesced", I);
|
SwitchToDataSection(".section __DATA,__const_coal,coalesced", I);
|
||||||
} else if (Subtarget->isTargetCygwin()) {
|
} else if (Subtarget->isTargetCygwin()) {
|
||||||
O << "\t.section\t.llvm.linkonce.d." << name << ",\"aw\"\n"
|
O << "\t.section\t.data$linkonce." << name << ",\"aw\"\n"
|
||||||
<< "\t.weak " << name << "\n";
|
<< "\t.globl " << name << "\n"
|
||||||
|
<< "\t.linkonce same_size\n";
|
||||||
} else {
|
} else {
|
||||||
O << "\t.section\t.llvm.linkonce.d." << name << ",\"aw\",@progbits\n"
|
O << "\t.section\t.llvm.linkonce.d." << name << ",\"aw\",@progbits\n"
|
||||||
<< "\t.weak " << name << "\n";
|
<< "\t.weak " << name << "\n";
|
||||||
|
Loading…
Reference in New Issue
Block a user