Version 3.2.7

Disabled the original 'classic' V8 code generator.  Crankshaft is now the default on all platforms.

Changed the heap profiler to use more descriptive names.

Performance and stability improvements to isolates on all platforms.

git-svn-id: http://v8.googlecode.com/svn/trunk@7491 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
diff --git a/SConstruct b/SConstruct
index 2287c80..d92dd02 100644
--- a/SConstruct
+++ b/SConstruct
@@ -27,6 +27,7 @@
 
 import platform
 import re
+import subprocess
 import sys
 import os
 from os.path import join, dirname, abspath
@@ -145,6 +146,9 @@
       # Use visibility=default to disable this.
       'CXXFLAGS':     ['-fvisibility=hidden']
     },
+    'strictaliasing:off': {
+      'CCFLAGS':      ['-fno-strict-aliasing']
+    },
     'mode:debug': {
       'CCFLAGS':      ['-g', '-O0'],
       'CPPDEFINES':   ['ENABLE_DISASSEMBLER', 'DEBUG'],
@@ -826,8 +830,16 @@
   sys.exit(1)
 
 
-def GuessToolchain(os):
-  tools = Environment()['TOOLS']
+def GuessOS(env):
+  return utils.GuessOS()
+
+
+def GuessArch(env):
+  return utils.GuessArchitecture()
+
+
+def GuessToolchain(env):
+  tools = env['TOOLS']
   if 'gcc' in tools:
     return 'gcc'
   elif 'msvc' in tools:
@@ -836,7 +848,9 @@
     return None
 
 
-def GuessVisibility(os, toolchain):
+def GuessVisibility(env):
+  os = env['os']
+  toolchain = env['toolchain'];
   if (os == 'win32' or os == 'cygwin') and toolchain == 'gcc':
     # MinGW / Cygwin can't do it.
     return 'default'
@@ -846,28 +860,41 @@
     return 'hidden'
 
 
-OS_GUESS = utils.GuessOS()
-TOOLCHAIN_GUESS = GuessToolchain(OS_GUESS)
-ARCH_GUESS = utils.GuessArchitecture()
-VISIBILITY_GUESS = GuessVisibility(OS_GUESS, TOOLCHAIN_GUESS)
+def GuessStrictAliasing(env):
+  # There seems to be a problem with gcc 4.5.x.
+  # See http://code.google.com/p/v8/issues/detail?id=884
+  # It can be worked around by disabling strict aliasing.
+  toolchain = env['toolchain'];
+  if toolchain == 'gcc':
+    env = Environment(tools=['gcc'])
+    # The gcc version should be available in env['CCVERSION'],
+    # but when scons detects msvc this value is not set.
+    version = subprocess.Popen([env['CC'], '-dumpversion'],
+        stdout=subprocess.PIPE).communicate()[0]
+    if version.find('4.5') == 0:
+      return 'off'
+  return 'default'
 
 
-SIMPLE_OPTIONS = {
-  'toolchain': {
-    'values': ['gcc', 'msvc'],
-    'default': TOOLCHAIN_GUESS,
-    'help': 'the toolchain to use (%s)' % TOOLCHAIN_GUESS
+PLATFORM_OPTIONS = {
+  'arch': {
+    'values': ['arm', 'ia32', 'x64', 'mips'],
+    'guess': GuessArch,
+    'help': 'the architecture to build for'
   },
   'os': {
     'values': ['freebsd', 'linux', 'macos', 'win32', 'android', 'openbsd', 'solaris', 'cygwin'],
-    'default': OS_GUESS,
-    'help': 'the os to build for (%s)' % OS_GUESS
+    'guess': GuessOS,
+    'help': 'the os to build for'
   },
-  'arch': {
-    'values':['arm', 'ia32', 'x64', 'mips'],
-    'default': ARCH_GUESS,
-    'help': 'the architecture to build for (%s)' % ARCH_GUESS
-  },
+  'toolchain': {
+    'values': ['gcc', 'msvc'],
+    'guess': GuessToolchain,
+    'help': 'the toolchain to use'
+  }
+}
+
+SIMPLE_OPTIONS = {
   'regexp': {
     'values': ['native', 'interpreted'],
     'default': 'native',
@@ -981,8 +1008,13 @@
   },
   'visibility': {
     'values': ['default', 'hidden'],
-    'default': VISIBILITY_GUESS,
-    'help': 'shared library symbol visibility (%s)' % VISIBILITY_GUESS
+    'guess': GuessVisibility,
+    'help': 'shared library symbol visibility'
+  },
+  'strictaliasing': {
+    'values': ['default', 'off'],
+    'guess': GuessStrictAliasing,
+    'help': 'assume strict aliasing while optimizing'
   },
   'pgo': {
     'values': ['off', 'instrument', 'optimize'],
@@ -1001,6 +1033,22 @@
   }
 }
 
+ALL_OPTIONS = dict(PLATFORM_OPTIONS, **SIMPLE_OPTIONS)
+
+
+def AddOptions(options, result):
+  guess_env = Environment(options=result)
+  for (name, option) in options.iteritems():
+    if 'guess' in option:
+      # Option has a guess function
+      guess = option.get('guess')
+      default = guess(guess_env)
+    else:
+      # Option has a fixed default
+      default = option.get('default')
+    help = '%s (%s)' % (option.get('help'), ", ".join(option['values']))
+    result.Add(name, help, default)
+
 
 def GetOptions():
   result = Options()
@@ -1009,12 +1057,23 @@
   result.Add('cache', 'directory to use for scons build cache', '')
   result.Add('env', 'override environment settings (NAME0:value0,NAME1:value1,...)', '')
   result.Add('importenv', 'import environment settings (NAME0,NAME1,...)', '')
-  for (name, option) in SIMPLE_OPTIONS.iteritems():
-    help = '%s (%s)' % (name, ", ".join(option['values']))
-    result.Add(name, help, option.get('default'))
+  AddOptions(PLATFORM_OPTIONS, result)
+  AddOptions(SIMPLE_OPTIONS, result)
   return result
 
 
+def GetTools(opts):
+  env = Environment(options=opts)
+  os = env['os']
+  toolchain = env['toolchain']
+  if os == 'win32' and toolchain == 'gcc':
+    return ['mingw']
+  elif os == 'win32' and toolchain == 'msvc':
+    return ['msvc', 'mslink', 'mslib', 'msvs']
+  else:
+    return ['default']
+
+
 def GetVersionComponents():
   MAJOR_VERSION_PATTERN = re.compile(r"#define\s+MAJOR_VERSION\s+(.*)")
   MINOR_VERSION_PATTERN = re.compile(r"#define\s+MINOR_VERSION\s+(.*)")
@@ -1094,8 +1153,8 @@
     print env['arch']
     print env['simulator']
     Abort("Option unalignedaccesses only supported for the ARM architecture.")
-  for (name, option) in SIMPLE_OPTIONS.iteritems():
-    if (not option.get('default')) and (name not in ARGUMENTS):
+  for (name, option) in ALL_OPTIONS.iteritems():
+    if (not name in env):
       message = ("A value for option %s must be specified (%s)." %
           (name, ", ".join(option['values'])))
       Abort(message)
@@ -1225,9 +1284,9 @@
   return overrides
 
 
-def BuildSpecific(env, mode, env_overrides):
+def BuildSpecific(env, mode, env_overrides, tools):
   options = {'mode': mode}
-  for option in SIMPLE_OPTIONS:
+  for option in ALL_OPTIONS:
     options[option] = env[option]
   PostprocessOptions(options, env['os'])
 
@@ -1281,7 +1340,7 @@
   (object_files, shell_files, mksnapshot, preparser_files) = env.SConscript(
     join('src', 'SConscript'),
     build_dir=join('obj', target_id),
-    exports='context',
+    exports='context tools',
     duplicate=False
   )
 
@@ -1308,21 +1367,21 @@
   context.library_targets.append(library)
   context.library_targets.append(preparser_library)
 
-  d8_env = Environment()
+  d8_env = Environment(tools=tools)
   d8_env.Replace(**context.flags['d8'])
   context.ApplyEnvOverrides(d8_env)
   shell = d8_env.Program('d8' + suffix, object_files + shell_files)
   context.d8_targets.append(shell)
 
   for sample in context.samples:
-    sample_env = Environment()
+    sample_env = Environment(tools=tools)
     sample_env.Replace(**context.flags['sample'])
     sample_env.Prepend(LIBS=[library_name])
     context.ApplyEnvOverrides(sample_env)
     sample_object = sample_env.SConscript(
       join('samples', 'SConscript'),
       build_dir=join('obj', 'sample', sample, target_id),
-      exports='sample context',
+      exports='sample context tools',
       duplicate=False
     )
     sample_name = sample + suffix
@@ -1335,7 +1394,7 @@
   cctest_program = cctest_env.SConscript(
     join('test', 'cctest', 'SConscript'),
     build_dir=join('obj', 'test', target_id),
-    exports='context object_files',
+    exports='context object_files tools',
     duplicate=False
   )
   context.cctest_targets.append(cctest_program)
@@ -1350,7 +1409,7 @@
     exports='context',
     duplicate=False
   )
-  preparser_name = join('obj', 'preparser', target_id, 'preparser' + suffix)
+  preparser_name = join('obj', 'preparser', target_id, 'preparser')
   preparser_program = preparser_env.Program(preparser_name, preparser_object);
   preparser_env.Depends(preparser_program, preparser_library)
   context.preparser_targets.append(preparser_program)
@@ -1360,7 +1419,9 @@
 
 def Build():
   opts = GetOptions()
-  env = Environment(options=opts)
+  tools = GetTools(opts)
+  env = Environment(options=opts, tools=tools)
+
   Help(opts.GenerateHelpText(env))
   VerifyOptions(env)
   env_overrides = ParseEnvOverrides(env['env'], env['importenv'])
@@ -1375,7 +1436,7 @@
   d8s = []
   modes = SplitList(env['mode'])
   for mode in modes:
-    context = BuildSpecific(env.Copy(), mode, env_overrides)
+    context = BuildSpecific(env.Copy(), mode, env_overrides, tools)
     libraries += context.library_targets
     mksnapshots += context.mksnapshot_targets
     cctests += context.cctest_targets