aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2006-10-05 00:35:50 +0000
committerChris Lattner <sabre@nondot.org>2006-10-05 00:35:50 +0000
commitb56dcc453e1bd3fc75e4393b3b1bd1b07d86903e (patch)
treeb81333dfa02adb087b5de7cdb03eda74b355292c
parentf5b10ec509d7e27df12372e53adeda59051dfc30 (diff)
implement DarwinTargetAsmInfo::getSectionForFunction, use it when outputting
function bodies git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@30733 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--lib/Target/PowerPC/PPCAsmPrinter.cpp6
-rw-r--r--lib/Target/PowerPC/PPCTargetAsmInfo.cpp14
-rw-r--r--lib/Target/PowerPC/PPCTargetAsmInfo.h7
3 files changed, 21 insertions, 6 deletions
diff --git a/lib/Target/PowerPC/PPCAsmPrinter.cpp b/lib/Target/PowerPC/PPCAsmPrinter.cpp
index 4868b68435..252109a421 100644
--- a/lib/Target/PowerPC/PPCAsmPrinter.cpp
+++ b/lib/Target/PowerPC/PPCAsmPrinter.cpp
@@ -422,19 +422,17 @@ bool DarwinAsmPrinter::runOnMachineFunction(MachineFunction &MF) {
// Print out labels for the function.
const Function *F = MF.getFunction();
+ SwitchToTextSection(TAI->getSectionForFunction(*F), F);
+
switch (F->getLinkage()) {
default: assert(0 && "Unknown linkage type!");
case Function::InternalLinkage: // Symbols default to internal.
- SwitchToTextSection("\t.text", F);
break;
case Function::ExternalLinkage:
- SwitchToTextSection("\t.text", F);
O << "\t.globl\t" << CurrentFnName << "\n";
break;
case Function::WeakLinkage:
case Function::LinkOnceLinkage:
- SwitchToTextSection(
- ".section __TEXT,__textcoal_nt,coalesced,pure_instructions", F);
O << "\t.globl\t" << CurrentFnName << "\n";
O << "\t.weak_definition\t" << CurrentFnName << "\n";
break;
diff --git a/lib/Target/PowerPC/PPCTargetAsmInfo.cpp b/lib/Target/PowerPC/PPCTargetAsmInfo.cpp
index 03e9a01dd3..f767a4428d 100644
--- a/lib/Target/PowerPC/PPCTargetAsmInfo.cpp
+++ b/lib/Target/PowerPC/PPCTargetAsmInfo.cpp
@@ -13,7 +13,7 @@
#include "PPCTargetAsmInfo.h"
#include "PPCTargetMachine.h"
-
+#include "llvm/Function.h"
using namespace llvm;
DarwinTargetAsmInfo::DarwinTargetAsmInfo(const PPCTargetMachine &TM) {
@@ -50,3 +50,15 @@ DarwinTargetAsmInfo::DarwinTargetAsmInfo(const PPCTargetMachine &TM) {
DwarfRangesSection = ".section __DWARF,__debug_ranges";
DwarfMacInfoSection = ".section __DWARF,__debug_macinfo";
}
+
+
+const char *DarwinTargetAsmInfo::getSectionForFunction(const Function &F) const{
+ switch (F.getLinkage()) {
+ default: assert(0 && "Unknown linkage type!");
+ case Function::ExternalLinkage:
+ case Function::InternalLinkage: return TextSection;
+ case Function::WeakLinkage:
+ case Function::LinkOnceLinkage:
+ return ".section __TEXT,__textcoal_nt,coalesced,pure_instructions";
+ }
+}
diff --git a/lib/Target/PowerPC/PPCTargetAsmInfo.h b/lib/Target/PowerPC/PPCTargetAsmInfo.h
index d3c790c5fc..6188862e9f 100644
--- a/lib/Target/PowerPC/PPCTargetAsmInfo.h
+++ b/lib/Target/PowerPC/PPCTargetAsmInfo.h
@@ -23,9 +23,14 @@ namespace llvm {
struct DarwinTargetAsmInfo : public TargetAsmInfo {
DarwinTargetAsmInfo(const PPCTargetMachine &TM);
+
+ /// getSectionForFunction - Return the section that we should emit the
+ /// specified function body into. This defaults to 'TextSection'. This
+ /// should most likely be overridden by the target to put linkonce/weak
+ /// functions into special sections.
+ virtual const char *getSectionForFunction(const Function &F) const;
};
-
} // namespace llvm
#endif