aboutsummaryrefslogtreecommitdiff
path: root/lib/Rewrite/Rewriter.cpp
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2008-04-12 20:28:24 +0000
committerChris Lattner <sabre@nondot.org>2008-04-12 20:28:24 +0000
commit5c9dc5ac75de8d620311cdc20223998e0293d61f (patch)
treeb2e629b2cd3831f46532d75daa02dd0254781faa /lib/Rewrite/Rewriter.cpp
parent72e62b0c6049b7e76b508bb74116314eb7772be5 (diff)
Do an initial hack at replacing one of the incredibly inefficient
(but simple!) datastructures in the rewriter with a more complex but more efficient one. This replaces the Deltas vector with a specialized BTree that makes delta lookups much more efficient. This speeds up -emit-html on a 500K .i file from 157.154 to 27.127 seconds on my machine (5.8x). While this code is functional, it isn't very pretty, I have much refactoring planned for it, and will remove the USE_VECTOR ifdef. Stay tuned. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@49586 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Rewrite/Rewriter.cpp')
-rw-r--r--lib/Rewrite/Rewriter.cpp15
1 files changed, 13 insertions, 2 deletions
diff --git a/lib/Rewrite/Rewriter.cpp b/lib/Rewrite/Rewriter.cpp
index 7b35cf1c59..e3c27eaad1 100644
--- a/lib/Rewrite/Rewriter.cpp
+++ b/lib/Rewrite/Rewriter.cpp
@@ -19,12 +19,16 @@
#include <sstream>
using namespace clang;
+
/// getMappedOffset - Given an offset into the original SourceBuffer that this
/// RewriteBuffer is based on, map it into the offset space of the
/// RewriteBuffer.
unsigned RewriteBuffer::getMappedOffset(unsigned OrigOffset,
bool AfterInserts) const {
- unsigned ResultOffset = OrigOffset;
+ unsigned ResultOffset = 0;
+#if !defined(USE_VECTOR)
+ ResultOffset += Deltas.getDeltaAt(OrigOffset+AfterInserts);
+#else
unsigned DeltaIdx = 0;
// Move past any deltas that are relevant.
@@ -37,13 +41,19 @@ unsigned RewriteBuffer::getMappedOffset(unsigned OrigOffset,
for (; DeltaIdx != Deltas.size() &&
OrigOffset == Deltas[DeltaIdx].FileLoc; ++DeltaIdx)
ResultOffset += Deltas[DeltaIdx].Delta;
+#endif
- return ResultOffset;
+ // printf("Map: %d/%d -> %d\n", OrigOffset, AfterInserts, ResultOffset);
+ return ResultOffset+OrigOffset;
}
/// AddDelta - When a change is made that shifts around the text buffer, this
/// method is used to record that info.
void RewriteBuffer::AddDelta(unsigned OrigOffset, int Change) {
+ // printf("AddDelta: %d/%d\n", OrigOffset, Change);
+#if !defined(USE_VECTOR)
+ return Deltas.AddDelta(OrigOffset, Change);
+#else
assert(Change != 0 && "Not changing anything");
unsigned DeltaIdx = 0;
@@ -82,6 +92,7 @@ void RewriteBuffer::AddDelta(unsigned OrigOffset, int Change) {
// If it is now dead, remove it.
if (Deltas[DeltaIdx].Delta == 0)
Deltas.erase(Deltas.begin()+DeltaIdx);
+#endif
}