dtrace: fix generation of v8 constants on freebsd
authorFedor Indutny <fedor.indutny@gmail.com>
Sun, 20 Jan 2013 14:31:30 +0000 (18:31 +0400)
committerBen Noordhuis <info@bnoordhuis.nl>
Wed, 20 Mar 2013 00:11:02 +0000 (01:11 +0100)
Every constant is certainly 4 bytes now, but freebsd's objdump utility
prints out odd byte sequences (5-bytes, 6-bytes and even 9-bytes long)
for v8's data section. We can safely ignore all upper bytes, because all
constants that we're using are just `int`s. Since on all supported
platforms `int` is 32bit long (and anyway v8's constants are 32bit too),
we ignore all higher bits if they were read.

tools/genv8constants.py

index 5c034b6..45b4ae3 100755 (executable)
@@ -17,9 +17,22 @@ if len(sys.argv) != 3:
   sys.exit(2);
 
 outfile = file(sys.argv[1], 'w');
-pipe = subprocess.Popen([ 'objdump', '-z', '-D', sys.argv[2] ],
-    bufsize=-1, stdout=subprocess.PIPE).stdout;
-pattern = re.compile('(00000000|0000000000000000) <(.*)>:');
+try:
+  pipe = subprocess.Popen([ 'objdump', '-z', '-D', sys.argv[2] ],
+      bufsize=-1, stdout=subprocess.PIPE).stdout;
+except OSError, e:
+  if e.errno == errno.ENOENT:
+    print '''
+      Node.js compile error: could not find objdump
+
+      Check that GNU binutils are installed and included in PATH
+      '''
+  else:
+    print 'problem running objdump: ', e.strerror
+
+  sys.exit()
+
+pattern = re.compile('([0-9a-fA-F]{8}|[0-9a-fA-F]{16}) <(.*)>:');
 v8dbg = re.compile('^v8dbg.*$')
 numpattern = re.compile('^[0-9a-fA-F]{2} $');
 octets = 4
@@ -50,10 +63,12 @@ def out_reset():
 def out_define():
   global curr_sym, curr_val, curr_octet, outfile, octets
   if curr_sym != None:
+    wrapped_val = curr_val & 0xffffffff;
     if curr_val & 0x80000000 != 0:
-      outfile.write("#define %s -0x%x\n" % (curr_sym.upper(), 0x100000000 - curr_val));
+      wrapped_val = 0x100000000 - wrapped_val;
+      outfile.write("#define %s -0x%x\n" % (curr_sym.upper(), wrapped_val));
     else:
-      outfile.write("#define %s 0x%x\n" % (curr_sym.upper(), curr_val));
+      outfile.write("#define %s 0x%x\n" % (curr_sym.upper(), wrapped_val));
   out_reset();
 
 for line in pipe:
@@ -82,8 +97,6 @@ for line in pipe:
   if match == None:
     continue;
 
-  octets = len(match.group(1)) / 2;
-
   # Print previous symbol
   out_define();