X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=lib%2FMC%2FMCObjectWriter.cpp;h=6cee76d0400ac7d35f1bc75b68d3d8efe5b0d9c4;hb=345ed9806a0ab5d680da1ff78fe3df7ebbc6107d;hp=ab85e31abb003a73ad926a11285497de7e1412dc;hpb=53b2338a1d061ad15a858ff0d641431f4d4ac101;p=oota-llvm.git diff --git a/lib/MC/MCObjectWriter.cpp b/lib/MC/MCObjectWriter.cpp index ab85e31abb0..6cee76d0400 100644 --- a/lib/MC/MCObjectWriter.cpp +++ b/lib/MC/MCObjectWriter.cpp @@ -1,4 +1,4 @@ -//===- lib/MC/MCObjetWriter.cpp - MCObjetWriter implementation ------------===// +//===- lib/MC/MCObjectWriter.cpp - MCObjectWriter implementation ----------===// // // The LLVM Compiler Infrastructure // @@ -13,3 +13,29 @@ using namespace llvm; MCObjectWriter::~MCObjectWriter() { } + +/// Utility function to encode a SLEB128 value. +void MCObjectWriter::EncodeSLEB128(int64_t Value, raw_ostream &OS) { + bool More; + do { + uint8_t Byte = Value & 0x7f; + // NOTE: this assumes that this signed shift is an arithmetic right shift. + Value >>= 7; + More = !((((Value == 0 ) && ((Byte & 0x40) == 0)) || + ((Value == -1) && ((Byte & 0x40) != 0)))); + if (More) + Byte |= 0x80; // Mark this byte that that more bytes will follow. + OS << char(Byte); + } while (More); +} + +/// Utility function to encode a ULEB128 value. +void MCObjectWriter::EncodeULEB128(uint64_t Value, raw_ostream &OS) { + do { + uint8_t Byte = Value & 0x7f; + Value >>= 7; + if (Value != 0) + Byte |= 0x80; // Mark this byte that that more bytes will follow. + OS << char(Byte); + } while (Value != 0); +}