aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2010-01-19 22:03:38 +0000
committerChris Lattner <sabre@nondot.org>2010-01-19 22:03:38 +0000
commit067f647147084108ce92f19ff37259c054d01692 (patch)
tree1ed40c15964950de72685c64d2a8699bdad32c24
parent780a7d99009f16f284b423705837fa76b1ce5370 (diff)
downloadexternal_llvm-067f647147084108ce92f19ff37259c054d01692.zip
external_llvm-067f647147084108ce92f19ff37259c054d01692.tar.gz
external_llvm-067f647147084108ce92f19ff37259c054d01692.tar.bz2
add a new EmitIntValue method that MCStreamer impls can optionally define
and that clients can use. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@93923 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--include/llvm/MC/MCStreamer.h4
-rw-r--r--lib/MC/MCAsmStreamer.cpp35
-rw-r--r--lib/MC/MCStreamer.cpp7
3 files changed, 40 insertions, 6 deletions
diff --git a/include/llvm/MC/MCStreamer.h b/include/llvm/MC/MCStreamer.h
index be66a62..f1680a9 100644
--- a/include/llvm/MC/MCStreamer.h
+++ b/include/llvm/MC/MCStreamer.h
@@ -169,6 +169,10 @@ namespace llvm {
virtual void EmitValue(const MCExpr *Value, unsigned Size,
unsigned AddrSpace) = 0;
+ /// EmitIntValue - Special case of EmitValue that avoids the client having
+ /// to pass in a MCExpr for constant integers.
+ virtual void EmitIntValue(uint64_t Value, unsigned Size,unsigned AddrSpace);
+
/// EmitFill - Emit NumBytes bytes worth of the value specified by
/// FillValue. This implements directives such as '.space'.
virtual void EmitFill(uint64_t NumBytes, uint8_t FillValue,
diff --git a/lib/MC/MCAsmStreamer.cpp b/lib/MC/MCAsmStreamer.cpp
index f334600..a126b52 100644
--- a/lib/MC/MCAsmStreamer.cpp
+++ b/lib/MC/MCAsmStreamer.cpp
@@ -61,6 +61,8 @@ public:
virtual void EmitBytes(StringRef Data, unsigned AddrSpace);
virtual void EmitValue(const MCExpr *Value, unsigned Size,unsigned AddrSpace);
+ virtual void EmitIntValue(uint64_t Value, unsigned Size, unsigned AddrSpace);
+
virtual void EmitFill(uint64_t NumBytes, uint8_t FillValue,
unsigned AddrSpace);
@@ -187,19 +189,40 @@ void MCAsmStreamer::EmitBytes(StringRef Data, unsigned AddrSpace) {
OS << Directive << (unsigned)(unsigned char)Data[i] << '\n';
}
+/// EmitIntValue - Special case of EmitValue that avoids the client having
+/// to pass in a MCExpr for constant integers.
+void MCAsmStreamer::EmitIntValue(uint64_t Value, unsigned Size,
+ unsigned AddrSpace) {
+ assert(CurSection && "Cannot emit contents before setting section!");
+ // Need target hooks to know how to print this.
+ const char *Directive = 0;
+ switch (Size) {
+ default: break;
+ case 1: Directive = MAI.getData8bitsDirective(AddrSpace); break;
+ case 2: Directive = MAI.getData16bitsDirective(AddrSpace); break;
+ case 4: Directive = MAI.getData32bitsDirective(AddrSpace); break;
+ case 8: Directive = MAI.getData64bitsDirective(AddrSpace); break;
+ }
+
+ assert(Directive && "Invalid size for machine code value!");
+ OS << Directive << truncateToSize(Value, Size) << '\n';
+}
+
void MCAsmStreamer::EmitValue(const MCExpr *Value, unsigned Size,
unsigned AddrSpace) {
assert(CurSection && "Cannot emit contents before setting section!");
// Need target hooks to know how to print this.
+ const char *Directive = 0;
switch (Size) {
- default: assert(0 && "Invalid size for machine code value!");
- case 1: OS << MAI.getData8bitsDirective(AddrSpace); break;
- case 2: OS << MAI.getData16bitsDirective(AddrSpace); break;
- case 4: OS << MAI.getData32bitsDirective(AddrSpace); break;
- case 8: OS << MAI.getData64bitsDirective(AddrSpace); break;
+ default: break;
+ case 1: Directive = MAI.getData8bitsDirective(AddrSpace); break;
+ case 2: Directive = MAI.getData16bitsDirective(AddrSpace); break;
+ case 4: Directive = MAI.getData32bitsDirective(AddrSpace); break;
+ case 8: Directive = MAI.getData64bitsDirective(AddrSpace); break;
}
- OS << *truncateToSize(Value, Size) << '\n';
+ assert(Directive && "Invalid size for machine code value!");
+ OS << Directive << *truncateToSize(Value, Size) << '\n';
}
/// EmitFill - Emit NumBytes bytes worth of the value specified by
diff --git a/lib/MC/MCStreamer.cpp b/lib/MC/MCStreamer.cpp
index 20767de..4e9d094 100644
--- a/lib/MC/MCStreamer.cpp
+++ b/lib/MC/MCStreamer.cpp
@@ -18,6 +18,13 @@ MCStreamer::MCStreamer(MCContext &_Context) : Context(_Context), CurSection(0) {
MCStreamer::~MCStreamer() {
}
+/// EmitIntValue - Special case of EmitValue that avoids the client having to
+/// pass in a MCExpr for constant integers.
+void MCStreamer::EmitIntValue(uint64_t Value, unsigned Size,
+ unsigned AddrSpace) {
+ EmitValue(MCConstantExpr::Create(Value, getContext()), Size, AddrSpace);
+}
+
/// EmitFill - Emit NumBytes bytes worth of the value specified by
/// FillValue. This implements directives such as '.space'.
void MCStreamer::EmitFill(uint64_t NumBytes, uint8_t FillValue,