[llvm] r237876 - AsmPrinter: Compute absolute label difference directly
Duncan P. N. Exon Smith
dexonsmith at apple.com
Wed May 20 19:41:24 PDT 2015
Author: dexonsmith
Date: Wed May 20 21:41:23 2015
New Revision: 237876
URL: http://llvm.org/viewvc/llvm-project?rev=237876&view=rev
Log:
AsmPrinter: Compute absolute label difference directly
Create a low-overhead path for `EmitLabelDifference()` that emits a
emits an absolute number when (1) the output is an object stream and (2)
the two symbols are in the same data fragment.
This drops memory usage on Mach-O from 975 MB down to 919 MB (5.8%).
The only call is when `!doesDwarfUseRelocationsAcrossSections()` --
i.e., on Mach-O -- since otherwise an absolute offset from the start of
the section needs a relocation. (`EmitLabelDifference()` is cheaper on
ELF anyway, since it creates 1 fewer temp symbol, and it gets called far
less often. It's not clear to me if this is even a bottleneck there.)
(I'm looking at `llc` memory usage on `verify-uselistorder.lto.opt.bc`;
see r236629 for details.)
Modified:
llvm/trunk/include/llvm/MC/MCObjectStreamer.h
llvm/trunk/include/llvm/MC/MCStreamer.h
llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinter.cpp
llvm/trunk/lib/MC/MCObjectStreamer.cpp
Modified: llvm/trunk/include/llvm/MC/MCObjectStreamer.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/MC/MCObjectStreamer.h?rev=237876&r1=237875&r2=237876&view=diff
==============================================================================
--- llvm/trunk/include/llvm/MC/MCObjectStreamer.h (original)
+++ llvm/trunk/include/llvm/MC/MCObjectStreamer.h Wed May 20 21:41:23 2015
@@ -136,6 +136,17 @@ public:
void EmitZeros(uint64_t NumBytes) override;
void FinishImpl() override;
+ /// Emit the absolute difference between two symbols if possible.
+ ///
+ /// Emit the absolute difference between \c Hi and \c Lo, as long as we can
+ /// compute it. Currently, that requires that both symbols are in the same
+ /// data fragment. Otherwise, do nothing and return \c false.
+ ///
+ /// \pre Offset of \c Hi is greater than the offset \c Lo.
+ /// \return true on success.
+ bool emitAbsoluteSymbolDiff(const MCSymbol *Hi, const MCSymbol *Lo,
+ unsigned Size) override;
+
bool mayHaveInstructions() const override {
return getCurrentSectionData()->hasInstructions();
}
Modified: llvm/trunk/include/llvm/MC/MCStreamer.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/MC/MCStreamer.h?rev=237876&r1=237875&r2=237876&view=diff
==============================================================================
--- llvm/trunk/include/llvm/MC/MCStreamer.h (original)
+++ llvm/trunk/include/llvm/MC/MCStreamer.h Wed May 20 21:41:23 2015
@@ -652,6 +652,15 @@ public:
unsigned Isa, unsigned Discriminator,
StringRef FileName);
+ /// Emit the absolute difference between two symbols if possible.
+ ///
+ /// \pre Offset of \c Hi is greater than the offset \c Lo.
+ /// \return true on success.
+ virtual bool emitAbsoluteSymbolDiff(const MCSymbol *Hi, const MCSymbol *Lo,
+ unsigned Size) {
+ return false;
+ }
+
virtual MCSymbol *getDwarfLineTableSymbol(unsigned CUID);
virtual void EmitCFISections(bool EH, bool Debug);
void EmitCFIStartProc(bool IsSimple);
Modified: llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinter.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinter.cpp?rev=237876&r1=237875&r2=237876&view=diff
==============================================================================
--- llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinter.cpp (original)
+++ llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinter.cpp Wed May 20 21:41:23 2015
@@ -1591,6 +1591,10 @@ void AsmPrinter::EmitInt32(int Value) co
/// .set if it avoids relocations.
void AsmPrinter::EmitLabelDifference(const MCSymbol *Hi, const MCSymbol *Lo,
unsigned Size) const {
+ if (!MAI->doesDwarfUseRelocationsAcrossSections())
+ if (OutStreamer->emitAbsoluteSymbolDiff(Hi, Lo, Size))
+ return;
+
// Get the Hi-Lo expression.
const MCExpr *Diff =
MCBinaryExpr::CreateSub(MCSymbolRefExpr::Create(Hi, OutContext),
Modified: llvm/trunk/lib/MC/MCObjectStreamer.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/MCObjectStreamer.cpp?rev=237876&r1=237875&r2=237876&view=diff
==============================================================================
--- llvm/trunk/lib/MC/MCObjectStreamer.cpp (original)
+++ llvm/trunk/lib/MC/MCObjectStreamer.cpp Wed May 20 21:41:23 2015
@@ -53,6 +53,29 @@ void MCObjectStreamer::flushPendingLabel
}
}
+bool MCObjectStreamer::emitAbsoluteSymbolDiff(const MCSymbol *Hi,
+ const MCSymbol *Lo,
+ unsigned Size) {
+ // Must have symbol data.
+ if (!Assembler->hasSymbolData(*Hi) || !Assembler->hasSymbolData(*Lo))
+ return false;
+ auto &HiD = Assembler->getSymbolData(*Hi);
+ auto &LoD = Assembler->getSymbolData(*Lo);
+
+ // Must both be assigned to the same (valid) fragment.
+ if (!HiD.getFragment() || HiD.getFragment() != LoD.getFragment())
+ return false;
+
+ // Must be a data fragment.
+ if (!isa<MCDataFragment>(HiD.getFragment()))
+ return false;
+
+ assert(HiD.getOffset() >= LoD.getOffset() &&
+ "Expected Hi to be greater than Lo");
+ EmitIntValue(HiD.getOffset() - LoD.getOffset(), Size);
+ return true;
+}
+
void MCObjectStreamer::reset() {
if (Assembler)
Assembler->reset();
More information about the llvm-commits
mailing list