From 11e9657eeb76dff6baaab1cbac0b1fb7e1abb439 Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Mon, 3 Aug 2009 21:53:27 +0000 Subject: [PATCH] Eliminate textual section switching from the x86 backend, one more step towards "semantics sections" git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@78002 91177308-0d34-0410-b5e6-96231b3b80d8 --- .../llvm/Target/TargetLoweringObjectFile.h | 11 ++++++- lib/Target/TargetLoweringObjectFile.cpp | 13 ++++++++ .../X86/AsmPrinter/X86ATTAsmPrinter.cpp | 32 ++++++++++++------- 3 files changed, 43 insertions(+), 13 deletions(-) diff --git a/include/llvm/Target/TargetLoweringObjectFile.h b/include/llvm/Target/TargetLoweringObjectFile.h index c81cdc46387..76cf2aeec1a 100644 --- a/include/llvm/Target/TargetLoweringObjectFile.h +++ b/include/llvm/Target/TargetLoweringObjectFile.h @@ -26,7 +26,6 @@ namespace llvm { class Mangler; class TargetMachine; - class TargetLoweringObjectFile { MCContext *Ctx; protected: @@ -250,6 +249,11 @@ public: /// FIXME: REMOVE this (rdar://7071300) virtual bool shouldEmitUsedDirectiveFor(const GlobalValue *GV, Mangler *) const; + + /// getMachOSection - Return the MCSection for the specified mach-o section. + /// FIXME: Switch this to a semantic view eventually. + const MCSection *getMachOSection(const char *Name, bool isDirective, + SectionKind K); }; @@ -264,6 +268,11 @@ public: virtual const MCSection * SelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind, Mangler *Mang, const TargetMachine &TM) const; + + /// getCOFFSection - Return the MCSection for the specified COFF section. + /// FIXME: Switch this to a semantic view eventually. + const MCSection *getCOFFSection(const char *Name, bool isDirective, + SectionKind K); }; } // end namespace llvm diff --git a/lib/Target/TargetLoweringObjectFile.cpp b/lib/Target/TargetLoweringObjectFile.cpp index cb950af82cd..ab4e24fea64 100644 --- a/lib/Target/TargetLoweringObjectFile.cpp +++ b/lib/Target/TargetLoweringObjectFile.cpp @@ -532,6 +532,14 @@ getSectionForConstant(SectionKind Kind) const { // MachO //===----------------------------------------------------------------------===// +const MCSection *TargetLoweringObjectFileMachO:: +getMachOSection(const char *Name, bool isDirective, SectionKind K) { + // FOR NOW, Just forward. + return getOrCreateSection(Name, isDirective, K); +} + + + void TargetLoweringObjectFileMachO::Initialize(MCContext &Ctx, const TargetMachine &TM) { TargetLoweringObjectFile::Initialize(Ctx, TM); @@ -733,6 +741,11 @@ shouldEmitUsedDirectiveFor(const GlobalValue *GV, Mangler *Mang) const { // COFF //===----------------------------------------------------------------------===// +const MCSection *TargetLoweringObjectFileCOFF:: +getCOFFSection(const char *Name, bool isDirective, SectionKind K) { + return getOrCreateSection(Name, isDirective, K); +} + void TargetLoweringObjectFileCOFF::Initialize(MCContext &Ctx, const TargetMachine &TM) { TargetLoweringObjectFile::Initialize(Ctx, TM); diff --git a/lib/Target/X86/AsmPrinter/X86ATTAsmPrinter.cpp b/lib/Target/X86/AsmPrinter/X86ATTAsmPrinter.cpp index 577d312ccad..0be7f351d7b 100644 --- a/lib/Target/X86/AsmPrinter/X86ATTAsmPrinter.cpp +++ b/lib/Target/X86/AsmPrinter/X86ATTAsmPrinter.cpp @@ -899,8 +899,9 @@ bool X86ATTAsmPrinter::doFinalization(Module &M) { } if (Subtarget->isTargetDarwin()) { - //TargetLoweringObjectFileMachO &TLOFMacho = - // static_cast(getObjFileLowering()); + // All darwin targets use mach-o. + TargetLoweringObjectFileMachO &TLOFMacho = + static_cast(getObjFileLowering()); // Add the (possibly multiple) personalities to the set of global value // stubs. Only referenced functions get into the Personalities list. @@ -916,8 +917,11 @@ bool X86ATTAsmPrinter::doFinalization(Module &M) { // Output stubs for dynamically-linked functions if (!FnStubs.empty()) { - SwitchToDataSection("\t.section __IMPORT,__jump_table,symbol_stubs," - "self_modifying_code+pure_instructions,5", 0); + const MCSection *TheSection = + TLOFMacho.getMachOSection("\t.section __IMPORT,__jump_table,symbol_stubs," + "self_modifying_code+pure_instructions,5", true, + SectionKind::getMetadata()); + SwitchToSection(TheSection); for (StringMap::iterator I = FnStubs.begin(), E = FnStubs.end(); I != E; ++I) O << I->getKeyData() << ":\n" << "\t.indirect_symbol " << I->second @@ -927,8 +931,11 @@ bool X86ATTAsmPrinter::doFinalization(Module &M) { // Output stubs for external and common global variables. if (!GVStubs.empty()) { - SwitchToDataSection( - "\t.section __IMPORT,__pointers,non_lazy_symbol_pointers"); + const MCSection *TheSection = + TLOFMacho.getMachOSection("\t.section __IMPORT,__pointers," + "non_lazy_symbol_pointers", true, + SectionKind::getMetadata()); + SwitchToSection(TheSection); for (StringMap::iterator I = GVStubs.begin(), E = GVStubs.end(); I != E; ++I) O << I->getKeyData() << ":\n\t.indirect_symbol " @@ -963,16 +970,17 @@ bool X86ATTAsmPrinter::doFinalization(Module &M) { // Output linker support code for dllexported globals on windows. - if (!DLLExportedGVs.empty()) { - SwitchToDataSection(".section .drectve"); + if (!DLLExportedGVs.empty() || !DLLExportedFns.empty()) { + // dllexport symbols only exist on coff targets. + TargetLoweringObjectFileCOFF &TLOFMacho = + static_cast(getObjFileLowering()); + + SwitchToSection(TLOFMacho.getCOFFSection(".section .drectve", true, + SectionKind::getMetadata())); for (StringSet<>::iterator i = DLLExportedGVs.begin(), e = DLLExportedGVs.end(); i != e; ++i) O << "\t.ascii \" -export:" << i->getKeyData() << ",data\"\n"; - } - - if (!DLLExportedFns.empty()) { - SwitchToDataSection(".section .drectve"); for (StringSet<>::iterator i = DLLExportedFns.begin(), e = DLLExportedFns.end(); -- 2.34.1