aboutsummaryrefslogtreecommitdiff
path: root/lib/Bytecode/Writer
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2004-01-15 21:06:57 +0000
committerChris Lattner <sabre@nondot.org>2004-01-15 21:06:57 +0000
commit0baa0af86148200df4b7885e3b50855702f79b3a (patch)
tree517d1c34b864170944ea6f7a0504087034e18f2f /lib/Bytecode/Writer
parentd5c59d5c84d15976a555f0229f264d20852dc593 (diff)
If these blocks are empty, there is no reason to even emit the bytecode blocks.
This saves about 15K in 176.gcc, coupled with another patch that I'm working on. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@10889 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Bytecode/Writer')
-rw-r--r--lib/Bytecode/Writer/Writer.cpp6
-rw-r--r--lib/Bytecode/Writer/WriterInternals.h26
2 files changed, 24 insertions, 8 deletions
diff --git a/lib/Bytecode/Writer/Writer.cpp b/lib/Bytecode/Writer/Writer.cpp
index 5675b2af49..6467921d05 100644
--- a/lib/Bytecode/Writer/Writer.cpp
+++ b/lib/Bytecode/Writer/Writer.cpp
@@ -164,7 +164,8 @@ void BytecodeWriter::outputConstantsInPlane(const std::vector<const Value*>
void BytecodeWriter::outputConstants(bool isFunction) {
ConstantTotalBytes -= Out.size();
if (isFunction) FunctionConstantTotalBytes -= Out.size();
- BytecodeBlock CPool(BytecodeFormat::ConstantPool, Out);
+ BytecodeBlock CPool(BytecodeFormat::ConstantPool, Out,
+ true /* Elide block if empty */);
unsigned NumPlanes = Table.getNumPlanes();
@@ -286,7 +287,8 @@ void BytecodeWriter::outputSymbolTable(const SymbolTable &MST) {
SymTabBytes -= Out.size();
- BytecodeBlock SymTabBlock(BytecodeFormat::SymbolTable, Out);
+ BytecodeBlock SymTabBlock(BytecodeFormat::SymbolTable, Out,
+ true/* ElideIfEmpty*/);
for (SymbolTable::const_iterator TI = MST.begin(); TI != MST.end(); ++TI) {
SymbolTable::type_const_iterator I = MST.type_begin(TI->first);
diff --git a/lib/Bytecode/Writer/WriterInternals.h b/lib/Bytecode/Writer/WriterInternals.h
index 51ec362d84..15dbeffc86 100644
--- a/lib/Bytecode/Writer/WriterInternals.h
+++ b/lib/Bytecode/Writer/WriterInternals.h
@@ -50,27 +50,41 @@ private:
-// BytecodeBlock - Little helper class that helps us do backpatching of bytecode
-// block sizes really easily. It backpatches when it goes out of scope.
-//
+/// BytecodeBlock - Little helper class is used by the bytecode writer to help
+/// do backpatching of bytecode block sizes really easily. It backpatches when
+/// it goes out of scope.
+///
class BytecodeBlock {
unsigned Loc;
std::deque<unsigned char> &Out;
+ /// ElideIfEmpty - If this is true and the bytecode block ends up being empty,
+ /// the block can remove itself from the output stream entirely.
+ bool ElideIfEmpty;
+
BytecodeBlock(const BytecodeBlock &); // do not implement
void operator=(const BytecodeBlock &); // do not implement
public:
- inline BytecodeBlock(unsigned ID, std::deque<unsigned char> &o) : Out(o) {
+ inline BytecodeBlock(unsigned ID, std::deque<unsigned char> &o,
+ bool elideIfEmpty = false)
+ : Out(o), ElideIfEmpty(elideIfEmpty) {
output(ID, Out);
- output((unsigned)0, Out); // Reserve the space for the block size...
+ output(0U, Out); // Reserve the space for the block size...
Loc = Out.size();
}
inline ~BytecodeBlock() { // Do backpatch when block goes out
// of scope...
+ if (Loc == Out.size() && ElideIfEmpty) {
+ // If the block is empty, and we are allowed to, do not emit the block at
+ // all!
+ Out.resize(Out.size()-8);
+ return;
+ }
+
//cerr << "OldLoc = " << Loc << " NewLoc = " << NewLoc << " diff = "
// << (NewLoc-Loc) << endl;
- output((unsigned)(Out.size()-Loc), Out, (int)Loc-4);
+ output(unsigned(Out.size()-Loc), Out, int(Loc-4));
align32(Out); // Blocks must ALWAYS be aligned
}
};