summaryrefslogtreecommitdiff
path: root/lib/Target/X86/X86ATTAsmPrinter.cpp
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2006-10-05 02:43:52 +0000
committerChris Lattner <sabre@nondot.org>2006-10-05 02:43:52 +0000
commitafbfdeddffc673f367d63319c95bcd7e1a58c16c (patch)
tree2f574c607df92df16bb241408f4748ba1d6e42fa /lib/Target/X86/X86ATTAsmPrinter.cpp
parent52f0670470020d7672f9b0669c07324814e84a07 (diff)
downloadllvm-afbfdeddffc673f367d63319c95bcd7e1a58c16c.tar.gz
llvm-afbfdeddffc673f367d63319c95bcd7e1a58c16c.tar.bz2
llvm-afbfdeddffc673f367d63319c95bcd7e1a58c16c.tar.xz
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-xlib/Target/X86/X86ATTAsmPrinter.cpp34
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;