aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/llvm/CodeGen/AsmPrinter.h6
-rw-r--r--include/llvm/MC/MCStreamer.h10
-rw-r--r--lib/CodeGen/AsmPrinter/AsmPrinter.cpp25
-rw-r--r--lib/MC/MCAsmStreamer.cpp4
-rw-r--r--lib/MC/MCStreamer.cpp2
5 files changed, 22 insertions, 25 deletions
diff --git a/include/llvm/CodeGen/AsmPrinter.h b/include/llvm/CodeGen/AsmPrinter.h
index efbcef1b81..33d8a02862 100644
--- a/include/llvm/CodeGen/AsmPrinter.h
+++ b/include/llvm/CodeGen/AsmPrinter.h
@@ -62,10 +62,6 @@ namespace llvm {
typedef gcp_map_type::iterator gcp_iterator;
gcp_map_type GCMetadataPrinters;
- /// CurrentSection - The current section we are emitting to. This is
- /// controlled and used by the SwitchToSection method.
- const MCSection *CurrentSection;
-
/// If ExuberantAsm is set, a pointer to the loop info for this
/// function.
///
@@ -127,7 +123,7 @@ namespace llvm {
std::string CurrentFnName;
/// getCurrentSection() - Return the current section we are emitting to.
- const MCSection *getCurrentSection() const { return CurrentSection; }
+ const MCSection *getCurrentSection() const;
/// VerboseAsm - Emit comments in assembly output if this is true.
diff --git a/include/llvm/MC/MCStreamer.h b/include/llvm/MC/MCStreamer.h
index 48096c708a..4d55990f8a 100644
--- a/include/llvm/MC/MCStreamer.h
+++ b/include/llvm/MC/MCStreamer.h
@@ -69,6 +69,9 @@ namespace llvm {
protected:
MCStreamer(MCContext &Ctx);
+ /// CurSection - This is the current section code is being emitted to, it is
+ /// kept up to date by SwitchSection.
+ const MCSection *CurSection;
public:
virtual ~MCStreamer();
@@ -78,11 +81,16 @@ namespace llvm {
/// @{
/// SwitchSection - Set the current section where code is being emitted to
- /// @param Section.
+ /// @param Section. This is required to update CurSection.
///
/// This corresponds to assembler directives like .section, .text, etc.
virtual void SwitchSection(const MCSection *Section) = 0;
+
+ /// getCurrentSection - Return the current seciton that the streamer is
+ /// emitting code to.
+ const MCSection *getCurrentSection() const { return CurSection; }
+
/// EmitLabel - Emit a label for @param Symbol into the current section.
///
/// This corresponds to an assembler statement such as:
diff --git a/lib/CodeGen/AsmPrinter/AsmPrinter.cpp b/lib/CodeGen/AsmPrinter/AsmPrinter.cpp
index d8594db950..e6ee960dc4 100644
--- a/lib/CodeGen/AsmPrinter/AsmPrinter.cpp
+++ b/lib/CodeGen/AsmPrinter/AsmPrinter.cpp
@@ -63,7 +63,6 @@ AsmPrinter::AsmPrinter(formatted_raw_ostream &o, TargetMachine &tm,
LastMI(0), LastFn(0), Counter(~0U),
PrevDLT(0, ~0U, ~0U) {
- CurrentSection = 0;
DW = 0; MMI = 0;
switch (AsmVerbose) {
case cl::BOU_UNSET: VerboseAsm = VDef; break;
@@ -91,19 +90,18 @@ TargetLoweringObjectFile &AsmPrinter::getObjFileLowering() const {
}
/// SwitchToSection - Switch to the specified section of the executable if we
-/// are not already in it! If "NS" is null, then this causes us to exit the
-/// current section and not reenter another one. This is generally used for
-/// asmprinter hacks.
-///
-/// FIXME: Remove support for null sections.
-///
+/// are not already in it!
void AsmPrinter::SwitchToSection(const MCSection *NS) {
- CurrentSection = NS;
- // FIXME: Remove support for null sections!
- if (NS)
- OutStreamer.SwitchSection(NS);
+ assert(NS != 0 && "Must specify a section to switch to");
+ OutStreamer.SwitchSection(NS);
+}
+
+/// getCurrentSection() - Return the current section we are emitting to.
+const MCSection *AsmPrinter::getCurrentSection() const {
+ return OutStreamer.getCurrentSection();
}
+
void AsmPrinter::getAnalysisUsage(AnalysisUsage &AU) const {
AU.setPreservesAll();
MachineFunctionPass::getAnalysisUsage(AU);
@@ -143,8 +141,6 @@ bool AsmPrinter::doInitialization(Module &M) {
<< '\n' << TAI->getCommentString()
<< " End of file scope inline assembly\n";
- SwitchToSection(0); // Reset back to no section to close off sections.
-
if (TAI->doesSupportDebugInformation() ||
TAI->doesSupportExceptionHandling()) {
MMI = getAnalysisIfAvailable<MachineModuleInfo>();
@@ -174,7 +170,6 @@ bool AsmPrinter::doFinalization(Module &M) {
// to stuff that is actually used. Note that doing so would require targets
// to notice uses in operands (due to constant exprs etc). This should
// happen with the MC stuff eventually.
- SwitchToSection(0);
// Print out module-level global variables here.
for (Module::const_global_iterator I = M.global_begin(), E = M.global_end();
@@ -776,7 +771,7 @@ void AsmPrinter::EmitAlignment(unsigned NumBits, const GlobalValue *GV,
if (TAI->getAlignmentIsInBytes()) NumBits = 1 << NumBits;
O << TAI->getAlignDirective() << NumBits;
- if (CurrentSection && CurrentSection->getKind().isText())
+ if (getCurrentSection()->getKind().isText())
if (unsigned FillValue = TAI->getTextAlignFillValue()) {
O << ',';
PrintHex(FillValue);
diff --git a/lib/MC/MCAsmStreamer.cpp b/lib/MC/MCAsmStreamer.cpp
index 60d66f93af..cb3642532c 100644
--- a/lib/MC/MCAsmStreamer.cpp
+++ b/lib/MC/MCAsmStreamer.cpp
@@ -24,12 +24,10 @@ class MCAsmStreamer : public MCStreamer {
raw_ostream &OS;
const TargetAsmInfo &TAI;
AsmPrinter *Printer;
- const MCSection *CurSection;
public:
MCAsmStreamer(MCContext &Context, raw_ostream &_OS, const TargetAsmInfo &tai,
AsmPrinter *_AsmPrinter)
- : MCStreamer(Context), OS(_OS), TAI(tai), Printer(_AsmPrinter),
- CurSection(0) {}
+ : MCStreamer(Context), OS(_OS), TAI(tai), Printer(_AsmPrinter) {}
~MCAsmStreamer() {}
/// @name MCStreamer Interface
diff --git a/lib/MC/MCStreamer.cpp b/lib/MC/MCStreamer.cpp
index a634f33ad3..8a6dcdae7a 100644
--- a/lib/MC/MCStreamer.cpp
+++ b/lib/MC/MCStreamer.cpp
@@ -11,7 +11,7 @@
using namespace llvm;
-MCStreamer::MCStreamer(MCContext &_Context) : Context(_Context) {
+MCStreamer::MCStreamer(MCContext &_Context) : Context(_Context), CurSection(0) {
}
MCStreamer::~MCStreamer() {