diff --git a/llvm/include/llvm/CodeGen/AsmPrinter.h b/llvm/include/llvm/CodeGen/AsmPrinter.h index 6ccef8ca59b9..45ea5d897740 100644 --- a/llvm/include/llvm/CodeGen/AsmPrinter.h +++ b/llvm/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/llvm/include/llvm/Target/TargetAsmInfo.h b/llvm/include/llvm/Target/TargetAsmInfo.h index 589c9a6efc9b..8305e54f9e8d 100644 --- a/llvm/include/llvm/Target/TargetAsmInfo.h +++ b/llvm/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/llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp b/llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp index de856c165af4..6e9d935e0c00 100644 --- a/llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp +++ b/llvm/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);