summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/llvm/MC/MCStreamer.h4
-rw-r--r--include/llvm/Target/TargetRegistry.h2
-rw-r--r--lib/MC/MCAsmStreamer.cpp7
-rw-r--r--lib/MC/MCNullStreamer.cpp72
4 files changed, 79 insertions, 6 deletions
diff --git a/include/llvm/MC/MCStreamer.h b/include/llvm/MC/MCStreamer.h
index 0f973eb750..3f37bfe2a8 100644
--- a/include/llvm/MC/MCStreamer.h
+++ b/include/llvm/MC/MCStreamer.h
@@ -221,6 +221,10 @@ namespace llvm {
virtual void Finish() = 0;
};
+ /// createNullStreamer - Create a dummy machine code streamer, which does
+ /// nothing. This is useful for timing the assembler front end.
+ MCStreamer *createNullStreamer(MCContext &Ctx);
+
/// createAsmStreamer - Create a machine code streamer which will print out
/// assembly for the native target, suitable for compiling with a native
/// assembler.
diff --git a/include/llvm/Target/TargetRegistry.h b/include/llvm/Target/TargetRegistry.h
index 9c2d959f58..bfb23ef930 100644
--- a/include/llvm/Target/TargetRegistry.h
+++ b/include/llvm/Target/TargetRegistry.h
@@ -217,7 +217,7 @@ namespace llvm {
/// the current host. If no close target can be found, this returns null
/// and sets the Error string to a reason.
///
- /// Mainted for compatibility through 2.6.
+ /// Maintained for compatibility through 2.6.
static const Target *getClosestTargetForJIT(std::string &Error);
/// @}
diff --git a/lib/MC/MCAsmStreamer.cpp b/lib/MC/MCAsmStreamer.cpp
index 5457913b94..75390c695a 100644
--- a/lib/MC/MCAsmStreamer.cpp
+++ b/lib/MC/MCAsmStreamer.cpp
@@ -155,6 +155,7 @@ void MCAsmStreamer::EmitLabel(MCSymbol *Symbol) {
void MCAsmStreamer::EmitAssemblerFlag(AssemblerFlag Flag) {
switch (Flag) {
+ default: assert(0 && "Invalid flag!");
case SubsectionsViaSymbols: OS << ".subsections_via_symbols"; break;
}
OS << '\n';
@@ -215,10 +216,7 @@ void MCAsmStreamer::EmitCommonSymbol(MCSymbol *Symbol, unsigned Size,
void MCAsmStreamer::EmitZerofill(MCSection *Section, MCSymbol *Symbol,
unsigned Size, unsigned Pow2Alignment) {
- // Note: a .zerofill directive does not switch sections
- // FIXME: Really we would like the segment and section names as well as the
- // section type to be separate values instead of embedded in the name. Not
- // all assemblers understand all this stuff though.
+ // Note: a .zerofill directive does not switch sections.
OS << ".zerofill ";
// This is a mach-o specific directive.
@@ -226,7 +224,6 @@ void MCAsmStreamer::EmitZerofill(MCSection *Section, MCSymbol *Symbol,
OS << '"' << MOSection->getSegmentName() << ","
<< MOSection->getSectionName() << '"';
-
if (Symbol != NULL) {
OS << ',' << Symbol << ',' << Size;
if (Pow2Alignment != 0)
diff --git a/lib/MC/MCNullStreamer.cpp b/lib/MC/MCNullStreamer.cpp
new file mode 100644
index 0000000000..3ac79cbf0a
--- /dev/null
+++ b/lib/MC/MCNullStreamer.cpp
@@ -0,0 +1,72 @@
+//===- lib/MC/MCNullStreamer.cpp - Dummy Streamer Implementation ----------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#include "llvm/MC/MCStreamer.h"
+
+#include "llvm/MC/MCContext.h"
+#include "llvm/MC/MCInst.h"
+#include "llvm/MC/MCSectionMachO.h"
+#include "llvm/MC/MCSymbol.h"
+#include "llvm/MC/MCValue.h"
+
+using namespace llvm;
+
+namespace {
+
+ class MCNullStreamer : public MCStreamer {
+ public:
+ MCNullStreamer(MCContext &Context) : MCStreamer(Context) {}
+
+ /// @name MCStreamer Interface
+ /// @{
+
+ virtual void SwitchSection(MCSection *Section) {}
+
+ virtual void EmitLabel(MCSymbol *Symbol) {}
+
+ virtual void EmitAssemblerFlag(AssemblerFlag Flag) {}
+
+ virtual void EmitAssignment(MCSymbol *Symbol, const MCValue &Value,
+ bool MakeAbsolute = false) {}
+
+ virtual void EmitSymbolAttribute(MCSymbol *Symbol, SymbolAttr Attribute) {}
+
+ virtual void EmitSymbolDesc(MCSymbol *Symbol, unsigned DescValue) {}
+
+ virtual void EmitLocalSymbol(MCSymbol *Symbol, const MCValue &Value) {}
+
+ virtual void EmitCommonSymbol(MCSymbol *Symbol, unsigned Size,
+ unsigned Pow2Alignment, bool IsLocal) {}
+
+ virtual void EmitZerofill(MCSection *Section, MCSymbol *Symbol = NULL,
+ unsigned Size = 0, unsigned Pow2Alignment = 0) {}
+
+ virtual void EmitBytes(const StringRef &Data) {}
+
+ virtual void EmitValue(const MCValue &Value, unsigned Size) {}
+
+ virtual void EmitValueToAlignment(unsigned ByteAlignment, int64_t Value = 0,
+ unsigned ValueSize = 1,
+ unsigned MaxBytesToEmit = 0) {}
+
+ virtual void EmitValueToOffset(const MCValue &Offset,
+ unsigned char Value = 0) {}
+
+ virtual void EmitInstruction(const MCInst &Inst) {}
+
+ virtual void Finish() {}
+
+ /// @}
+ };
+
+}
+
+MCStreamer *llvm::createNullStreamer(MCContext &Context) {
+ return new MCNullStreamer(Context);
+}