aboutsummaryrefslogtreecommitdiff
path: root/tools
diff options
context:
space:
mode:
authorAlon Zakai <azakai@mozilla.com>2011-03-03 07:39:33 -0800
committerAlon Zakai <azakai@mozilla.com>2011-03-03 07:39:33 -0800
commit4d51d0b2762c186a6071df547b772b12961aa368 (patch)
treed79db04229e1feec8d5770bc639cba107fa46bd5 /tools
parentc3408af2696ab4c0649495b63ec912f55156890b (diff)
autodebug improvements
Diffstat (limited to 'tools')
-rw-r--r--tools/autodebugger.py79
1 files changed, 74 insertions, 5 deletions
diff --git a/tools/autodebugger.py b/tools/autodebugger.py
index b90501cc..f11053e8 100644
--- a/tools/autodebugger.py
+++ b/tools/autodebugger.py
@@ -8,17 +8,79 @@ compare that to the output when compiled using emscripten.
import os, sys, re
POSTAMBLE = '''
-@.emscripten.autodebug.str = private constant [9 x i8] c"%d : %d\\0A\\00", align 1 ; [#uses=1]
+@.emscripten.autodebug.str = private constant [21 x i8] c"line: %d, value: %d\\0A\\00", align 1 ; [#uses=1]
; [#uses=1]
-define void @emscripten_autodebug(i32 %line, i32 %value) {
+define void @emscripten_autodebug_i32(i32 %line, i32 %value) {
entry:
- %0 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([9 x i8]* @.emscripten.autodebug.str, i32 0, i32 0), i32 %line, i32 %value) ; [#uses=0]
+ %0 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([21 x i8]* @.emscripten.autodebug.str, i32 0, i32 0), i32 %line, i32 %value) ; [#uses=0]
br label %return
return: ; preds = %entry
ret void
}
+
+; [#uses=1]
+define void @emscripten_autodebug_i8(i32 %line, i8 %value) {
+entry:
+ %0 = zext i8 %value to i32 ; [#uses=1]
+ %1 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([21 x i8]* @.emscripten.autodebug.str, i32 0, i32 0), i32 %line, i32 %0) ; [#uses=0]
+ br label %return
+
+return: ; preds = %entry
+ ret void
+}
+
+; [#uses=1]
+define void @emscripten_autodebug_float(i32 %line, float %value) {
+entry:
+ %0 = fpext float %value to double ; [#uses=1]
+ %1 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([21 x i8]* @.emscripten.autodebug.str, i32 0, i32 0), i32 %line, double %0) ; [#uses=0]
+ br label %return
+
+return: ; preds = %entry
+ ret void
+}
+
+; [#uses=1]
+define void @emscripten_autodebug_double(i32 %line, double %value) {
+entry:
+ %0 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([21 x i8]* @.emscripten.autodebug.str, i32 0, i32 0), i32 %line, double %value) ; [#uses=0]
+ br label %return
+
+return: ; preds = %entry
+ ret void
+}
+'''
+
+POSTAMBLE_NEW = '''
+@.emscripten.autodebug.str = private constant [21 x i8] c"line: %d, value: %d\\0A\\00", align 1 ; [#uses=1]
+
+; [#uses=1]
+define void @emscripten_autodebug_i32(i32 %line, i32 %value) {
+ %1 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([21 x i8]* @.emscripten.autodebug.str, i32 0, i32 0), i32 %line, i32 %value) ; [#uses=0]
+ ret void
+}
+
+; [#uses=1]
+define void @emscripten_autodebug_i8(i32 %line, i8 %value) {
+ %1 = zext i8 %value to i32 ; [#uses=1]
+ %2 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([21 x i8]* @.emscripten.autodebug.str, i32 0, i32 0), i32 %line, i32 %1) ; [#uses=0]
+ ret void
+}
+
+; [#uses=1]
+define void @emscripten_autodebug_float(i32 %line, float %value) {
+ %1 = fpext float %value to double ; [#uses=1]
+ %2 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([21 x i8]* @.emscripten.autodebug.str, i32 0, i32 0), i32 %line, double %1) ; [#uses=0]
+ ret void
+}
+
+; [#uses=1]
+define void @emscripten_autodebug_double(i32 %line, double %value) {
+ %1 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([21 x i8]* @.emscripten.autodebug.str, i32 0, i32 0), i32 %line, double %value) ; [#uses=0]
+ ret void
+}
'''
filename, ofilename = sys.argv[1], sys.argv[2]
@@ -32,14 +94,21 @@ if 'declare i32 @printf(' not in data:
declare i32 @printf(i8*, ...)
'''
+LLVM_STYLE_OLD = '<label>' not in data and 'entry:' in data
+
+if not LLVM_STYLE_OLD:
+ POSTAMBLE = POSTAMBLE_NEW
+
+lines_added = 0
lines = data.split('\n')
for i in range(len(lines)):
#if i == 5:
# lines[i] += '\n
m = re.match(' store (?P<type>i64|i32|i16|i8) %(?P<var>[\w.]+), .*', lines[i])
- if m and m.group('type') == 'i32': # TODO: Other types
- lines[i] += '\n call void @emscripten_autodebug(i32 %d, i32 %%%s)' % (i+1, m.group('var'))
+ if m and m.group('type') in ['i8', 'i32', 'float', 'double']:
+ lines[i] += '\n call void @emscripten_autodebug_%s(i32 %d, %s %%%s)' % (m.group('type'), i+1+lines_added, m.group('type'), m.group('var'))
+ lines_added += 1
f = open(ofilename, 'w')
f.write('\n'.join(lines) + '\n' + POSTAMBLE + '\n')