Make EmitIntValue more efficient and more like what we do for leb128. The

difference is much smaller (about 0.3s) but significant.

llvm-svn: 120787
This commit is contained in:
Rafael Espindola 2010-12-03 02:54:21 +00:00
parent 4e7eb12f6f
commit 4c70eeaf33
4 changed files with 22 additions and 11 deletions

View File

@ -246,7 +246,8 @@ namespace llvm {
/// EmitIntValue - Special case of EmitValue that avoids the client having
/// to pass in a MCExpr for constant integers.
void EmitIntValue(uint64_t Value, unsigned Size, unsigned AddrSpace = 0);
virtual void EmitIntValue(uint64_t Value, unsigned Size,
unsigned AddrSpace = 0);
virtual void EmitULEB128Value(const MCExpr *Value,

View File

@ -152,6 +152,8 @@ public:
virtual void EmitValue(const MCExpr *Value, unsigned Size,unsigned AddrSpace,
bool UseSet = false);
virtual void EmitIntValue(uint64_t Value, unsigned Size,
unsigned AddrSpace = 0);
virtual void EmitULEB128Value(const MCExpr *Value, unsigned AddrSpace = 0);
@ -504,6 +506,11 @@ void MCAsmStreamer::EmitBytes(StringRef Data, unsigned AddrSpace) {
EmitEOL();
}
void MCAsmStreamer::EmitIntValue(uint64_t Value, unsigned Size,
unsigned AddrSpace) {
EmitValue(MCConstantExpr::Create(Value, getContext()), Size, AddrSpace);
}
void MCAsmStreamer::EmitValue(const MCExpr *Value, unsigned Size,
unsigned AddrSpace, bool UseSet) {
assert(CurSection && "Cannot emit contents before setting section!");

View File

@ -83,16 +83,14 @@ void MCObjectStreamer::EmitValue(const MCExpr *Value, unsigned Size,
// Avoid fixups when possible.
int64_t AbsValue;
if (AddValueSymbols(Value)->EvaluateAsAbsolute(AbsValue)) {
// FIXME: Endianness assumption.
for (unsigned i = 0; i != Size; ++i)
DF->getContents().push_back(uint8_t(AbsValue >> (i * 8)));
} else {
DF->addFixup(MCFixup::Create(DF->getContents().size(),
AddValueSymbols(Value),
MCFixup::getKindForSize(Size, false)));
DF->getContents().resize(DF->getContents().size() + Size, 0);
if (AddValueSymbols(Value)->EvaluateAsAbsolute(AbsValue, &getAssembler())) {
EmitIntValue(AbsValue, Size, AddrSpace);
return;
}
DF->addFixup(MCFixup::Create(DF->getContents().size(),
AddValueSymbols(Value),
MCFixup::getKindForSize(Size, false)));
DF->getContents().resize(DF->getContents().size() + Size, 0);
}
void MCObjectStreamer::EmitLabel(MCSymbol *Symbol) {

View File

@ -46,7 +46,12 @@ void MCStreamer::EmitDwarfSetLineAddr(int64_t LineDelta,
/// pass in a MCExpr for constant integers.
void MCStreamer::EmitIntValue(uint64_t Value, unsigned Size,
unsigned AddrSpace) {
EmitValue(MCConstantExpr::Create(Value, getContext()), Size, AddrSpace);
assert(Size <= 8);
char buf[8];
// FIXME: Endianness assumption.
for (unsigned i = 0; i != Size; ++i)
buf[i] = uint8_t(Value >> (i * 8));
EmitBytes(StringRef(buf, Size), AddrSpace);
}
/// EmitULEB128Value - Special case of EmitULEB128Value that avoids the