diff options
author | Chris Lattner <sabre@nondot.org> | 2006-10-05 02:43:52 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2006-10-05 02:43:52 +0000 |
commit | afbfdeddffc673f367d63319c95bcd7e1a58c16c (patch) | |
tree | 2f574c607df92df16bb241408f4748ba1d6e42fa /lib/Target/X86/X86ATTAsmPrinter.cpp | |
parent | 52f0670470020d7672f9b0669c07324814e84a07 (diff) |
Implement getSectionForFunction, use it when printing function body.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@30737 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Target/X86/X86ATTAsmPrinter.cpp')
-rwxr-xr-x | lib/Target/X86/X86ATTAsmPrinter.cpp | 34 |
1 files changed, 24 insertions, 10 deletions
diff --git a/lib/Target/X86/X86ATTAsmPrinter.cpp b/lib/Target/X86/X86ATTAsmPrinter.cpp index 6f34ca5c13..85ba0f40e6 100755 --- a/lib/Target/X86/X86ATTAsmPrinter.cpp +++ b/lib/Target/X86/X86ATTAsmPrinter.cpp @@ -26,6 +26,28 @@ #include <iostream> using namespace llvm; +/// getSectionForFunction - Return the section that we should emit the +/// specified function body into. +std::string X86ATTAsmPrinter::getSectionForFunction(const Function &F) const { + switch (F.getLinkage()) { + default: assert(0 && "Unknown linkage type!"); + case Function::InternalLinkage: + case Function::DLLExportLinkage: + case Function::ExternalLinkage: + return TAI->getTextSection(); + case Function::WeakLinkage: + case Function::LinkOnceLinkage: + 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"; + } else { + return "\t.section\t.llvm.linkonce.t." + CurrentFnName + + ",\"ax\",@progbits\n"; + } + } +} + /// runOnMachineFunction - This uses the printMachineInstruction() /// method to print assembly for each instruction. /// @@ -53,38 +75,30 @@ bool X86ATTAsmPrinter::runOnMachineFunction(MachineFunction &MF) { X86SharedAsmPrinter::decorateName(CurrentFnName, F); + SwitchToTextSection(getSectionForFunction(*F).c_str(), F); + switch (F->getLinkage()) { default: assert(0 && "Unknown linkage type!"); case Function::InternalLinkage: // Symbols default to internal. - SwitchToTextSection(TAI->getTextSection(), F); EmitAlignment(4, F); // FIXME: This should be parameterized somewhere. break; case Function::DLLExportLinkage: DLLExportedFns.insert(Mang->makeNameProper(F->getName(), "")); //FALLS THROUGH case Function::ExternalLinkage: - SwitchToTextSection(TAI->getTextSection(), F); EmitAlignment(4, F); // FIXME: This should be parameterized somewhere. O << "\t.globl\t" << CurrentFnName << "\n"; break; case Function::WeakLinkage: case Function::LinkOnceLinkage: if (Subtarget->isTargetDarwin()) { - SwitchToTextSection( - ".section __TEXT,__textcoal_nt,coalesced,pure_instructions", F); 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.section\t.llvm.linkonce.t." << CurrentFnName - << ",\"ax\"\n"; - SwitchToTextSection("", F); O << "\t.weak " << CurrentFnName << "\n"; } else { EmitAlignment(4, F); // FIXME: This should be parameterized somewhere. - O << "\t.section\t.llvm.linkonce.t." << CurrentFnName - << ",\"ax\",@progbits\n"; - SwitchToTextSection("", F); O << "\t.weak " << CurrentFnName << "\n"; } break; |