forked from OSchip/llvm-project
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:
parent
4e7eb12f6f
commit
4c70eeaf33
|
@ -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,
|
||||
|
|
|
@ -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!");
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue