summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAnton Korobeynikov <asl@math.spbu.ru>2008-09-24 22:12:10 +0000
committerAnton Korobeynikov <asl@math.spbu.ru>2008-09-24 22:12:10 +0000
commit7d002fa77b3d6eab83a59710b58bb2d30e4fec6b (patch)
treed012c8b746c20e9e70bb965ebeebabf670985d57
parent8ac1127ed6cda9f0df13eef03dcb97eafc2fb8d5 (diff)
downloadbcm5719-llvm-7d002fa77b3d6eab83a59710b58bb2d30e4fec6b.tar.gz
bcm5719-llvm-7d002fa77b3d6eab83a59710b58bb2d30e4fec6b.zip
Provide direct function to switch to Section
llvm-svn: 56571
-rw-r--r--llvm/include/llvm/CodeGen/AsmPrinter.h7
-rw-r--r--llvm/include/llvm/Target/TargetAsmInfo.h1
-rw-r--r--llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp20
3 files changed, 27 insertions, 1 deletions
diff --git a/llvm/include/llvm/CodeGen/AsmPrinter.h b/llvm/include/llvm/CodeGen/AsmPrinter.h
index 6ccef8ca59b..45ea5d89774 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 589c9a6efc9..8305e54f9e8 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 de856c165af..6e9d935e0c0 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);
OpenPOWER on IntegriCloud