From b5a32e2e8ce2f3de3a340c5a2dfcd3a159968466 Mon Sep 17 00:00:00 2001 From: Anton Korobeynikov Date: Wed, 24 Sep 2008 22:12:10 +0000 Subject: [PATCH] Provide direct function to switch to Section git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@56571 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/CodeGen/AsmPrinter.h | 7 ++++++- include/llvm/Target/TargetAsmInfo.h | 1 + lib/CodeGen/AsmPrinter/AsmPrinter.cpp | 20 ++++++++++++++++++++ 3 files changed, 27 insertions(+), 1 deletion(-) diff --git a/include/llvm/CodeGen/AsmPrinter.h b/include/llvm/CodeGen/AsmPrinter.h index 6ccef8ca59b..45ea5d89774 100644 --- a/include/llvm/CodeGen/AsmPrinter.h +++ b/include/llvm/CodeGen/AsmPrinter.h @@ -32,6 +32,7 @@ namespace llvm { class MachineConstantPoolValue; class MachineModuleInfo; class Mangler; + class Section; class TargetAsmInfo; class Type; class raw_ostream; @@ -127,7 +128,11 @@ namespace llvm { /// are the same. /// void SwitchToDataSection(const char *NewSection, const GlobalValue *GV = NULL); - + + /// SwitchToSection - Switch to the specified section of the executable if + /// we are not already in it! + void SwitchToSection(const Section* NS); + /// getGlobalLinkName - Returns the asm/link name of of the specified /// global variable. Should be overridden by each target asm printer to /// generate the appropriate value. diff --git a/include/llvm/Target/TargetAsmInfo.h b/include/llvm/Target/TargetAsmInfo.h index 589c9a6efc9..8305e54f9e8 100644 --- a/include/llvm/Target/TargetAsmInfo.h +++ b/include/llvm/Target/TargetAsmInfo.h @@ -114,6 +114,7 @@ namespace llvm { bool isNamed() const { return Flags & SectionFlags::Named; } unsigned getEntitySize() const { return (Flags >> 24) & 0xFF; } const std::string& getName() const { return Name; } + unsigned getFlags() const { return Flags; } }; /// TargetAsmInfo - This class is intended to be used as a base class for asm diff --git a/lib/CodeGen/AsmPrinter/AsmPrinter.cpp b/lib/CodeGen/AsmPrinter/AsmPrinter.cpp index de856c165af..6e9d935e0c0 100644 --- a/lib/CodeGen/AsmPrinter/AsmPrinter.cpp +++ b/lib/CodeGen/AsmPrinter/AsmPrinter.cpp @@ -105,6 +105,26 @@ void AsmPrinter::SwitchToDataSection(const char *NewSection, IsInTextSection = false; } +/// SwitchToSection - Switch to the specified section of the executable if we +/// are not already in it! +void AsmPrinter::SwitchToSection(const Section* NS) { + const std::string& NewSection = NS->getName(); + + // If we're already in this section, we're done. + if (CurrentSection == NewSection) return; + + // Close the current section, if applicable. + if (TAI->getSectionEndDirectiveSuffix() && !CurrentSection.empty()) + O << CurrentSection << TAI->getSectionEndDirectiveSuffix() << '\n'; + + // FIXME: Make CurrentSection a Section* in the future + CurrentSection = NewSection; + + if (!CurrentSection.empty()) + O << CurrentSection << TAI->getDataSectionStartSuffix() << '\n'; + + IsInTextSection = (NS->getFlags() & SectionFlags::Code); +} void AsmPrinter::getAnalysisUsage(AnalysisUsage &AU) const { MachineFunctionPass::getAnalysisUsage(AU);