diff options
author | Chris Lattner <sabre@nondot.org> | 2010-01-19 22:03:38 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2010-01-19 22:03:38 +0000 |
commit | 067f647147084108ce92f19ff37259c054d01692 (patch) | |
tree | 1ed40c15964950de72685c64d2a8699bdad32c24 | |
parent | 780a7d99009f16f284b423705837fa76b1ce5370 (diff) | |
download | external_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.h | 4 | ||||
-rw-r--r-- | lib/MC/MCAsmStreamer.cpp | 35 | ||||
-rw-r--r-- | lib/MC/MCStreamer.cpp | 7 |
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, |